diff options
Diffstat (limited to 'browser/base/content/browser-webrtc.js')
-rw-r--r-- | browser/base/content/browser-webrtc.js | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/browser/base/content/browser-webrtc.js b/browser/base/content/browser-webrtc.js new file mode 100644 index 0000000000..889769f292 --- /dev/null +++ b/browser/base/content/browser-webrtc.js @@ -0,0 +1,140 @@ +/* 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/. */ + +/* eslint-env mozilla/browser-window */ + +/** + * Utility object to handle WebRTC shared tab warnings. + */ +var gSharedTabWarning = { + /** + * Called externally by gBrowser to determine if we're + * in a state such that we'd want to cancel the tab switch + * and show the tab switch warning panel instead. + * + * @param tab (<tab>) + * The tab being switched to. + * @returns boolean + * True if the panel will be shown, and the tab switch should + * be cancelled. + */ + willShowSharedTabWarning(tab) { + if (!this._sharedTabWarningEnabled) { + return false; + } + + let shareState = webrtcUI.getWindowShareState(window); + if (shareState == webrtcUI.SHARING_NONE) { + return false; + } + + if (!webrtcUI.shouldShowSharedTabWarning(tab)) { + return false; + } + + this._createSharedTabWarningIfNeeded(); + let panel = document.getElementById("sharing-tabs-warning-panel"); + let hbox = panel.firstChild; + + if (shareState == webrtcUI.SHARING_SCREEN) { + hbox.setAttribute("type", "screen"); + panel.setAttribute( + "aria-labelledby", + "sharing-screen-warning-panel-header-span" + ); + } else { + hbox.setAttribute("type", "window"); + panel.setAttribute( + "aria-labelledby", + "sharing-window-warning-panel-header-span" + ); + } + + let allowForSessionCheckbox = document.getElementById( + "sharing-warning-disable-for-session" + ); + allowForSessionCheckbox.checked = false; + + panel.openPopup(tab, "bottomleft topleft", 0, 0); + + return true; + }, + + /** + * Called by the tab switch warning panel after it has + * shown. + */ + sharedTabWarningShown() { + let allowButton = document.getElementById("sharing-warning-proceed-to-tab"); + allowButton.focus(); + }, + + /** + * Called by the button in the tab switch warning panel + * to allow the switch to occur. + */ + allowSharedTabSwitch() { + let panel = document.getElementById("sharing-tabs-warning-panel"); + let allowForSession = document.getElementById( + "sharing-warning-disable-for-session" + ).checked; + + let tab = panel.anchorNode; + webrtcUI.allowSharedTabSwitch(tab, allowForSession); + this._hideSharedTabWarning(); + }, + + /** + * Called externally by gBrowser when a tab has been added. + * When this occurs, if we're sharing this window, we notify + * the webrtcUI module to exempt the new tab from the tab switch + * warning, since the user opened it while they were already + * sharing. + * + * @param tab (<tab>) + * The tab being opened. + */ + tabAdded(tab) { + if (this._sharedTabWarningEnabled) { + let shareState = webrtcUI.getWindowShareState(window); + if (shareState != webrtcUI.SHARING_NONE) { + webrtcUI.tabAddedWhileSharing(tab); + } + } + }, + + get _sharedTabWarningEnabled() { + delete this._sharedTabWarningEnabled; + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_sharedTabWarningEnabled", + "privacy.webrtc.sharedTabWarning" + ); + return this._sharedTabWarningEnabled; + }, + + /** + * Internal method for hiding the tab switch warning panel. + */ + _hideSharedTabWarning() { + let panel = document.getElementById("sharing-tabs-warning-panel"); + if (panel) { + panel.hidePopup(); + } + }, + + /** + * Inserts the tab switch warning panel into the DOM + * if it hasn't been done already yet. + */ + _createSharedTabWarningIfNeeded() { + // Lazy load the panel the first time we need to display it. + if (!document.getElementById("sharing-tabs-warning-panel")) { + let template = document.getElementById( + "sharing-tabs-warning-panel-template" + ); + template.replaceWith(template.content); + } + }, +}; |