$OpenBSD$ index 62ab5c4..1384e66 100644 --- browser/base/content/browser.js.orig Fri Feb 20 15:40:36 2015 +++ browser/base/content/browser.js Fri Feb 20 15:40:36 2015 @@ -159,6 +159,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "TabCrashReporter", #endif let gInitialPages = [ + "about:tor", "about:blank", "about:newtab", "about:home", @@ -809,6 +810,7 @@ var gBrowserInit = { gHistorySwipeAnimation.init(); if (window.opener && !window.opener.closed && + window.opener.document.documentURIObject.schemeIs("chrome") && PrivateBrowsingUtils.isWindowPrivate(window) == PrivateBrowsingUtils.isWindowPrivate(window.opener)) { let openerSidebarBox = window.opener.document.getElementById("sidebar-box"); // If the opener had a sidebar, open the same sidebar in our window. @@ -1050,6 +1052,7 @@ var gBrowserInit = { BrowserOffline.init(); OfflineApps.init(); IndexedDBPromptHelper.init(); + CanvasPermissionPromptHelper.init(); gFormSubmitObserver.init(); gRemoteTabsUI.init(); @@ -1335,6 +1338,7 @@ var gBrowserInit = { BrowserOffline.uninit(); OfflineApps.uninit(); IndexedDBPromptHelper.uninit(); + CanvasPermissionPromptHelper.uninit(); LightweightThemeListener.uninit(); PanelUI.uninit(); } @@ -5817,6 +5821,119 @@ var IndexedDBPromptHelper = { } }; +var CanvasPermissionPromptHelper = { + _permissionsPrompt: "canvas-permissions-prompt", + _notificationIcon: "canvas-notification-icon", + + init: + function CanvasPermissionPromptHelper_init() { + if (document.styleSheets && (document.styleSheets.length > 0)) try { + let ruleText = "panel[popupid=canvas-permissions-prompt] description { white-space: pre-wrap; }"; + let sheet = document.styleSheets[0]; + sheet.insertRule(ruleText, sheet.cssRules.length); + } catch (e) {}; + + Services.obs.addObserver(this, this._permissionsPrompt, false); + }, + + uninit: + function CanvasPermissionPromptHelper_uninit() { + Services.obs.removeObserver(this, this._permissionsPrompt, false); + }, + + // aSubject is an nsIDOMWindow. + // aData is an URL string. + observe: + function CanvasPermissionPromptHelper_observe(aSubject, aTopic, aData) { + if ((aTopic != this._permissionsPrompt) || !aData) + throw new Error("Unexpected topic or missing URL"); + + var uri = makeURI(aData); + var contentWindow = aSubject.QueryInterface(Ci.nsIDOMWindow); + var contentDocument = contentWindow.document; + var browserWindow = + OfflineApps._getBrowserWindowForContentWindow(contentWindow); + + if (browserWindow != window) { + // Must belong to some other window. + return; + } + + // If canvas prompt is already displayed, just return. This is OK (and + // more efficient) since this permission is associated with the top + // browser's URL. + if (PopupNotifications.getNotification(aTopic, browser)) + return; + + var bundleSvc = Cc["@mozilla.org/intl/stringbundle;1"]. + getService(Ci.nsIStringBundleService); + var torBtnBundle; + try { + torBtnBundle = bundleSvc.createBundle( + "chrome://torbutton/locale/torbutton.properties"); + } catch (e) {} + + var message = getLocalizedString("canvas.siteprompt", [ uri.asciiHost ]); + + var mainAction = { + label: getLocalizedString("canvas.notNow"), + accessKey: getLocalizedString("canvas.notNowAccessKey"), + callback: function() { + return null; + } + }; + + var secondaryActions = [ + { + label: getLocalizedString("canvas.never"), + accessKey: getLocalizedString("canvas.neverAccessKey"), + callback: function() { + setCanvasPermission(uri, Ci.nsIPermissionManager.DENY_ACTION); + } + }, + { + label: getLocalizedString("canvas.allow"), + accessKey: getLocalizedString("canvas.allowAccessKey"), + callback: function() { + setCanvasPermission(uri, Ci.nsIPermissionManager.ALLOW_ACTION); + } + } + ]; + + // Since we have a process in place to perform localization for the + // Torbutton extension, get our strings from the extension if possible. + function getLocalizedString(aID, aParams) { + var s; + if (torBtnBundle) try { + if (aParams) + s = torBtnBundle.formatStringFromName(aID, aParams, aParams.length); + else + s = torBtnBundle.GetStringFromName(aID); + } catch (e) {} + + if (!s) { + if (aParams) + s = gNavigatorBundle.getFormattedString(aID, aParams); + else + s = gNavigatorBundle.getString(aID); + } + + return s; + } + + function setCanvasPermission(aURI, aPerm) { + Services.perms.add(aURI, "canvas/extractData", aPerm, + Ci.nsIPermissionManager.EXPIRE_NEVER); + } + + var browser = OfflineApps._getBrowserForContentWindow(browserWindow, + contentWindow); + notification = PopupNotifications.show(browser, aTopic, message, + this._notificationIcon, mainAction, + secondaryActions, null); + } +}; + function WindowIsClosing() { if (TabView.isVisible()) {