2014-06-25 05:12:07 +00:00
|
|
|
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
2014-03-14 18:45:53 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
2017-02-07 10:52:06 +00:00
|
|
|
/* eslint-env mozilla/frame-script */
|
2018-05-26 01:22:09 +00:00
|
|
|
/* eslint no-unused-vars: ["error", {args: "none"}] */
|
2017-08-24 22:24:00 +00:00
|
|
|
/* global sendAsyncMessage */
|
2017-02-07 10:52:06 +00:00
|
|
|
|
2018-01-29 23:20:18 +00:00
|
|
|
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
|
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
2018-08-11 22:27:12 +00:00
|
|
|
ChromeUtils.import("resource://gre/modules/ActorManagerChild.jsm");
|
|
|
|
|
|
|
|
ActorManagerChild.attach(this);
|
2014-03-14 18:45:53 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
ChromeUtils.defineModuleGetter(this, "AutoCompletePopup",
|
|
|
|
"resource://gre/modules/AutoCompletePopupContent.jsm");
|
2018-06-09 21:42:51 +00:00
|
|
|
ChromeUtils.defineModuleGetter(this, "AutoScrollController",
|
|
|
|
"resource://gre/modules/AutoScrollController.jsm");
|
2018-01-29 23:20:18 +00:00
|
|
|
ChromeUtils.defineModuleGetter(this, "FindContent",
|
2017-08-24 22:24:00 +00:00
|
|
|
"resource://gre/modules/FindContent.jsm");
|
2016-06-02 13:29:00 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "formFill",
|
|
|
|
"@mozilla.org/satchel/form-fill-controller;1",
|
|
|
|
"nsIFormFillController");
|
|
|
|
|
2018-07-10 18:57:55 +00:00
|
|
|
var global = this;
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyProxy(this, "PopupBlocking", () => {
|
|
|
|
let tmp = {};
|
|
|
|
ChromeUtils.import("resource://gre/modules/PopupBlocking.jsm", tmp);
|
|
|
|
return new tmp.PopupBlocking(global);
|
|
|
|
});
|
|
|
|
|
2018-07-29 19:36:45 +00:00
|
|
|
XPCOMUtils.defineLazyProxy(this, "ShieldFrameListener", () => {
|
|
|
|
let tmp = {};
|
|
|
|
ChromeUtils.import("resource://normandy-content/ShieldFrameListener.jsm", tmp);
|
|
|
|
return new tmp.ShieldFrameListener(global);
|
|
|
|
});
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyProxy(this, "UITourListener", () => {
|
|
|
|
let tmp = {};
|
|
|
|
ChromeUtils.import("resource:///modules/ContentUITour.jsm", tmp);
|
|
|
|
return new tmp.UITourListener(global);
|
|
|
|
});
|
|
|
|
|
2018-05-26 01:26:32 +00:00
|
|
|
XPCOMUtils.defineLazyProxy(this, "SelectionSourceContent",
|
|
|
|
"resource://gre/modules/SelectionSourceContent.jsm");
|
|
|
|
|
2018-07-08 03:15:45 +00:00
|
|
|
XPCOMUtils.defineLazyProxy(this, "WebChannelContent",
|
|
|
|
"resource://gre/modules/WebChannelContent.jsm");
|
|
|
|
|
2018-06-09 21:46:39 +00:00
|
|
|
XPCOMUtils.defineLazyProxy(this, "DateTimePickerContent", () => {
|
|
|
|
let tmp = {};
|
|
|
|
ChromeUtils.import("resource://gre/modules/DateTimePickerContent.jsm", tmp);
|
|
|
|
return new tmp.DateTimePickerContent(this);
|
|
|
|
});
|
|
|
|
|
2015-04-13 20:23:51 +00:00
|
|
|
// Lazily load the finder code
|
2016-11-11 23:22:34 +00:00
|
|
|
addMessageListener("Finder:Initialize", function() {
|
2018-01-29 23:20:18 +00:00
|
|
|
let {RemoteFinderListener} = ChromeUtils.import("resource://gre/modules/RemoteFinder.jsm", {});
|
2015-04-13 20:23:51 +00:00
|
|
|
new RemoteFinderListener(global);
|
|
|
|
});
|
|
|
|
|
2018-06-09 21:42:51 +00:00
|
|
|
var AutoScrollListener = {
|
|
|
|
handleEvent(event) {
|
|
|
|
if (event.isTrusted &
|
|
|
|
!event.defaultPrevented &&
|
|
|
|
event.button == 1) {
|
|
|
|
if (!this._controller) {
|
|
|
|
this._controller = new AutoScrollController(global);
|
|
|
|
}
|
|
|
|
this._controller.handleEvent(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Services.els.addSystemEventListener(global, "mousedown", AutoScrollListener, true);
|
|
|
|
|
2018-06-09 21:46:39 +00:00
|
|
|
addEventListener("MozOpenDateTimePicker", DateTimePickerContent);
|
|
|
|
|
2018-07-10 18:57:55 +00:00
|
|
|
addEventListener("DOMPopupBlocked", PopupBlocking, true);
|
2014-10-07 18:46:25 +00:00
|
|
|
|
2018-07-08 03:15:45 +00:00
|
|
|
addEventListener("WebChannelMessageToChrome", WebChannelContent,
|
|
|
|
true, true);
|
|
|
|
addMessageListener("WebChannelMessageToContent", WebChannelContent);
|
2015-07-04 19:00:41 +00:00
|
|
|
|
2017-07-20 07:11:25 +00:00
|
|
|
var UnselectedTabHoverObserver = {
|
|
|
|
init() {
|
|
|
|
addMessageListener("Browser:UnselectedTabHover", this);
|
|
|
|
addEventListener("UnselectedTabHover:Enable", this);
|
|
|
|
addEventListener("UnselectedTabHover:Disable", this);
|
2018-07-08 03:49:30 +00:00
|
|
|
this.init = null;
|
2017-07-20 07:11:25 +00:00
|
|
|
},
|
|
|
|
receiveMessage(message) {
|
|
|
|
Services.obs.notifyObservers(content.window, "unselected-tab-hover",
|
|
|
|
message.data.hovered);
|
|
|
|
},
|
|
|
|
handleEvent(event) {
|
|
|
|
sendAsyncMessage("UnselectedTabHover:Toggle",
|
|
|
|
{ enable: event.type == "UnselectedTabHover:Enable" });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
UnselectedTabHoverObserver.init();
|
|
|
|
|
2018-07-25 16:08:44 +00:00
|
|
|
|
|
|
|
var AudibleAutoplayObserver = {
|
|
|
|
init() {
|
|
|
|
addEventListener("AudibleAutoplayMediaOccurred", this);
|
|
|
|
},
|
|
|
|
handleEvent(event) {
|
|
|
|
sendAsyncMessage("AudibleAutoplayMediaOccurred");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
AudibleAutoplayObserver.init();
|
|
|
|
|
2015-08-10 19:15:11 +00:00
|
|
|
addMessageListener("Browser:PurgeSessionHistory", function BrowserPurgeHistory() {
|
|
|
|
let sessionHistory = docShell.QueryInterface(Ci.nsIWebNavigation).sessionHistory;
|
|
|
|
if (!sessionHistory) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// place the entry at current index at the end of the history list, so it won't get removed
|
|
|
|
if (sessionHistory.index < sessionHistory.count - 1) {
|
2018-02-01 22:17:00 +00:00
|
|
|
let legacy = sessionHistory.legacySHistory;
|
|
|
|
legacy.QueryInterface(Ci.nsISHistoryInternal);
|
|
|
|
let indexEntry = legacy.getEntryAtIndex(sessionHistory.index, false);
|
2018-02-28 17:51:33 +00:00
|
|
|
indexEntry.QueryInterface(Ci.nsISHEntry);
|
2018-02-01 22:17:00 +00:00
|
|
|
legacy.addEntry(indexEntry, true);
|
2015-08-10 19:15:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
let purge = sessionHistory.count;
|
|
|
|
if (global.content.location.href != "about:blank") {
|
|
|
|
--purge; // Don't remove the page the user's staring at from shistory
|
|
|
|
}
|
|
|
|
|
|
|
|
if (purge > 0) {
|
2018-02-01 22:17:00 +00:00
|
|
|
sessionHistory.legacySHistory.PurgeHistory(purge);
|
2015-08-10 19:15:11 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-05-26 01:26:32 +00:00
|
|
|
addMessageListener("ViewSource:GetSelection", SelectionSourceContent);
|
2016-03-21 10:22:16 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
let AutoComplete = {
|
2016-07-28 18:18:50 +00:00
|
|
|
_connected: false,
|
|
|
|
|
2016-12-29 23:34:54 +00:00
|
|
|
init() {
|
2018-07-10 18:57:47 +00:00
|
|
|
addEventListener("unload", this, {once: true});
|
|
|
|
addEventListener("DOMContentLoaded", this, {once: true});
|
2017-06-01 23:20:34 +00:00
|
|
|
// WebExtension browserAction is preloaded and does not receive DCL, wait
|
|
|
|
// on pageshow so we can hookup the formfill controller.
|
2018-07-10 18:57:47 +00:00
|
|
|
addEventListener("pageshow", this, {capture: true, once: true});
|
2016-07-28 18:18:50 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
XPCOMUtils.defineLazyProxy(this, "popup", () => new AutoCompletePopup(global),
|
|
|
|
{QueryInterface: null});
|
2018-07-08 03:49:30 +00:00
|
|
|
this.init = null;
|
2017-06-01 23:20:34 +00:00
|
|
|
},
|
|
|
|
|
Bug 1296638 - AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm need to have popupOpen be in sync. r=MattN
The opening of the AutoCompletePopup will always start from content, but closing the
popup can occur in the parent (for example, if the user switches focus from the browser),
or in content (the user hits Esc, for example, which tells the parent to close the popup).
This relationship between content and the popup has been true for a while, but the
patch in bug 1294502 didn't account for it. In particular, before this patch, it was
possible for AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm to get
out of sync on whether or not the popup is open.
Mainly, this is because the parent wasn't telling the content that the popup had
hidden if the hide was initialized by the parent. The other reason, was because
the popupOpen state in browser-content.js was being set immediately, instead
of waiting for the parent to report that the popup had indeed opened or closed.
MozReview-Commit-ID: CRkg49lP1Hd
--HG--
extra : rebase_source : 0a0383170fc78f8639713a5879ab18468fc0eef7
2016-09-17 16:44:04 +00:00
|
|
|
handleEvent(event) {
|
|
|
|
switch (event.type) {
|
2018-07-10 18:57:47 +00:00
|
|
|
case "DOMContentLoaded":
|
|
|
|
case "pageshow":
|
|
|
|
// We need to wait for a content viewer to be available
|
|
|
|
// before we can attach our AutoCompletePopup handler,
|
|
|
|
// since nsFormFillController assumes one will exist
|
|
|
|
// when we call attachToBrowser.
|
|
|
|
if (!this._connected) {
|
|
|
|
formFill.attachToBrowser(docShell, this.popup);
|
|
|
|
this._connected = true;
|
Bug 1296638 - AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm need to have popupOpen be in sync. r=MattN
The opening of the AutoCompletePopup will always start from content, but closing the
popup can occur in the parent (for example, if the user switches focus from the browser),
or in content (the user hits Esc, for example, which tells the parent to close the popup).
This relationship between content and the popup has been true for a while, but the
patch in bug 1294502 didn't account for it. In particular, before this patch, it was
possible for AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm to get
out of sync on whether or not the popup is open.
Mainly, this is because the parent wasn't telling the content that the popup had
hidden if the hide was initialized by the parent. The other reason, was because
the popupOpen state in browser-content.js was being set immediately, instead
of waiting for the parent to report that the popup had indeed opened or closed.
MozReview-Commit-ID: CRkg49lP1Hd
--HG--
extra : rebase_source : 0a0383170fc78f8639713a5879ab18468fc0eef7
2016-09-17 16:44:04 +00:00
|
|
|
}
|
2018-07-10 18:57:47 +00:00
|
|
|
break;
|
Bug 1296638 - AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm need to have popupOpen be in sync. r=MattN
The opening of the AutoCompletePopup will always start from content, but closing the
popup can occur in the parent (for example, if the user switches focus from the browser),
or in content (the user hits Esc, for example, which tells the parent to close the popup).
This relationship between content and the popup has been true for a while, but the
patch in bug 1294502 didn't account for it. In particular, before this patch, it was
possible for AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm to get
out of sync on whether or not the popup is open.
Mainly, this is because the parent wasn't telling the content that the popup had
hidden if the hide was initialized by the parent. The other reason, was because
the popupOpen state in browser-content.js was being set immediately, instead
of waiting for the parent to report that the popup had indeed opened or closed.
MozReview-Commit-ID: CRkg49lP1Hd
--HG--
extra : rebase_source : 0a0383170fc78f8639713a5879ab18468fc0eef7
2016-09-17 16:44:04 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
case "unload":
|
|
|
|
if (this._connected) {
|
|
|
|
formFill.detachFromBrowser(docShell);
|
|
|
|
this._connected = false;
|
2016-08-19 21:15:56 +00:00
|
|
|
}
|
2018-07-10 18:57:47 +00:00
|
|
|
break;
|
Bug 1296638 - AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm need to have popupOpen be in sync. r=MattN
The opening of the AutoCompletePopup will always start from content, but closing the
popup can occur in the parent (for example, if the user switches focus from the browser),
or in content (the user hits Esc, for example, which tells the parent to close the popup).
This relationship between content and the popup has been true for a while, but the
patch in bug 1294502 didn't account for it. In particular, before this patch, it was
possible for AutoCompletePopup in browser-content.js and AutoCompletePopup.jsm to get
out of sync on whether or not the popup is open.
Mainly, this is because the parent wasn't telling the content that the popup had
hidden if the hide was initialized by the parent. The other reason, was because
the popupOpen state in browser-content.js was being set immediately, instead
of waiting for the parent to report that the popup had indeed opened or closed.
MozReview-Commit-ID: CRkg49lP1Hd
--HG--
extra : rebase_source : 0a0383170fc78f8639713a5879ab18468fc0eef7
2016-09-17 16:44:04 +00:00
|
|
|
}
|
2016-07-28 18:18:50 +00:00
|
|
|
},
|
2017-10-15 18:50:30 +00:00
|
|
|
};
|
2016-07-28 18:18:50 +00:00
|
|
|
|
2018-07-10 18:57:47 +00:00
|
|
|
AutoComplete.init();
|
2016-10-06 04:17:00 +00:00
|
|
|
|
2017-08-24 22:24:00 +00:00
|
|
|
let ExtFind = {
|
|
|
|
init() {
|
|
|
|
addMessageListener("ext-Finder:CollectResults", this);
|
|
|
|
addMessageListener("ext-Finder:HighlightResults", this);
|
|
|
|
addMessageListener("ext-Finder:clearHighlighting", this);
|
2018-07-08 03:49:30 +00:00
|
|
|
this.init = null;
|
2017-08-24 22:24:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
_findContent: null,
|
|
|
|
|
|
|
|
async receiveMessage(message) {
|
|
|
|
if (!this._findContent) {
|
|
|
|
this._findContent = new FindContent(docShell);
|
|
|
|
}
|
|
|
|
|
|
|
|
let data;
|
|
|
|
switch (message.name) {
|
|
|
|
case "ext-Finder:CollectResults":
|
|
|
|
this.finderInited = true;
|
|
|
|
data = await this._findContent.findRanges(message.data);
|
|
|
|
sendAsyncMessage("ext-Finder:CollectResultsFinished", data);
|
|
|
|
break;
|
|
|
|
case "ext-Finder:HighlightResults":
|
|
|
|
data = this._findContent.highlightResults(message.data);
|
|
|
|
sendAsyncMessage("ext-Finder:HighlightResultsFinished", data);
|
|
|
|
break;
|
|
|
|
case "ext-Finder:clearHighlighting":
|
|
|
|
this._findContent.highlighter.highlight(false);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
2017-10-15 18:50:30 +00:00
|
|
|
};
|
2017-08-24 22:24:00 +00:00
|
|
|
|
|
|
|
ExtFind.init();
|
2018-07-29 19:36:45 +00:00
|
|
|
|
|
|
|
addEventListener("ShieldPageEvent", ShieldFrameListener, false, true);
|
|
|
|
|
|
|
|
addEventListener("mozUITour", UITourListener, false, true);
|