Back out 2 changesets (bug 1125351, bug 1069719) for m-oth bustage
authorPhil Ringnalda <philringnalda@gmail.com>
Sat, 24 Jan 2015 14:52:07 -0800
changeset 225581 2cca9e9d7ccf68261e262a04c41b469d56411c20
parent 225580 d082ba907669faf1f8e60aa8563b27605f4a88a7
child 225582 c18776175a697be3da527fd78072fee007d5dc2a
child 225591 ccca03a662e390742f108363972879a86c0b77d4
push id28167
push userryanvm@gmail.com
push dateSun, 25 Jan 2015 00:24:46 +0000
treeherdermozilla-central@c18776175a69 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1125351, 1069719
milestone38.0a1
backs outfb315ec11af4f5d0d9b297a66bf0d88a205cbb1e
0ab33c2362cf020b11c24442b05ad95bda08a419
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Back out 2 changesets (bug 1125351, bug 1069719) for m-oth bustage CLOSED TREE Backed out changeset fb315ec11af4 (bug 1125351) Backed out changeset 0ab33c2362cf (bug 1069719)
docshell/base/nsDocShell.cpp
docshell/base/nsIDocShell.idl
dom/bindings/BindingUtils.cpp
dom/bindings/BindingUtils.h
dom/bindings/Codegen.py
dom/bindings/test/chrome.ini
dom/bindings/test/file_focuser.html
dom/bindings/test/file_fullScreenPropertyAccessor.html
dom/bindings/test/test_blacklisted_prerendering_function.xul
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -3378,17 +3378,21 @@ nsDocShell::SetDocLoaderParent(nsDocLoad
             SetAllowWindowControl(value);
         }
         SetAllowContentRetargeting(
             parentAsDocShell->GetAllowContentRetargeting());
         if (NS_SUCCEEDED(parentAsDocShell->GetIsActive(&value)))
         {
             SetIsActive(value);
         }
-        SetIsPrerendered(parentAsDocShell->GetIsPrerendered());
+        if (NS_SUCCEEDED(parentAsDocShell->GetIsPrerendered(&value))) {
+            if (value) {
+                SetIsPrerendered(true);
+            }
+        }
         if (NS_FAILED(parentAsDocShell->GetAllowDNSPrefetch(&value))) {
             value = false;
         }
         SetAllowDNSPrefetch(value);
         value = parentAsDocShell->GetAffectPrivateSessionLifetime();
         SetAffectPrivateSessionLifetime(value);
         uint32_t flags;
         if (NS_SUCCEEDED(parentAsDocShell->GetDefaultLoadFlags(&flags)))
--- a/docshell/base/nsIDocShell.idl
+++ b/docshell/base/nsIDocShell.idl
@@ -619,17 +619,17 @@ interface nsIDocShell : nsIDocShellTreeI
    */
   attribute boolean isActive;
 
   /**
    * Puts the docshell in prerendering mode. noscript because we want only
    * native code to be able to put a docshell in prerendering.
    */
   [noscript] void SetIsPrerendered(in boolean prerendered);
-  [infallible] readonly attribute boolean isPrerendered;
+  readonly attribute boolean isPrerendered;
 
   /**
    * The ID of the docshell in the session history.
    */
   readonly attribute unsigned long long historyID;
 
   /**
    * Sets whether a docshell is an app tab. An app tab docshell may behave
--- a/dom/bindings/BindingUtils.cpp
+++ b/dom/bindings/BindingUtils.cpp
@@ -15,17 +15,16 @@
 #include "mozilla/FloatingPoint.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/Preferences.h"
 
 #include "AccessCheck.h"
 #include "jsfriendapi.h"
 #include "nsContentUtils.h"
 #include "nsGlobalWindow.h"
-#include "nsIDocShell.h"
 #include "nsIDOMGlobalPropertyInitializer.h"
 #include "nsIPermissionManager.h"
 #include "nsIPrincipal.h"
 #include "nsIXPConnect.h"
 #include "nsUTF8Utils.h"
 #include "WrapperFactory.h"
 #include "xpcprivate.h"
 #include "XrayWrapper.h"
@@ -2377,57 +2376,22 @@ CheckPermissions(JSContext* aCx, JSObjec
     permMgr->TestPermissionFromWindow(window, *aPermissions, &permission);
     if (permission == nsIPermissionManager::ALLOW_ACTION) {
       return true;
     }
   } while (*(++aPermissions));
   return false;
 }
 
-void
-HandlePrerenderingViolation(nsPIDOMWindow* aWindow)
-{
-  // Suspend the window and its workers, and its children too.
-  aWindow->SuspendTimeouts();
-
-  // Suspend event handling on the document
-  nsCOMPtr<nsIDocument> doc = aWindow->GetExtantDoc();
-  if (doc) {
-    doc->SuppressEventHandling(nsIDocument::eEvents);
-  }
-}
-
 bool
-EnforceNotInPrerendering(JSContext* aCx, JSObject* aObj)
+CheckSafetyInPrerendering(JSContext* aCx, JSObject* aObj)
 {
-  JS::Rooted<JSObject*> thisObj(aCx, js::CheckedUnwrap(aObj));
-  if (!thisObj) {
-    // Without a this object, we cannot check the safety.
-    return true;
-  }
-  nsGlobalWindow* window = xpc::WindowGlobalOrNull(thisObj);
-  if (!window) {
-    // Without a window, we cannot check the safety.
-    return true;
-  }
-
-  nsIDocShell* docShell = window->GetDocShell();
-  if (!docShell) {
-    // Without a docshell, we cannot check the safety.
-    return true;
-  }
-
-  if (docShell->GetIsPrerendered()) {
-    HandlePrerenderingViolation(window);
-    // When the bindings layer sees a false return value, it returns false form
-    // the JSNative in order to trigger an uncatchable exception.
-    return false;
-  }
-
-  return true;
+  //TODO: Check if page is being prerendered.
+  //Returning false for now.
+  return false;
 }
 
 bool
 GenericBindingGetter(JSContext* cx, unsigned argc, JS::Value* vp)
 {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
   const JSJitInfo *info = FUNCTION_VALUE_TO_JITINFO(args.calleev());
   prototypes::ID protoID = static_cast<prototypes::ID>(info->protoID);
--- a/dom/bindings/BindingUtils.h
+++ b/dom/bindings/BindingUtils.h
@@ -3137,30 +3137,19 @@ AssertReturnTypeMatchesJitinfo(const JSJ
                                JS::Handle<JS::Value> aValue);
 #endif
 
 // Returns true if aObj's global has any of the permissions named in aPermissions
 // set to nsIPermissionManager::ALLOW_ACTION. aPermissions must be null-terminated.
 bool
 CheckPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]);
 
-// This function is called by the bindings layer for methods/getters/setters
-// that are not safe to be called in prerendering mode.  It checks to make sure
-// that the |this| object is not running in a global that is in prerendering
-// mode.  Otherwise, it aborts execution of timers and event handlers, and
-// returns false which gets converted to an uncatchable exception by the
-// bindings layer.
+//Returns true if page is being prerendered.
 bool
-EnforceNotInPrerendering(JSContext* aCx, JSObject* aObj);
-
-// Handles the violation of a blacklisted action in prerendering mode by
-// aborting the scripts, and preventing timers and event handlers from running
-// in the window in the future.
-void
-HandlePrerenderingViolation(nsPIDOMWindow* aWindow);
+CheckSafetyInPrerendering(JSContext* aCx, JSObject* aObj);
 
 bool
 CallerSubsumes(JSObject* aObject);
 
 MOZ_ALWAYS_INLINE bool
 CallerSubsumes(JS::Handle<JS::Value> aValue)
 {
   if (!aValue.isObject()) {
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -6498,20 +6498,18 @@ class CGPerSignatureCall(CGThing):
         # inherited interfaces have the UnsafeInPrerendering extended attribute
         # and if so, we add a check to make sure it is safe.
         if (idlNode.getExtendedAttribute("UnsafeInPrerendering") or
             descriptor.interface.getExtendedAttribute("UnsafeInPrerendering") or
             any(i.getExtendedAttribute("UnsafeInPrerendering")
                 for i in descriptor.interface.getInheritedInterfaces())):
                 cgThings.append(CGGeneric(dedent(
                     """
-                    if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) {
-                        // Return false from the JSNative in order to trigger
-                        // an uncatchable exception.
-                        MOZ_ASSERT(!JS_IsExceptionPending(cx));
+                    if (mozilla::dom::CheckSafetyInPrerendering(cx, obj)) {
+                        //TODO: Handle call into unsafe API during Prerendering (Bug 730101)
                         return false;
                     }
                     """)))
         lenientFloatCode = None
         if idlNode.getExtendedAttribute('LenientFloat') is not None:
             if setter:
                 lenientFloatCode = "return true;\n"
             elif idlNode.isMethod():
--- a/dom/bindings/test/chrome.ini
+++ b/dom/bindings/test/chrome.ini
@@ -1,13 +1,8 @@
 [DEFAULT]
 
 [test_bug707564-chrome.html]
 [test_bug775543.html]
 [test_document_location_set_via_xray.html]
 [test_dom_xrays.html]
 [test_proxies_via_xray.html]
 [test_document_location_via_xray_cached.html]
-[test_blacklisted_prerendering_function.xul]
-support-files =
-  file_focuser.html
-  file_fullScreenPropertyAccessor.html
-skip-if = e10s # prerendering doesn't work in e10s yet
deleted file mode 100644
--- a/dom/bindings/test/file_focuser.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML>
-<div id="stage"></div>
-<script>
-  function stage(str) {
-    var s = document.getElementById("stage");
-    s.textContent = str;
-  }
-  stage("before");
-  setTimeout(function() {
-    stage("in timeout");
-  });
-  setInterval(function() {
-    stage("in interval");
-  });
-  addEventListener("keydown", function() {
-    stage("keydown");
-  }, false);
-  try {
-    focus();
-    stage("after");
-  } catch(e) {
-    stage("exception raised");
-  }
-</script>
deleted file mode 100644
--- a/dom/bindings/test/file_fullScreenPropertyAccessor.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML>
-<div id="stage"></div>
-<script>
-  function stage(str) {
-    var s = document.getElementById("stage");
-    s.textContent = str;
-  }
-  stage("before");
-  setTimeout(function() {
-    stage("in timeout");
-  });
-  setInterval(function() {
-    stage("in interval");
-  });
-  addEventListener("keydown", function() {
-    stage("keydown");
-  }, false);
-  try {
-    window.fullScreen;
-    stage("after");
-  } catch(e) {
-    stage("exception raised");
-  }
-</script>
deleted file mode 100644
--- a/dom/bindings/test/test_blacklisted_prerendering_function.xul
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
-<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        xmlns:html="http://www.w3.org/1999/xhtml"
-        onload="runTest();">
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
-
-<script class="testbody" type="application/javascript">
-<![CDATA[
-
-  SimpleTest.waitForExplicitFinish();
-
-  function Listener(aBrowser, aPrerendered, aCallback) {
-    this.init(aBrowser, aPrerendered, aCallback);
-  }
-
-  Listener.prototype = {
-    init: function(aBrowser, aPrerendered, aCallback) {
-      this.mBrowser = aBrowser;
-      this.mPrerendered = aPrerendered;
-      this.mCallback = aCallback;
-    },
-    QueryInterface: function(aIID) {
-      if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
-          aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
-          aIID.equals(Components.interfaces.nsISupports))
-        return this;
-      throw Components.results.NS_NOINTERFACE;
-    },
-    onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
-      if ((aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
-          (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT)) {
-        var doc = this.mBrowser.contentDocument;
-        var stage = doc.getElementById("stage");
-        if (this.mPrerendered) {
-          is(stage.textContent, "before", "The blacklisted call should properly be intercepted in prerendering mode");
-        } else {
-          // In normal mode, we may or may not have run the timeout and/or the interval.
-          switch (stage.textContent) {
-          case "after":
-          case "in timeout":
-          case "in interval":
-            ok(true, "The blacklisted call should work fine in normal mode");
-            break;
-          default:
-            ok(false, "The blacklisted call should work fine in normal mode");
-            break;
-          }
-        }
-        progress.removeProgressListener(progressListener);
-
-        // Set three timeouts to see if the interval triggered
-        var self = this;
-        function checkInterval() {
-          var expected = self.mPrerendered ? "before" : "in interval";
-          var desc = self.mPrerendered ? "No timer should be running" : "Timers should run as normal";
-          is(stage.textContent, expected, desc);
-          // Now, dispatch a key event to the window and see if the keydown handler runs
-          synthesizeKey("a", {}, self.mBrowser.contentWindow);
-          expected = self.mPrerendered ? "before" : "keydown";
-          desc = self.mPrerendered ? "No event handler should be running" : "Event handlers should run as normal";
-          is(stage.textContent, expected, desc);
-          self.mCallback();
-        }
-        setTimeout(function() {
-          setTimeout(function() {
-            setTimeout(function() {
-              checkInterval();
-            }, 0);
-          }, 0);
-        }, 0);
-      }
-    },
-    onProgressChange : function(aWebProgress, aRequest,
-                                aCurSelfProgress, aMaxSelfProgress,
-                                aCurTotalProgress, aMaxTotalProgress) {},
-    onLocationChange : function(aWebProgress, aRequest, aLocation, aFlags) {},
-    onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) {},
-    onSecurityChange : function(aWebProgress, aRequest, aState) {},
-    mBrowser: null,
-    mPrerendered: false,
-    mCallback: null
-  };
-
-  var progress, progressListener;
-
-  function runTest() {
-    testStep(false, "file_focuser.html", function() {
-      testStep(true, "file_focuser.html", function() {
-        testStep(false, "file_fullScreenPropertyAccessor.html", function() {
-          testStep(true, "file_fullScreenPropertyAccessor.html", function() {
-            SimpleTest.finish();
-          });
-        });
-      });
-    });
-  }
-
-  function testStep(aPrerendered, aFileName, aCallback) {
-    var browser = document.getElementById(aPrerendered ? "prerendered" : "normal");;
-    progressListener = new Listener(browser, aPrerendered, aCallback);
-    var docShell = browser.docShell;
-    progress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                       .getInterface(Components.interfaces.nsIWebProgress);
-    progress.addProgressListener(progressListener,
-                                 Components.interfaces.nsIWebProgress.NOTIFY_ALL);
-                                 browser.loadURI("chrome://mochitests/content/chrome/dom/bindings/test/" + aFileName);
-  }
-
-]]>
-</script>
-
-<body  id="html_body" xmlns="http://www.w3.org/1999/xhtml">
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1069719">Mozilla Bug 1069719</a>
-<p id="display"></p>
-
-<pre id="test">
-</pre>
-</body>
-<browser prerendered="true" id="prerendered"/>
-<browser id="normal"/>
-</window>