Bug 1365105 - Clear all find highlights, in the PDF Viewer, when the findbar is closed. r=bdahl,paolo
In order to support this, a new "findbarclose" event (mirroring the pre-existing "findbaropen" one) was added to the `MozFindbar.close` method in the findbar.js file.
--- a/browser/base/content/test/general/browser_findbarClose.js
+++ b/browser/base/content/test/general/browser_findbarClose.js
@@ -22,12 +22,15 @@ add_task(async function findbar_test() {
let awaitLoad = ContentTaskUtils.waitForEvent(iframe, "load", false);
iframe.src = "https://example.org/";
await awaitLoad;
});
ok(!gFindBar.hidden, "the Find bar isn't hidden after the location of a " +
"subdocument changes");
+ let findBarClosePromise = promiseWaitForEvent(gBrowser, "findbarclose");
gFindBar.close();
+ await findBarClosePromise;
+
gBrowser.removeTab(newTab);
});
--- a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
+++ b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
@@ -187,50 +187,56 @@ var PdfjsChromeUtils = {
};
if (result.total > result.limit) {
result.total = -1;
}
return result;
},
handleEvent(aEvent) {
+ const type = aEvent.type;
// Handle the tab find initialized event specially:
- if (aEvent.type == "TabFindInitialized") {
+ if (type == "TabFindInitialized") {
let browser = aEvent.target.linkedBrowser;
this._hookupEventListeners(browser);
- aEvent.target.removeEventListener(aEvent.type, this);
+ aEvent.target.removeEventListener(type, this);
return;
}
// To avoid forwarding the message as a CPOW, create a structured cloneable
// version of the event for both performance, and ease of usage, reasons.
- let type = aEvent.type;
- let detail = {
- query: aEvent.detail.query,
- caseSensitive: aEvent.detail.caseSensitive,
- entireWord: aEvent.detail.entireWord,
- highlightAll: aEvent.detail.highlightAll,
- findPrevious: aEvent.detail.findPrevious,
- };
+ let detail = null;
+ if (type !== "findbarclose") {
+ detail = {
+ query: aEvent.detail.query,
+ caseSensitive: aEvent.detail.caseSensitive,
+ entireWord: aEvent.detail.entireWord,
+ highlightAll: aEvent.detail.highlightAll,
+ findPrevious: aEvent.detail.findPrevious,
+ };
+ }
let browser = aEvent.currentTarget.browser;
if (!this._browsers.has(browser)) {
throw new Error("FindEventManager was not bound " +
"for the current browser.");
}
// Only forward the events if the current browser is a registered browser.
let mm = browser.messageManager;
mm.sendAsyncMessage("PDFJS:Child:handleEvent", { type, detail });
aEvent.preventDefault();
},
- _types: ["find",
- "findagain",
- "findhighlightallchange",
- "findcasesensitivitychange"],
+ _types: [
+ "find",
+ "findagain",
+ "findhighlightallchange",
+ "findcasesensitivitychange",
+ "findbarclose",
+ ],
_addEventListener(aMsg) {
let browser = aMsg.target;
if (this._browsers.has(browser)) {
throw new Error("FindEventManager was bound 2nd time " +
"without unbinding it first.");
}
--- a/toolkit/content/widgets/findbar.js
+++ b/toolkit/content/widgets/findbar.js
@@ -663,16 +663,20 @@ class MozFindbar extends XULElement {
close(aNoAnim) {
if (this.hidden)
return;
if (aNoAnim)
this.setAttribute("noanim", true);
this.hidden = true;
+ let event = document.createEvent("Events");
+ event.initEvent("findbarclose", true, false);
+ this.dispatchEvent(event);
+
// 'focusContent()' iterates over all listeners in the chrome
// process, so we need to call it from here.
this.browser.finder.focusContent();
this.browser.finder.onFindbarClose();
this._cancelTimers();
this._updateBrowserWithState();