Commit 2055b99c authored by Kathleen Brade's avatar Kathleen Brade Committed by Mike Perry
Browse files

Add canvas image extraction prompt.

parent 3987cc1f
Loading
Loading
Loading
Loading
+102 −0
Original line number Diff line number Diff line
@@ -1027,6 +1027,7 @@ var gBrowserInit = {
    BrowserOffline.init();
    OfflineApps.init();
    IndexedDBPromptHelper.init();
    CanvasPermissionPromptHelper.init();
    gFormSubmitObserver.init();
    SocialUI.init();
    AddonManager.addAddonListener(AddonsMgrListener);
@@ -1389,6 +1390,7 @@ var gBrowserInit = {
      BrowserOffline.uninit();
      OfflineApps.uninit();
      IndexedDBPromptHelper.uninit();
      CanvasPermissionPromptHelper.uninit();
      AddonManager.removeAddonListener(AddonsMgrListener);
      SocialUI.uninit();
    }
@@ -6026,6 +6028,106 @@ var IndexedDBPromptHelper = {
  }
};

var CanvasPermissionPromptHelper = {
  _permissionsPrompt: "canvas-permissions-prompt",
  _notificationIcon: "canvas-notification-icon",

  init:
  function CanvasPermissionPromptHelper_init() {
    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.allow"),
      accessKey: getLocalizedString("canvas.allowAccessKey"),
      callback: function() {
          setCanvasPermission(uri, Ci.nsIPermissionManager.ALLOW_ACTION);
      }
    };

    var secondaryActions = [
      {
        label: getLocalizedString("canvas.never"),
        accessKey: getLocalizedString("canvas.neverAccessKey"),
        callback: function() {
          setCanvasPermission(uri, Ci.nsIPermissionManager.DENY_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()) {
+1 −0
Original line number Diff line number Diff line
@@ -442,6 +442,7 @@
            <image id="identity-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="geo-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="addons-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="canvas-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="indexedDB-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="password-notification-icon" class="notification-anchor-icon" role="button"/>
            <image id="webapps-notification-icon" class="notification-anchor-icon" role="button"/>
+7 −0
Original line number Diff line number Diff line
@@ -249,6 +249,13 @@ offlineApps.usage=This website (%S) is now storing more than %SMB of data on you
offlineApps.manageUsage=Show settings
offlineApps.manageUsageAccessKey=S

# Canvas permission prompt
canvas.siteprompt=This website (%S) attempted to access image data on a canvas. Since canvas image data can be used to discover information about your computer, blank image data was returned this time.
canvas.allow=Allow in the Future
canvas.allowAccessKey=A
canvas.never=Never for This Site
canvas.neverAccessKey=e

# LOCALIZATION NOTE (indexedDB.usage): %1$S is the website host name
# %2$S a number of megabytes.
indexedDB.usage=This website (%1$S) is attempting to store more than %2$S MB of data on your computer for offline use.
+2 −0
Original line number Diff line number Diff line
@@ -1207,6 +1207,7 @@ toolbar[iconsize="small"] #webrtc-status-button {
  list-style-image: url("moz-icon://stock/gtk-cancel?size=menu");
}

.popup-notification-icon[popupid="canvas-permissions-prompt"],
.popup-notification-icon[popupid="indexedDB-permissions-prompt"],
.popup-notification-icon[popupid="indexedDB-quota-prompt"],
.popup-notification-icon[popupid*="offline-app-requested"],
@@ -1290,6 +1291,7 @@ toolbar[iconsize="small"] #webrtc-status-button {
  list-style-image: url(chrome://mozapps/skin/extensions/extensionGeneric-16.png);
}

#canvas-notification-icon,
.indexedDB-notification-icon,
#indexedDB-notification-icon {
  list-style-image: url(chrome://global/skin/icons/question-16.png);
+2 −0
Original line number Diff line number Diff line
@@ -3103,6 +3103,7 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
  -moz-margin-start: 0; /* override default label margin to match description margin */
}

#canvas-notification-icon,
.indexedDB-notification-icon,
#indexedDB-notification-icon {
  list-style-image: url(chrome://global/skin/icons/question-16.png);
@@ -3374,6 +3375,7 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
  -moz-image-region: rect(0px, 48px, 16px, 32px);
}

.popup-notification-icon[popupid="canvas-permissions-prompt"],
.popup-notification-icon[popupid="indexedDB-permissions-prompt"],
.popup-notification-icon[popupid="indexedDB-quota-prompt"],
.popup-notification-icon[popupid*="offline-app-requested"],
Loading