Bug 1318532 - Support <iframe mozbrowser> in WebExtension documents. r=bz, rpl
MozReview-Commit-ID: 2aTLTArsUDm
--- 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();