Index: composer.postload.js |
=================================================================== |
--- a/composer.postload.js |
+++ b/composer.postload.js |
@@ -474,18 +474,21 @@ |
let overlays = document.getElementsByClassName("__adblockplus__overlay"); |
while (overlays.length > 0) |
overlays[0].parentNode.removeChild(overlays[0]); |
ext.onExtensionUnloaded.removeListener(deactivateBlockElement); |
} |
-if (document instanceof HTMLDocument) |
+function initializeComposer() |
{ |
+ if (typeof ext == "undefined") |
+ return false; |
+ |
// Use a contextmenu handler to save the last element the user right-clicked |
// on. To make things easier, we actually save the DOM event. We have to do |
// this because the contextMenu API only provides a URL, not the actual DOM |
// element. |
// We also need to make sure that the previous right click event, |
// if there is one, is removed. We don't know which frame it is in so we must |
// send a message to the other frames to clear their old right click events. |
document.addEventListener("contextmenu", event => |
@@ -497,19 +500,19 @@ |
type: "forward", |
payload: |
{ |
type: "composer.content.clearPreviousRightClickEvent" |
} |
}); |
}, true); |
- ext.onMessage.addListener((msg, sender, sendResponse) => |
+ ext.onMessage.addListener((message, sender, sendResponse) => |
Manish Jethani
2017/10/17 16:43:16
Unrelated renaming.
|
{ |
- switch (msg.type) |
+ switch (message.type) |
{ |
case "composer.content.getState": |
if (window == window.top) |
{ |
sendResponse({ |
active: currentlyPickingElement || blockelementPopupId != null |
}); |
} |
@@ -529,17 +532,17 @@ |
{ |
currentElement = element; |
elementPicked(event); |
} |
}); |
} |
break; |
case "composer.content.finished": |
- if (currentElement && msg.remove) |
+ if (currentElement && message.remove) |
{ |
// Hide the selected element itself if an added blocking |
// filter is causing it to collapse. Note that this |
// behavior is incomplete, but the best we can do here, |
// e.g. if an added blocking filter matches other elements, |
// the effect won't be visible until the page is is reloaded. |
checkCollapse(currentElement.prisoner || currentElement); |
@@ -550,30 +553,43 @@ |
break; |
case "composer.content.clearPreviousRightClickEvent": |
if (!lastRightClickEventIsMostRecent) |
lastRightClickEvent = null; |
lastRightClickEventIsMostRecent = false; |
break; |
case "composer.content.dialogOpened": |
if (window == window.top) |
- blockelementPopupId = msg.popupId; |
+ blockelementPopupId = message.popupId; |
break; |
case "composer.content.dialogClosed": |
// The onRemoved hook for the popup can create a race condition, so we |
// to be careful here. (This is not perfect, but best we can do.) |
- if (window == window.top && blockelementPopupId == msg.popupId) |
+ if (window == window.top && blockelementPopupId == message.popupId) |
{ |
browser.runtime.sendMessage({ |
type: "forward", |
payload: |
{ |
type: "composer.content.finished" |
} |
}); |
} |
break; |
} |
}); |
if (window == window.top) |
browser.runtime.sendMessage({type: "composer.ready"}); |
+ |
+ return true; |
} |
+ |
+if (document instanceof HTMLDocument) |
+{ |
+ // There's a bug in Firefox that causes document_end content scripts to run |
+ // before document_start content scripts on extension startup. In this case |
+ // the ext object is undefined, we fail to initialize, and initializeComposer |
+ // returns false. As a workaround, try again after a timeout. |
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1395287 |
+ if (!initializeComposer()) |
+ setTimeout(initializeComposer, 2000); |
Manish Jethani
2017/10/17 16:43:16
Two seconds is probably fine.
|
+} |