From 0a125c84e2b643d569f9af874f5855f67e7e3e77 Mon Sep 17 00:00:00 2001 From: Arthur Edelstein Date: Wed, 27 Aug 2014 12:14:43 -0700 Subject: [PATCH] Bug 2874: Block Components.interfaces from content --- dom/base/nsDOMClassInfo.cpp | 96 ------------------- dom/events/test/test_bug238987.html | 8 +- dom/indexedDB/test/helpers.js | 2 +- js/xpconnect/tests/chrome/test_bug795275.xul | 11 ++- js/xpconnect/tests/mochitest/mochitest.ini | 1 - .../tests/mochitest/test_bug790732.html | 62 ------------ .../mochitest/tests/SimpleTest/EventUtils.js | 6 +- .../mochitest/tests/SimpleTest/SimpleTest.js | 4 +- toolkit/components/telemetry/Histograms.json | 5 - .../telemetry/histogram-whitelists.json | 2 - 10 files changed, 16 insertions(+), 181 deletions(-) delete mode 100644 js/xpconnect/tests/mochitest/test_bug790732.html diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index d125e5ad1c712..6fcf41277162f 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -1687,11 +1687,6 @@ OldBindingConstructorEnabled(const nsGlobalNameStruct *aStruct, return true; } -static nsresult -LookupComponentsShim(JSContext *cx, JS::Handle global, - nsPIDOMWindowInner *win, - JS::MutableHandle desc); - // static bool nsWindowSH::NameStructEnabled(JSContext* aCx, nsGlobalWindow *aWin, @@ -1720,10 +1715,6 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx, JS::Handle obj, JS::Handle id, JS::MutableHandle desc) { - if (id == XPCJSContext::Get()->GetStringID(XPCJSContext::IDX_COMPONENTS)) { - return LookupComponentsShim(cx, obj, aWin->AsInner(), desc); - } - #ifdef USE_CONTROLLERS_SHIM // Note: We use |obj| rather than |aWin| to get the principal here, because // this is called during Window setup when the Document isn't necessarily @@ -1868,93 +1859,6 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx, return rv; } -struct InterfaceShimEntry { - const char *geckoName; - const char *domName; -}; - -// We add shims from Components.interfaces.nsIDOMFoo to window.Foo for each -// interface that has interface constants that sites might be getting off -// of Ci. -const InterfaceShimEntry kInterfaceShimMap[] = -{ { "nsIXMLHttpRequest", "XMLHttpRequest" }, - { "nsIDOMDOMException", "DOMException" }, - { "nsIDOMNode", "Node" }, - { "nsIDOMCSSPrimitiveValue", "CSSPrimitiveValue" }, - { "nsIDOMCSSRule", "CSSRule" }, - { "nsIDOMCSSValue", "CSSValue" }, - { "nsIDOMEvent", "Event" }, - { "nsIDOMNSEvent", "Event" }, - { "nsIDOMKeyEvent", "KeyEvent" }, - { "nsIDOMMouseEvent", "MouseEvent" }, - { "nsIDOMMouseScrollEvent", "MouseScrollEvent" }, - { "nsIDOMMutationEvent", "MutationEvent" }, - { "nsIDOMSimpleGestureEvent", "SimpleGestureEvent" }, - { "nsIDOMUIEvent", "UIEvent" }, - { "nsIDOMHTMLMediaElement", "HTMLMediaElement" }, - { "nsIDOMOfflineResourceList", "OfflineResourceList" }, - { "nsIDOMRange", "Range" }, - { "nsIDOMSVGLength", "SVGLength" }, - { "nsIDOMNodeFilter", "NodeFilter" }, - { "nsIDOMXPathResult", "XPathResult" } }; - -static nsresult -LookupComponentsShim(JSContext *cx, JS::Handle global, - nsPIDOMWindowInner *win, - JS::MutableHandle desc) -{ - // Keep track of how often this happens. - Telemetry::Accumulate(Telemetry::COMPONENTS_SHIM_ACCESSED_BY_CONTENT, true); - - // Warn once. - nsCOMPtr doc = win->GetExtantDoc(); - if (doc) { - doc->WarnOnceAbout(nsIDocument::eComponents, /* asError = */ true); - } - - // Create a fake Components object. - AssertSameCompartment(cx, global); - JS::Rooted components(cx, JS_NewPlainObject(cx)); - NS_ENSURE_TRUE(components, NS_ERROR_OUT_OF_MEMORY); - - // Create a fake interfaces object. - JS::Rooted interfaces(cx, JS_NewPlainObject(cx)); - NS_ENSURE_TRUE(interfaces, NS_ERROR_OUT_OF_MEMORY); - bool ok = - JS_DefineProperty(cx, components, "interfaces", interfaces, - JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, - JS_STUBGETTER, JS_STUBSETTER); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); - - // Define a bunch of shims from the Ci.nsIDOMFoo to window.Foo for DOM - // interfaces with constants. - for (uint32_t i = 0; i < ArrayLength(kInterfaceShimMap); ++i) { - - // Grab the names from the table. - const char *geckoName = kInterfaceShimMap[i].geckoName; - const char *domName = kInterfaceShimMap[i].domName; - - // Look up the appopriate interface object on the global. - JS::Rooted v(cx, JS::UndefinedValue()); - ok = JS_GetProperty(cx, global, domName, &v); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); - if (!v.isObject()) { - NS_WARNING("Unable to find interface object on global"); - continue; - } - - // Define the shim on the interfaces object. - ok = JS_DefineProperty(cx, interfaces, geckoName, v, - JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, - JS_STUBGETTER, JS_STUBSETTER); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); - } - - FillPropertyDescriptor(desc, global, JS::ObjectValue(*components), false); - - return NS_OK; -} - // EventTarget helper NS_IMETHODIMP diff --git a/dom/events/test/test_bug238987.html b/dom/events/test/test_bug238987.html index 814b0596b9fda..5982eb563d9dd 100644 --- a/dom/events/test/test_bug238987.html +++ b/dom/events/test/test_bug238987.html @@ -38,7 +38,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=238987 shouldStop = true; } } else if (e.target.id == "end") { - modifier = Components.interfaces.nsIDOMEvent.SHIFT_MASK; + modifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK; } else if (modifier) { var expected = backwardFocusArray.pop(); ok(expected == e.target.id, @@ -59,7 +59,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=238987 if ("id" in e.target) { s = s + ", id=\"" + e.target.id + "\""; } - ok(e.eventPhase == Components.interfaces.nsIDOMEvent.CAPTURING_PHASE, + ok(e.eventPhase == SpecialPowers.Ci.nsIDOMEvent.CAPTURING_PHASE, "|window| should not have got a focus event, " + s); } @@ -85,14 +85,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=238987 if ("id" in e.target) { s = s + ", id=\"" + e.target.id + "\""; } - ok(e.eventPhase == Components.interfaces.nsIDOMEvent.CAPTURING_PHASE, + ok(e.eventPhase == SpecialPowers.Ci.nsIDOMEvent.CAPTURING_PHASE, "|window| should not have got a blur event, " + s); } function tab() { var utils = SpecialPowers.DOMWindowUtils; // Send tab key events. - var key = Components.interfaces.nsIDOMKeyEvent.DOM_VK_TAB; + var key = SpecialPowers.Ci.nsIDOMKeyEvent.DOM_VK_TAB; utils.sendKeyEvent("keydown", key, 0, modifier); utils.sendKeyEvent("keypress", key, 0, modifier); utils.sendKeyEvent("keyup", key, 0, modifier); diff --git a/dom/indexedDB/test/helpers.js b/dom/indexedDB/test/helpers.js index e6e27f3f3c8c9..053bfbb704461 100644 --- a/dom/indexedDB/test/helpers.js +++ b/dom/indexedDB/test/helpers.js @@ -15,7 +15,7 @@ var archiveReaderEnabled = false; // placebo for compat. An easy way to differentiate this from the real thing // is whether the property is read-only or not. var c = Object.getOwnPropertyDescriptor(this, 'Components'); -if ((!c.value || c.writable) && typeof SpecialPowers === 'object') +if ((!c || !c.value || c.writable) && typeof SpecialPowers === 'object') Components = SpecialPowers.Components; function executeSoon(aFun) diff --git a/js/xpconnect/tests/chrome/test_bug795275.xul b/js/xpconnect/tests/chrome/test_bug795275.xul index 875743fd9c472..27e26182a26da 100644 --- a/js/xpconnect/tests/chrome/test_bug795275.xul +++ b/js/xpconnect/tests/chrome/test_bug795275.xul @@ -58,10 +58,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=795275 function getWin(id) { return document.getElementById(id).contentWindow.wrappedJSObject; } function go() { - getWin('frame1').touchComponents(); - getWin('frame2').touchInterfaces(); - getWin('frame4').touchComponents(); - getWin('frame4').touchInterfaces(); +// TODO: We have removed Components from content scripts. We could remove these tests. +// getWin('frame1').touchComponents(); +// getWin('frame2').touchInterfaces(); +// getWin('frame4').touchComponents(); +// getWin('frame4').touchInterfaces(); // This shouldn't warn. getWin('frame5').touchViaXBL(); @@ -72,7 +73,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=795275 function done() { gConsoleService.unregisterListener(gListener); - is(gWarnings, 3, "Got the right number of warnings"); + is(gWarnings, 0, "Got the right number of warnings"); SimpleTest.finish(); } diff --git a/js/xpconnect/tests/mochitest/mochitest.ini b/js/xpconnect/tests/mochitest/mochitest.ini index de6759e7ab7cb..a5cb92b436a9c 100644 --- a/js/xpconnect/tests/mochitest/mochitest.ini +++ b/js/xpconnect/tests/mochitest/mochitest.ini @@ -72,7 +72,6 @@ support-files = [test_bug772288.html] [test_bug781476.html] [test_bug789713.html] -[test_bug790732.html] [test_bug793969.html] [test_bug800864.html] [test_bug802557.html] diff --git a/js/xpconnect/tests/mochitest/test_bug790732.html b/js/xpconnect/tests/mochitest/test_bug790732.html deleted file mode 100644 index 48b7fdbb6d12a..0000000000000 --- a/js/xpconnect/tests/mochitest/test_bug790732.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - Test for Bug 790732 - - - - - -Mozilla Bug 790732 -

- -
-
- - - diff --git a/testing/mochitest/tests/SimpleTest/EventUtils.js b/testing/mochitest/tests/SimpleTest/EventUtils.js index 17243625dbf30..a0df2d5e4acd6 100644 --- a/testing/mochitest/tests/SimpleTest/EventUtils.js +++ b/testing/mochitest/tests/SimpleTest/EventUtils.js @@ -30,17 +30,17 @@ window.__defineGetter__('_EU_Ci', function() { // placebo for compat. An easy way to differentiate this from the real thing // is whether the property is read-only or not. var c = Object.getOwnPropertyDescriptor(window, 'Components'); - return c.value && !c.writable ? Components.interfaces : SpecialPowers.Ci; + return c && c.value && !c.writable ? Components.interfaces : SpecialPowers.Ci; }); window.__defineGetter__('_EU_Cc', function() { var c = Object.getOwnPropertyDescriptor(window, 'Components'); - return c.value && !c.writable ? Components.classes : SpecialPowers.Cc; + return c && c.value && !c.writable ? Components.classes : SpecialPowers.Cc; }); window.__defineGetter__('_EU_Cu', function() { var c = Object.getOwnPropertyDescriptor(window, 'Components'); - return c.value && !c.writable ? Components.utils : SpecialPowers.Cu; + return c && c.value && !c.writable ? Components.utils : SpecialPowers.Cu; }); window.__defineGetter__("_EU_OS", function() { diff --git a/testing/mochitest/tests/SimpleTest/SimpleTest.js b/testing/mochitest/tests/SimpleTest/SimpleTest.js index 37713737c8d21..78885a6cf527c 100644 --- a/testing/mochitest/tests/SimpleTest/SimpleTest.js +++ b/testing/mochitest/tests/SimpleTest/SimpleTest.js @@ -816,8 +816,8 @@ SimpleTest.waitForFocus = function (callback, targetWindow, expectBlankPage) { // be forwarded to the child process. // XXXndeakin now sure what this issue with Components.utils is about, but // browser tests require the former and plain tests require the latter. - var Cu = Components.utils || SpecialPowers.Cu; - var Ci = Components.interfaces || SpecialPowers.Ci; + var Cu = (window.hasOwnProperty("Components") && Components.utils) || SpecialPowers.Cu; + var Ci = (window.hasOwnProperty("Components") && Components.interfaces) || SpecialPowers.Ci; var browser = null; if (typeof(XULElement) != "undefined" && diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index aa66fbe147417..4a1ea24380282 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -6676,11 +6676,6 @@ "description": "The device supports touch input", "cpp_guard": "XP_WIN" }, - "COMPONENTS_SHIM_ACCESSED_BY_CONTENT": { - "expires_in_version": "never", - "kind": "flag", - "description": "Whether content ever accesed the Components shim in this session" - }, "CHECK_ADDONS_MODIFIED_MS": { "expires_in_version": "never", "kind": "exponential", diff --git a/toolkit/components/telemetry/histogram-whitelists.json b/toolkit/components/telemetry/histogram-whitelists.json index 52db33192885f..895d7f078d528 100644 --- a/toolkit/components/telemetry/histogram-whitelists.json +++ b/toolkit/components/telemetry/histogram-whitelists.json @@ -102,7 +102,6 @@ "CHARSET_OVERRIDE_USED", "CHECK_ADDONS_MODIFIED_MS", "CHECK_JAVA_ENABLED", - "COMPONENTS_SHIM_ACCESSED_BY_CONTENT", "COMPOSITE_FRAME_ROUNDTRIP_TIME", "COMPOSITE_TIME", "CONTENT_DOCUMENTS_DESTROYED", @@ -851,7 +850,6 @@ "CHARSET_OVERRIDE_USED", "CHECK_ADDONS_MODIFIED_MS", "CHECK_JAVA_ENABLED", - "COMPONENTS_SHIM_ACCESSED_BY_CONTENT", "COMPOSITE_FRAME_ROUNDTRIP_TIME", "COMPOSITE_TIME", "CONTENT_DOCUMENTS_DESTROYED", -- GitLab