Commit 71c98f5d authored by Arthur Edelstein's avatar Arthur Edelstein Committed by Georg Koppen
Browse files

Bug 26670: Make canvas permission respect FPI

parent 3e32edd3
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -6834,7 +6834,7 @@ var CanvasPermissionPromptHelper = {
  },

  // aSubject is an nsIBrowser (e10s) or an nsIDOMWindow (non-e10s).
  // aData is an URL string.
  // aData is an Origin string.
  observe(aSubject, aTopic, aData) {
    if (aTopic != this._permissionsPrompt) {
      return;
@@ -6848,7 +6848,6 @@ var CanvasPermissionPromptHelper = {
      browser = aSubject.QueryInterface(Ci.nsIBrowser);
    }

    let uri = Services.io.newURI(aData);
    if (gBrowser.selectedBrowser !== browser) {
      // Must belong to some other window.
      return;
@@ -6856,8 +6855,12 @@ var CanvasPermissionPromptHelper = {

    let message = gNavigatorBundle.getFormattedString("canvas.siteprompt", ["<>"], 1);

    function setCanvasPermission(aURI, aPerm, aPersistent) {
      Services.perms.add(aURI, "canvas", aPerm,
    let principal = Services.scriptSecurityManager
                            .createCodebasePrincipalFromOrigin(aData);

    function setCanvasPermission(aPerm, aPersistent) {
      Services.perms.addFromPrincipal(
        principal, "canvas", aPerm,
        aPersistent ? Ci.nsIPermissionManager.EXPIRE_NEVER
                    : Ci.nsIPermissionManager.EXPIRE_SESSION);
    }
@@ -6866,7 +6869,7 @@ var CanvasPermissionPromptHelper = {
      label: gNavigatorBundle.getString("canvas.allow"),
      accessKey: gNavigatorBundle.getString("canvas.allow.accesskey"),
      callback(state) {
        setCanvasPermission(uri, Ci.nsIPermissionManager.ALLOW_ACTION,
        setCanvasPermission(Ci.nsIPermissionManager.ALLOW_ACTION,
                            state && state.checkboxChecked);
      }
    };
@@ -6875,7 +6878,7 @@ var CanvasPermissionPromptHelper = {
      label: gNavigatorBundle.getString("canvas.notAllow"),
      accessKey: gNavigatorBundle.getString("canvas.notAllow.accesskey"),
      callback(state) {
        setCanvasPermission(uri, Ci.nsIPermissionManager.DENY_ACTION,
        setCanvasPermission(Ci.nsIPermissionManager.DENY_ACTION,
                            state && state.checkboxChecked);
      }
    }];
@@ -6891,7 +6894,7 @@ var CanvasPermissionPromptHelper = {

    let options = {
      checkbox,
      name: uri.asciiHost,
      name: principal.URI.host,
      learnMoreURL: Services.urlFormatter.formatURLPref("app.support.baseURL") + "fingerprint-permission",
    };
    PopupNotifications.show(browser, aTopic, message, this._notificationIcon,
+16 −7
Original line number Diff line number Diff line
@@ -58,7 +58,12 @@ bool IsImageExtractionAllowed(nsIDocument *aDocument, JSContext *aCx)
    // Documents with system principal can always extract canvas data.
    nsPIDOMWindowOuter *win = aDocument->GetWindow();
    nsCOMPtr<nsIScriptObjectPrincipal> sop(do_QueryInterface(win));
    if (sop && nsContentUtils::IsSystemPrincipal(sop->GetPrincipal())) {
    if (!sop) {
      return false;
    }

    nsCOMPtr<nsIPrincipal> principal(sop->GetPrincipal());
    if (principal && nsContentUtils::IsSystemPrincipal(principal)) {
      return true;
    }

@@ -127,7 +132,7 @@ bool IsImageExtractionAllowed(nsIDocument *aDocument, JSContext *aCx)
    // Check if the site has permission to extract canvas data.
    // Either permit or block extraction if a stored permission setting exists.
    uint32_t permission;
    rv = permissionManager->TestPermission(topLevelDocURI,
    rv = permissionManager->TestPermissionFromPrincipal(principal,
                                                        PERMISSION_CANVAS_EXTRACT_DATA,
                                                        &permission);
    NS_ENSURE_SUCCESS(rv, false);
@@ -165,16 +170,20 @@ bool IsImageExtractionAllowed(nsIDocument *aDocument, JSContext *aCx)
    nsContentUtils::LogMessageToConsole(message.get());

    // Prompt the user (asynchronous).
    nsAutoCString origin;
    rv = principal->GetOrigin(origin);
    NS_ENSURE_SUCCESS(rv, false);

    if (XRE_IsContentProcess()) {
        TabChild* tabChild = TabChild::GetFrom(win);
        if (tabChild) {
            tabChild->SendShowCanvasPermissionPrompt(topLevelDocURISpec);
            tabChild->SendShowCanvasPermissionPrompt(origin);
        }
    } else {
        nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
        if (obs) {
            obs->NotifyObservers(win, TOPIC_CANVAS_PERMISSIONS_PROMPT,
                                 NS_ConvertUTF8toUTF16(topLevelDocURISpec).get());
                                 NS_ConvertUTF8toUTF16(origin).get());
        }
    }

+2 −2
Original line number Diff line number Diff line
@@ -584,9 +584,9 @@ parent:
     * This function is used to notify the parent that it should display a
     * canvas permission prompt.
     *
     * @param aFirstPartyURI first party of the tab that is requesting access.
     * @param aOrigin origin string of the document that is requesting access.
     */
    async ShowCanvasPermissionPrompt(nsCString aFirstPartyURI);
    async ShowCanvasPermissionPrompt(nsCString aOrigin);

child:
    /**
+2 −2
Original line number Diff line number Diff line
@@ -3578,7 +3578,7 @@ TabParent::RecvLookUpDictionary(const nsString& aText,
}

mozilla::ipc::IPCResult
TabParent::RecvShowCanvasPermissionPrompt(const nsCString& aFirstPartyURI)
TabParent::RecvShowCanvasPermissionPrompt(const nsCString& aOrigin)
{
  nsCOMPtr<nsIBrowser> browser = do_QueryInterface(mFrameElement);
  if (!browser) {
@@ -3591,7 +3591,7 @@ TabParent::RecvShowCanvasPermissionPrompt(const nsCString& aFirstPartyURI)
    return IPC_FAIL_NO_REASON(this);
  }
  nsresult rv = os->NotifyObservers(browser, "canvas-permissions-prompt",
                                    NS_ConvertUTF8toUTF16(aFirstPartyURI).get());
                                    NS_ConvertUTF8toUTF16(aOrigin).get());
  if (NS_FAILED(rv)) {
    return IPC_FAIL_NO_REASON(this);
  }
+1 −1
Original line number Diff line number Diff line
@@ -633,7 +633,7 @@ protected:

  virtual mozilla::ipc::IPCResult RecvGetTabCount(uint32_t* aValue) override;

  virtual mozilla::ipc::IPCResult RecvShowCanvasPermissionPrompt(const nsCString& aFirstPartyURI) override;
  virtual mozilla::ipc::IPCResult RecvShowCanvasPermissionPrompt(const nsCString& aOrigin) override;

  ContentCacheInParent mContentCache;