mirror of
https://github.com/zen-browser/components.git
synced 2025-07-07 23:49:58 +02:00
Refactor ZenGlanceManager and ZenThemesImporter classes
This commit is contained in:
parent
e782d724cd
commit
01905fa4e4
5 changed files with 174 additions and 0 deletions
15
src/ZenActorsManager.mjs
Normal file
15
src/ZenActorsManager.mjs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
// Utility to register JSWindowActors
|
||||||
|
var gZenActorsManager = {
|
||||||
|
_actors: new Set(),
|
||||||
|
|
||||||
|
addJSWindowActor(...args) {
|
||||||
|
if (this._actors.has(args[0])) {
|
||||||
|
// Actor already registered, nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChromeUtils.registerWindowActor(...args);
|
||||||
|
this._actors.add(args[0]);
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
{
|
||||||
|
function registerWindowActors() {
|
||||||
|
// TODO: Only if the pref is enabled
|
||||||
|
gZenActorsManager.addJSWindowActor("ZenGlance", {
|
||||||
|
parent: {
|
||||||
|
esModuleURI: "chrome://browser/content/zen-components/actors/ZenGlanceParent.sys.mjs",
|
||||||
|
},
|
||||||
|
child: {
|
||||||
|
esModuleURI: "chrome://browser/content/zen-components/actors/ZenGlanceChild.sys.mjs",
|
||||||
|
events: {
|
||||||
|
DOMContentLoaded: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
registerWindowActors();
|
||||||
|
}
|
|
@ -304,3 +304,17 @@ var gZenThemesImporter = new (class {
|
||||||
await gZenStylesheetManager.writeStylesheet(this.styleSheetPath, themes);
|
await gZenStylesheetManager.writeStylesheet(this.styleSheetPath, themes);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
gZenActorsManager.addJSWindowActor("ZenThemeMarketplace", {
|
||||||
|
parent: {
|
||||||
|
esModuleURI: "chrome://browser/content/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs",
|
||||||
|
},
|
||||||
|
child: {
|
||||||
|
esModuleURI: "chrome://browser/content/zen-components/actors/ZenThemeMarketplaceChild.sys.mjs",
|
||||||
|
events: {
|
||||||
|
DOMContentLoaded: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
matches: ["https://*.zen-browser.app/*", "about:preferences"],
|
||||||
|
allFrames: true,
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
export class ZenGlanceChild extends JSWindowActorChild {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.mouseUpListener = this.handleMouseUp.bind(this);
|
||||||
|
this.mouseDownListener = this.handleMouseDown.bind(this);
|
||||||
|
this.clickListener = this.handleClick.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleEvent(event) {
|
||||||
|
switch (event.type) {
|
||||||
|
case 'DOMContentLoaded':
|
||||||
|
await this.initiateGlance();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getActivationMethod() {
|
||||||
|
if (this._activationMethod === undefined) {
|
||||||
|
this._activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod');
|
||||||
|
}
|
||||||
|
return this._activationMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHoverActivationDelay() {
|
||||||
|
if (this._hoverActivationDelay === undefined) {
|
||||||
|
this._hoverActivationDelay = await this.sendQuery('ZenGlance:GetHoverActivationDelay');
|
||||||
|
}
|
||||||
|
return this._hoverActivationDelay;
|
||||||
|
}
|
||||||
|
|
||||||
|
async receiveMessage(message) {
|
||||||
|
switch (message.name) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async initiateGlance() {
|
||||||
|
this.mouseIsDown = false;
|
||||||
|
const activationMethod = await this.getActivationMethod();
|
||||||
|
if (activationMethod === 'hover') {
|
||||||
|
this.contentWindow.addEventListener('mousedown', this.mouseDownListener);
|
||||||
|
this.contentWindow.addEventListener('mouseup', this.mouseUpListener);
|
||||||
|
|
||||||
|
this.contentWindow.document.removeEventListener('click', this.clickListener);
|
||||||
|
} else if (activationMethod === 'ctrl' || activationMethod === 'alt' || activationMethod === 'shift') {
|
||||||
|
this.contentWindow.document.addEventListener('click', this.clickListener);
|
||||||
|
|
||||||
|
this.contentWindow.removeEventListener('mousedown', this.mouseDownListener);
|
||||||
|
this.contentWindow.removeEventListener('mouseup', this.mouseUpListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ensureOnlyKeyModifiers(event) {
|
||||||
|
return !(event.ctrlKey ^ event.altKey ^ event.shiftKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
openGlance(url) {
|
||||||
|
this.sendAsyncMessage('ZenGlance:OpenGlance', { url });
|
||||||
|
}
|
||||||
|
|
||||||
|
handleMouseUp(event) {
|
||||||
|
this.mouseIsDown = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleMouseDown(event) {
|
||||||
|
if (event.target.tagName !== 'A') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.mouseIsDown = true;
|
||||||
|
const hoverActivationDelay = await this.getHoverActivationDelay();
|
||||||
|
setTimeout(() => {
|
||||||
|
if (this.mouseIsDown) {
|
||||||
|
this.openGlance(event.target.href);
|
||||||
|
}
|
||||||
|
}, hoverActivationDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleClick(event) {
|
||||||
|
if (this.ensureOnlyKeyModifiers(event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const activationMethod = this._activationMethod;
|
||||||
|
if (activationMethod === 'ctrl' && !event.ctrlKey) {
|
||||||
|
return;
|
||||||
|
} else if (activationMethod === 'alt' && !event.altKey) {
|
||||||
|
return;
|
||||||
|
} else if (activationMethod === 'shift' && !event.shiftKey) {
|
||||||
|
return;
|
||||||
|
} else if (activationMethod === 'hover' || typeof activationMethod === 'undefined') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// get closest A element
|
||||||
|
const target = event.target.closest('A');
|
||||||
|
if (target) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
this.openGlance(target.href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
export class ZenGlanceParent extends JSWindowActorParent {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
async receiveMessage(message) {
|
||||||
|
switch (message.name) {
|
||||||
|
case 'ZenGlance:GetActivationMethod': {
|
||||||
|
return Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl');
|
||||||
|
}
|
||||||
|
case 'ZenGlance:GetHoverActivationDelay': {
|
||||||
|
return Services.prefs.getIntPref('zen.glance.hold-duration', 500);
|
||||||
|
}
|
||||||
|
case 'ZenGlance:OpenGlance': {
|
||||||
|
this.openGlance();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openGlance() {
|
||||||
|
console.log('Opening glance');
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue