[tbb-commits] [tor-browser/tor-browser-52.1.0esr-7.0-2] fixup! Bug 6253: Add canvas image extraction prompt.

gk at torproject.org gk at torproject.org
Tue Apr 25 18:48:48 UTC 2017


commit 1182bee9789a632f374f0a6d3ed90f21af1e37c5
Author: Kathy Brade <brade at pearlcrescent.com>
Date:   Tue Apr 25 11:52:26 2017 -0400

    fixup! Bug 6253: Add canvas image extraction prompt.
    
    Bug 21778: Canvas prompt not showing in Tor Browser based in ESR52
    
    When running in multiprocess mode, use IPC to relay the
    canvas-permissions-prompt observer notification to the chrome
    (parent) process.
---
 browser/base/content/browser.js | 23 +++++++++++++++++++----
 dom/canvas/CanvasUtils.cpp      | 17 ++++++++++++++---
 dom/ipc/PBrowser.ipdl           |  8 ++++++++
 dom/ipc/TabParent.cpp           | 12 ++++++++++++
 dom/ipc/TabParent.h             |  1 +
 5 files changed, 54 insertions(+), 7 deletions(-)

diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 686805fb..83aca07 100755
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -6302,20 +6302,35 @@ var CanvasPermissionPromptHelper = {
     Services.obs.removeObserver(this, this._permissionsPrompt, false);
   },
 
-  // aSubject is an nsIDOMWindow.
+  // aSubject is an nsIBrowser (e10s) or an nsIDOMWindow (non-e10s).
   // aData is an URL string.
   observe:
   function CanvasPermissionPromptHelper_observe(aSubject, aTopic, aData) {
     if (aTopic != this._permissionsPrompt) {
-        throw new Error("Unexpected topic");
+      throw new Error("Unexpected topic");
     }
+
+    let browser;
+    try {
+      browser = aSubject.QueryInterface(Ci.nsIBrowser);
+    } catch (e) {}
+
+    if (!browser) {
+      try {
+        let contentWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+        browser = gBrowser.getBrowserForContentWindow(contentWindow);
+      } catch (e) {}
+
+      if (!browser) {
+        throw new Error("No browser");
+      }
+    }
+
     if (!aData) {
       throw new Error("Missing URL");
     }
 
     var uri = makeURI(aData);
-    var contentWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
-    var browser = gBrowser.getBrowserForContentWindow(contentWindow);
     if (gBrowser.selectedBrowser !== browser) {
       // Must belong to some other window.
       return;
diff --git a/dom/canvas/CanvasUtils.cpp b/dom/canvas/CanvasUtils.cpp
index bd5c44d..dceccfd 100644
--- a/dom/canvas/CanvasUtils.cpp
+++ b/dom/canvas/CanvasUtils.cpp
@@ -15,6 +15,7 @@
 #include "nsICanvasRenderingContextInternal.h"
 #include "nsIHTMLCollection.h"
 #include "mozilla/dom/HTMLCanvasElement.h"
+#include "mozilla/dom/TabChild.h"
 #include "nsIPrincipal.h"
 
 #include "nsGfxCIID.h"
@@ -144,9 +145,19 @@ bool IsImageExtractionAllowed(nsIDocument *aDocument, JSContext *aCx)
     nsContentUtils::LogMessageToConsole(message.get());
 
     // Prompt the user (asynchronous).
-    nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
-    obs->NotifyObservers(win, TOPIC_CANVAS_PERMISSIONS_PROMPT,
-                         NS_ConvertUTF8toUTF16(topLevelDocURISpec).get());
+    if (XRE_IsContentProcess()) {
+      TabChild* tabChild = TabChild::GetFrom(win);
+      if (tabChild) {
+        tabChild->SendShowCanvasPermissionPrompt(topLevelDocURISpec);
+      }
+    } else {
+      nsCOMPtr<nsIObserverService> obs =
+                                      mozilla::services::GetObserverService();
+      if (obs) {
+        obs->NotifyObservers(win, TOPIC_CANVAS_PERMISSIONS_PROMPT,
+                             NS_ConvertUTF8toUTF16(topLevelDocURISpec).get());
+      }
+    }
 
     // We don't extract the image for now -- user may override at prompt.
     return false;
diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl
index 249657c..cc4c4dc 100644
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -619,6 +619,14 @@ parent:
      */
     async RequestCrossBrowserNavigation(uint32_t aGlobalIndex);
 
+    /**
+     * 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.
+     */
+    async ShowCanvasPermissionPrompt(nsCString aFirstPartyURI);
+
 child:
     /**
      * Notify the remote browser that it has been Show()n on this
diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp
index 0df4c12..ff1b41a 100644
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -3277,6 +3277,18 @@ TabParent::RecvRequestCrossBrowserNavigation(const uint32_t& aGlobalIndex)
   return NS_SUCCEEDED(frameLoader->RequestGroupedHistoryNavigation(aGlobalIndex));
 }
 
+bool
+TabParent::RecvShowCanvasPermissionPrompt(const nsCString& firstPartyURI)
+{
+  nsCOMPtr<nsIBrowser> browser = do_QueryInterface(mFrameElement);
+  NS_ENSURE_TRUE(browser, false);
+  nsCOMPtr<nsIObserverService> os = services::GetObserverService();
+  NS_ENSURE_TRUE(os, false);
+  nsresult rv = os->NotifyObservers(browser, "canvas-permissions-prompt",
+                                    NS_ConvertUTF8toUTF16(firstPartyURI).get());
+  return NS_SUCCEEDED(rv);
+}
+
 NS_IMETHODIMP
 FakeChannel::OnAuthAvailable(nsISupports *aContext, nsIAuthInformation *aAuthInfo)
 {
diff --git a/dom/ipc/TabParent.h b/dom/ipc/TabParent.h
index 43afb05..b8022e1 100644
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -633,6 +633,7 @@ protected:
   virtual bool RecvNotifySessionHistoryChange(const uint32_t& aCount) override;
 
   virtual bool RecvRequestCrossBrowserNavigation(const uint32_t& aGlobalIndex) override;
+  virtual bool RecvShowCanvasPermissionPrompt(const nsCString& firstPartyURI) override;
 
   ContentCacheInParent mContentCache;
 



More information about the tbb-commits mailing list