Title: [157984] trunk/Source/WebKit2
Revision
157984
Author
[email protected]
Date
2013-10-24 18:48:25 -0700 (Thu, 24 Oct 2013)

Log Message

Coalesce calls to viewStateDidChange
https://bugs.webkit.org/show_bug.cgi?id=123307

Reviewed by Tim Horton.

* UIProcess/API/mac/WKView.mm:
(-[WKView viewDidMoveToWindow]):
(-[WKView _windowDidOrderOffScreen:]):
(-[WKView _windowDidOrderOnScreen:]):
    - coalesce calls to viewStateDidChange
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::viewStateDidChange):
    - handle changes to view visibility & active state in correct order.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (157983 => 157984)


--- trunk/Source/WebKit2/ChangeLog	2013-10-25 01:46:44 UTC (rev 157983)
+++ trunk/Source/WebKit2/ChangeLog	2013-10-25 01:48:25 UTC (rev 157984)
@@ -1,3 +1,19 @@
+2013-10-24  Gavin Barraclough  <[email protected]>
+
+        Coalesce calls to viewStateDidChange
+        https://bugs.webkit.org/show_bug.cgi?id=123307
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView viewDidMoveToWindow]):
+        (-[WKView _windowDidOrderOffScreen:]):
+        (-[WKView _windowDidOrderOnScreen:]):
+            - coalesce calls to viewStateDidChange
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::viewStateDidChange):
+            - handle changes to view visibility & active state in correct order.
+
 2013-10-24  Mark Rowe  <[email protected]>
 
         <rdar://problem/15312643> Prepare for the mysterious future.

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (157983 => 157984)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm	2013-10-25 01:46:44 UTC (rev 157983)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm	2013-10-25 01:48:25 UTC (rev 157984)
@@ -1923,20 +1923,16 @@
 
 - (void)viewDidMoveToWindow
 {
-    // We want to make sure to update the active state while hidden, so if the view is about to become visible, we
-    // update the active state first and then make it visible. If the view is about to be hidden, we hide it first and then
-    // update the active state.
     if ([self window]) {
         _data->_windowHasValidBackingStore = NO;
         [self doWindowDidChangeScreen];
-        _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible);
-        _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
 
-        if ([self isDeferringViewInWindowChanges]) {
-            _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
+        WebPageProxy::ViewStateFlags viewStateChanges = WebPageProxy::WindowIsVisible | WebPageProxy::ViewWindowIsActive | WebPageProxy::ViewIsVisible;
+        if ([self isDeferringViewInWindowChanges])
             _data->_viewInWindowChangeWasDeferred = YES;
-        } else
-            _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible | WebPageProxy::ViewIsInWindow);
+        else
+            viewStateChanges |= WebPageProxy::ViewIsInWindow;
+        _data->_page->viewStateDidChange(viewStateChanges);
 
         [self _updateWindowAndViewFrames];
 
@@ -1949,14 +1945,12 @@
 
         [self _accessibilityRegisterUIProcessTokens];
     } else {
-        _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible);
-        _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
-
-        if ([self isDeferringViewInWindowChanges]) {
-            _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
+        WebPageProxy::ViewStateFlags viewStateChanges = WebPageProxy::WindowIsVisible | WebPageProxy::ViewWindowIsActive | WebPageProxy::ViewIsVisible;
+        if ([self isDeferringViewInWindowChanges])
             _data->_viewInWindowChangeWasDeferred = YES;
-        } else
-            _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive | WebPageProxy::ViewIsInWindow);
+        else
+            viewStateChanges |= WebPageProxy::ViewIsInWindow;
+        _data->_page->viewStateDidChange(viewStateChanges);
 
         [NSEvent removeMonitor:_data->_flagsChangedEventMonitor];
         _data->_flagsChangedEventMonitor = nil;
@@ -2020,20 +2014,12 @@
 
 - (void)_windowDidOrderOffScreen:(NSNotification *)notification
 {
-    // We want to make sure to update the active state while hidden, so since the view is about to be hidden,
-    // we hide it first and then update the active state.
-    _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible);
-    _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
-    _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
+    _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible | WebPageProxy::ViewIsVisible | WebPageProxy::ViewWindowIsActive);
 }
 
 - (void)_windowDidOrderOnScreen:(NSNotification *)notification
 {
-    // We want to make sure to update the active state while hidden, so since the view is about to become visible,
-    // we update the active state first and then make it visible.
-    _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible);
-    _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
-    _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
+    _data->_page->viewStateDidChange(WebPageProxy::WindowIsVisible | WebPageProxy::ViewIsVisible | WebPageProxy::ViewWindowIsActive);
 }
 
 - (void)_windowDidChangeBackingProperties:(NSNotification *)notification

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (157983 => 157984)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2013-10-25 01:46:44 UTC (rev 157983)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2013-10-25 01:48:25 UTC (rev 157984)
@@ -1002,7 +1002,11 @@
     if (flags & ViewIsFocused)
         m_process->send(Messages::WebPage::SetFocused(m_pageClient->isViewFocused()), m_pageID);
 
-    if (flags & ViewWindowIsActive)
+    // We want to make sure to update the active state while hidden, so if the view is hidden then update the active state
+    // early (in case it becomes visible), and if the view was visible then update active state later (in case it hides).
+    bool viewWasVisible = m_isVisible;
+    
+    if (flags & ViewWindowIsActive && !viewWasVisible)
         m_process->send(Messages::WebPage::SetActive(m_pageClient->isViewWindowActive()), m_pageID);
 
     if (flags & ViewIsVisible) {
@@ -1026,6 +1030,9 @@
         }
     }
 
+    if (flags & ViewWindowIsActive && viewWasVisible)
+        m_process->send(Messages::WebPage::SetActive(m_pageClient->isViewWindowActive()), m_pageID);
+
     if (flags & ViewIsInWindow)
         viewInWindowStateDidChange();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to