Title: [126714] trunk/Source/WebCore
Revision
126714
Author
[email protected]
Date
2012-08-26 15:15:35 -0700 (Sun, 26 Aug 2012)

Log Message

Prerenderering should gracefully handle no PrerendererClient or PrerenderingPlatform being provided.
https://bugs.webkit.org/show_bug.cgi?id=95036

Reviewed by Adam Barth.

Some assertions made sure there was a prerendering platform and client, and this change should make prerendering just be a NOP when no platform is provided, and just continue without a client when there is no client provided. These assertions were causing crashes in chromium's content_shell target, and really for no good reason.

No new tests, because DumpRenderTree provides both a PrerenderingPlatform and a PrerendererClient. But there is a new layout test in chromium's WebKitBrowserTest for this behaviour, see http://codereview.chromium.org/10869068/

* loader/Prerenderer.cpp:
(WebCore::Prerenderer::Prerenderer):
(WebCore::Prerenderer::render):
(WebCore::Prerenderer::client):
* loader/Prerenderer.h:
* loader/PrerendererClient.cpp:
(WebCore::PrerendererClient::from):
* platform/chromium/Prerender.cpp:
(WebCore::Prerender::cancel):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126713 => 126714)


--- trunk/Source/WebCore/ChangeLog	2012-08-26 21:11:54 UTC (rev 126713)
+++ trunk/Source/WebCore/ChangeLog	2012-08-26 22:15:35 UTC (rev 126714)
@@ -1,3 +1,24 @@
+2012-08-26  Gavin Peters  <[email protected]>
+
+        Prerenderering should gracefully handle no PrerendererClient or PrerenderingPlatform being provided.
+        https://bugs.webkit.org/show_bug.cgi?id=95036
+
+        Reviewed by Adam Barth.
+
+        Some assertions made sure there was a prerendering platform and client, and this change should make prerendering just be a NOP when no platform is provided, and just continue without a client when there is no client provided. These assertions were causing crashes in chromium's content_shell target, and really for no good reason.
+
+        No new tests, because DumpRenderTree provides both a PrerenderingPlatform and a PrerendererClient. But there is a new layout test in chromium's WebKitBrowserTest for this behaviour, see http://codereview.chromium.org/10869068/
+
+        * loader/Prerenderer.cpp:
+        (WebCore::Prerenderer::Prerenderer):
+        (WebCore::Prerenderer::render):
+        (WebCore::Prerenderer::client):
+        * loader/Prerenderer.h:
+        * loader/PrerendererClient.cpp:
+        (WebCore::PrerendererClient::from):
+        * platform/chromium/Prerender.cpp:
+        (WebCore::Prerender::cancel):
+
 2012-08-26  David Barton  <[email protected]>
 
         Streamline mathml.css

Modified: trunk/Source/WebCore/loader/Prerenderer.cpp (126713 => 126714)


--- trunk/Source/WebCore/loader/Prerenderer.cpp	2012-08-26 21:11:54 UTC (rev 126713)
+++ trunk/Source/WebCore/loader/Prerenderer.cpp	2012-08-26 22:15:35 UTC (rev 126714)
@@ -59,6 +59,7 @@
 
 Prerenderer::Prerenderer(Document* document)
     : ActiveDOMObject(document, this)
+    , m_initializedClient(false)
     , m_client(0)
 {
 }
@@ -80,7 +81,8 @@
 
     RefPtr<PrerenderHandle> prerenderHandle = PrerenderHandle::create(url, referrer, referrerPolicy);
 
-    client()->willAddPrerender(prerenderHandle.get());
+    if (client())
+        client()->willAddPrerender(prerenderHandle.get());
     prerenderHandle->add();
 
     m_activeHandles.append(prerenderHandle);
@@ -131,8 +133,12 @@
 
 PrerendererClient* Prerenderer::client()
 {
-    if (!m_client)
+    if (!m_initializedClient) {
+        // We can't initialize the client in our contructor, because the platform might not have
+        // provided our supplement by then.
+        m_initializedClient = true;
         m_client = PrerendererClient::from(document()->page());
+    }
     return m_client;
 }
 

Modified: trunk/Source/WebCore/loader/Prerenderer.h (126713 => 126714)


--- trunk/Source/WebCore/loader/Prerenderer.h	2012-08-26 21:11:54 UTC (rev 126713)
+++ trunk/Source/WebCore/loader/Prerenderer.h	2012-08-26 22:15:35 UTC (rev 126714)
@@ -73,6 +73,7 @@
     Document* document();
     PrerendererClient* client();
 
+    bool m_initializedClient;
     PrerendererClient* m_client;
     HandleVector m_activeHandles;
     HandleVector m_suspendedHandles;

Modified: trunk/Source/WebCore/loader/PrerendererClient.cpp (126713 => 126714)


--- trunk/Source/WebCore/loader/PrerendererClient.cpp	2012-08-26 21:11:54 UTC (rev 126713)
+++ trunk/Source/WebCore/loader/PrerendererClient.cpp	2012-08-26 22:15:35 UTC (rev 126714)
@@ -51,7 +51,6 @@
 PrerendererClient* PrerendererClient::from(Page* page)
 {
     PrerendererClient* supplement = static_cast<PrerendererClient*>(Supplement<Page>::from(page, supplementName()));
-    ASSERT(supplement);
     return supplement;
 }
 

Modified: trunk/Source/WebCore/platform/chromium/Prerender.cpp (126713 => 126714)


--- trunk/Source/WebCore/platform/chromium/Prerender.cpp	2012-08-26 21:11:54 UTC (rev 126713)
+++ trunk/Source/WebCore/platform/chromium/Prerender.cpp	2012-08-26 22:15:35 UTC (rev 126714)
@@ -65,7 +65,6 @@
 
 void Prerender::cancel()
 {
-    ASSERT(WebKit::WebPrerenderingSupport::current());
     WebKit::WebPrerenderingSupport* platform = WebKit::WebPrerenderingSupport::current();
     if (!platform)
         return;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to