Fix rare crash under ScrollbarThemeMac::paintScrollCorner()
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Jan 2019 22:50:13 +0000 (22:50 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Jan 2019 22:50:13 +0000 (22:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193337
rdar://problem/47179993

Reviewed by Zalan Bujtas.

Async image decoding can trigger a FrameView::traverseForPaintInvalidation() fake paint,
which creates a GraphicsContext with no platform context. However, we could hit ScrollView::paintScrollbars()
which tried to get at the platform context, and then crashed.

So protect two functions in ScrollbarThemeMac with if (context.paintingDisabled()) checks. I verified
that other scrollbar-related painting code paths were already protected.

Hard to test because it depends on async image decoding timing.

* platform/mac/ScrollbarThemeMac.mm:
(WebCore::ScrollbarThemeMac::paint):
(WebCore::ScrollbarThemeMac::paintScrollCorner):

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

Source/WebCore/ChangeLog
Source/WebCore/platform/mac/ScrollbarThemeMac.mm

index ee2b684..8364589 100644 (file)
@@ -1,3 +1,24 @@
+2019-01-10  Simon Fraser  <simon.fraser@apple.com>
+
+        Fix rare crash under ScrollbarThemeMac::paintScrollCorner()
+        https://bugs.webkit.org/show_bug.cgi?id=193337
+        rdar://problem/47179993
+
+        Reviewed by Zalan Bujtas.
+        
+        Async image decoding can trigger a FrameView::traverseForPaintInvalidation() fake paint,
+        which creates a GraphicsContext with no platform context. However, we could hit ScrollView::paintScrollbars()
+        which tried to get at the platform context, and then crashed.
+        
+        So protect two functions in ScrollbarThemeMac with if (context.paintingDisabled()) checks. I verified
+        that other scrollbar-related painting code paths were already protected.
+
+        Hard to test because it depends on async image decoding timing.
+
+        * platform/mac/ScrollbarThemeMac.mm:
+        (WebCore::ScrollbarThemeMac::paint):
+        (WebCore::ScrollbarThemeMac::paintScrollCorner):
+
 2019-01-10  Myles C. Maxfield  <mmaxfield@apple.com>
 
         [WHLSL] Implement parser AST nodes
index e2caa6e..b5d926a 100644 (file)
@@ -550,6 +550,9 @@ static void scrollerImpPaint(NSScrollerImp *scrollerImp, bool enabled)
 
 bool ScrollbarThemeMac::paint(Scrollbar& scrollbar, GraphicsContext& context, const IntRect& damageRect)
 {
+    if (context.paintingDisabled())
+        return false;
+
     setPaintCharacteristicsForScrollbar(scrollbar);
 
     if (scrollbar.supportsUpdateOnSecondaryThread())
@@ -568,6 +571,9 @@ bool ScrollbarThemeMac::paint(Scrollbar& scrollbar, GraphicsContext& context, co
 
 void ScrollbarThemeMac::paintScrollCorner(GraphicsContext& context, const IntRect& cornerRect)
 {
+    if (context.paintingDisabled())
+        return;
+
     LocalCurrentGraphicsContext localContext(context);
 
     auto cornerDrawingOptions = @{ (__bridge NSString *)kCUIWidgetKey: (__bridge NSString *)kCUIWidgetScrollBarTrackCorner,