Bug 1318532 - Support <iframe mozbrowser> in WebExtension documents. r=bz, rpl draft
authorTim Nguyen <ntim.bugs@gmail.com>
Thu, 16 Mar 2017 16:53:53 +0000
changeset 610933 e1de6bf7e6588a7348beff6bba6830d2f5f5a065
parent 606207 d6f2a893cd7a77cacbb1b139fff78d09c2f001e0
child 610934 be8e734b138496d6e22cc757c08f0fd980b113b7
push id69059
push userbmo:ntim.bugs@gmail.com
push dateWed, 19 Jul 2017 00:19:55 +0000
reviewersbz, rpl
bugs1318532
milestone56.0a1
Bug 1318532 - Support <iframe mozbrowser> in WebExtension documents. r=bz, rpl MozReview-Commit-ID: 2aTLTArsUDm
dom/html/nsGenericHTMLFrameElement.cpp
dom/html/nsGenericHTMLFrameElement.h
dom/webidl/BrowserElement.webidl
--- a/dom/html/nsGenericHTMLFrameElement.cpp
+++ b/dom/html/nsGenericHTMLFrameElement.cpp
@@ -317,24 +317,38 @@ nsGenericHTMLFrameElement::MapScrollingA
     }
   }
   return mappedValue;
 }
 
 static bool
 PrincipalAllowsBrowserFrame(nsIPrincipal* aPrincipal)
 {
+  // WebExtension documents with "mozbrowser" permission
+  // should have access to <iframe mozbrowser>
+  nsAutoString perm = NS_LITERAL_STRING("mozbrowser");
+  if (BasePrincipal::Cast(aPrincipal)->AddonHasPermission(perm)) {
+    return true;
+  }
+
+  // Otherwise, check for the browser permission
   nsCOMPtr<nsIPermissionManager> permMgr = mozilla::services::GetPermissionManager();
   NS_ENSURE_TRUE(permMgr, false);
   uint32_t permission = nsIPermissionManager::DENY_ACTION;
   nsresult rv = permMgr->TestPermissionFromPrincipal(aPrincipal, "browser", &permission);
   NS_ENSURE_SUCCESS(rv, false);
   return permission == nsIPermissionManager::ALLOW_ACTION;
 }
 
+bool
+nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame(JSContext* cx, JSObject* /* unused */)
+{
+  return PrincipalAllowsBrowserFrame(nsContentUtils::SubjectPrincipal(cx));
+}
+
 /* virtual */ nsresult
 nsGenericHTMLFrameElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                                         const nsAttrValue* aValue,
                                         const nsAttrValue* aOldValue, bool aNotify)
 {
   if (aValue) {
     nsAttrValueOrString value(aValue);
     AfterMaybeChangeAttr(aNameSpaceID, aName, &value, aNotify);
--- a/dom/html/nsGenericHTMLFrameElement.h
+++ b/dom/html/nsGenericHTMLFrameElement.h
@@ -74,16 +74,18 @@ public:
                         mozilla::ErrorResult& rv);
 
   void PresetOpenerWindow(mozIDOMWindowProxy* aOpenerWindow,
                           mozilla::ErrorResult& aRv);
 
   static void InitStatics();
   static bool BrowserFramesEnabled();
 
+  static bool JSContextAllowsBrowserFrame(JSContext* aCx, JSObject* /* unused */);
+
   /**
    * Helper method to map a HTML 'scrolling' attribute value to a nsIScrollable
    * enum value.  scrolling="no" (and its synonyms) maps to
    * nsIScrollable::Scrollbar_Never, and anything else (including nullptr) maps
    * to nsIScrollable::Scrollbar_Auto.
    * @param aValue the attribute value to map or nullptr
    * @return nsIScrollable::Scrollbar_Never or nsIScrollable::Scrollbar_Auto
    */
--- a/dom/webidl/BrowserElement.webidl
+++ b/dom/webidl/BrowserElement.webidl
@@ -63,90 +63,90 @@ interface BrowserElementPrivileged {
                       sequence<unsigned long> ry,
                       sequence<float> rotationAngles,
                       sequence<float> forces,
                       unsigned long count,
                       unsigned long modifiers);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void goBack();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void goForward();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void reload(optional boolean hardReload = false);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void stop();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest download(DOMString url,
                       optional BrowserElementDownloadOptions options);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest purgeHistory();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest getScreenshot([EnforceRange] unsigned long width,
                            [EnforceRange] unsigned long height,
                            optional DOMString mimeType="");
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void zoom(float zoom);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest getCanGoBack();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest getCanGoForward();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest getContentDimensions();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void findAll(DOMString searchString, BrowserFindCaseSensitivity caseSensitivity);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void findNext(BrowserFindDirection direction);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   void clearMatch();
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
-   ChromeOnly]
+   Func="nsGenericHTMLFrameElement::JSContextAllowsBrowserFrame"]
   DOMRequest executeScript(DOMString script,
                            optional BrowserElementExecuteScriptOptions options);
 
   [Throws,
    Pref="dom.mozBrowserFramesEnabled",
    ChromeOnly]
   DOMRequest getWebManifest();