[Qt][WK2] Crash on window resize if WebProcess is closed/crashed
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 16 Feb 2013 01:42:13 +0000 (01:42 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 16 Feb 2013 01:42:13 +0000 (01:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=109216

Patch by Adenilson Cavalcanti <cavalcantii@gmail.com> on 2013-02-15
Reviewed by Benjamin Poulain.

Only make calls into DrawingAreaProxy pointer after checking its state.

When the WebProcess was closed or crashed, WebKit::WebPageProxy will set
its DrawingAreaProxy pointer to null. Resize events on UIProcess/client will
try to access the object to update the geometry and forward this information
into the WebProcess. This would create a crash scenario that is fixed by this patch.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewPrivate::didRelaunchProcess):
(QQuickWebViewLegacyPrivate::updateViewportSize):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@143077 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp

index fb6014add71aa26684df004a0d0de2145b52b59b..3b8c8c3200b650761eef7b6a621fe75ed63fc433 100644 (file)
@@ -1,3 +1,21 @@
+2013-02-15  Adenilson Cavalcanti  <cavalcantii@gmail.com>
+
+        [Qt][WK2] Crash on window resize if WebProcess is closed/crashed
+        https://bugs.webkit.org/show_bug.cgi?id=109216
+
+        Reviewed by Benjamin Poulain.
+
+        Only make calls into DrawingAreaProxy pointer after checking its state.
+
+        When the WebProcess was closed or crashed, WebKit::WebPageProxy will set
+        its DrawingAreaProxy pointer to null. Resize events on UIProcess/client will
+        try to access the object to update the geometry and forward this information
+        into the WebProcess. This would create a crash scenario that is fixed by this patch.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewPrivate::didRelaunchProcess):
+        (QQuickWebViewLegacyPrivate::updateViewportSize):
+
 2013-02-15  Anders Carlsson  <andersca@apple.com>
 
         Add HashMap::isValidKey and HashSet::isValidValue
index 1a7da43d1d69682d3036491fc83eab6bf833b81e..7973f989ccabc1f941f6d1012c99fa49e094dd9c 100644 (file)
@@ -585,11 +585,13 @@ void QQuickWebViewPrivate::didRelaunchProcess()
 {
     qWarning("WARNING: The web process has been successfully restarted.");
 
-    webPageProxy->drawingArea()->setSize(viewSize(), IntSize());
+    if (DrawingAreaProxy *drawingArea = webPageProxy->drawingArea()) {
+        drawingArea->setSize(viewSize(), IntSize());
 
-    updateViewportSize();
-    updateUserScripts();
-    updateSchemeDelegates();
+        updateViewportSize();
+        updateUserScripts();
+        updateSchemeDelegates();
+    }
 }
 
 PassOwnPtr<DrawingAreaProxy> QQuickWebViewPrivate::createDrawingAreaProxy()
@@ -938,13 +940,15 @@ void QQuickWebViewLegacyPrivate::updateViewportSize()
 
     pageView->setContentsSize(viewportSize);
 
-    // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently
-    // whether its fixed or not. We still need to tell the drawing area which part of it
-    // has to be rendered on tiles, and in desktop mode it's all of it.
-    webPageProxy->drawingArea()->setSize(viewportSize.toSize(), IntSize());
-    // The backing store scale factor should already be set to the device pixel ratio
-    // of the underlying window, thus we set the effective scale to 1 here.
-    webPageProxy->drawingArea()->setVisibleContentsRect(FloatRect(FloatPoint(), FloatSize(viewportSize)), FloatPoint());
+    if (DrawingAreaProxy *drawingArea = webPageProxy->drawingArea()) {
+        // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently
+        // whether its fixed or not. We still need to tell the drawing area which part of it
+        // has to be rendered on tiles, and in desktop mode it's all of it.
+        drawingArea->setSize(viewportSize.toSize(), IntSize());
+        // The backing store scale factor should already be set to the device pixel ratio
+        // of the underlying window, thus we set the effective scale to 1 here.
+        drawingArea->setVisibleContentsRect(FloatRect(FloatPoint(), FloatSize(viewportSize)), FloatPoint());
+    }
 }
 
 qreal QQuickWebViewLegacyPrivate::zoomFactor() const