Changeset 162452 in webkit
- Timestamp:
- Jan 21, 2014 11:02:08 AM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r162451 r162452 1 2014-01-21 Gavin Barraclough <barraclough@apple.com> 2 3 Change Page, FocusController to use ViewState 4 https://bugs.webkit.org/show_bug.cgi?id=126533 5 6 Reviewed by Tim Horton. 7 8 These classes currently maintain a set of separate fields to represent the view state; 9 combine these into a single field, and allow WebPage to send the combined update rather 10 than individual changes. 11 12 Maintain existing interface for WebKit1 clients. 13 14 * WebCore.exp.in: 15 - Added WebCore::setViewState, removed WebCore::setIsVisuallyIdle. 16 * page/FocusController.cpp: 17 (WebCore::FocusController::FocusController): 18 - Initialize combined m_viewState. 19 (WebCore::FocusController::setFocused): 20 - Calls setViewState. 21 (WebCore::FocusController::setFocusedInternal): 22 - setFocused -> setFocusedInternal. 23 (WebCore::FocusController::setViewState): 24 - Added, update all ViewState flags. 25 (WebCore::FocusController::setActive): 26 - Calls setViewState. 27 (WebCore::FocusController::setActiveInternal): 28 - setActive -> setActiveInternal. 29 (WebCore::FocusController::setContentIsVisible): 30 - Calls setViewState. 31 (WebCore::FocusController::setContentIsVisibleInternal): 32 - setContentIsVisible -> setContentIsVisibleInternal. 33 * page/FocusController.h: 34 (WebCore::FocusController::isActive): 35 (WebCore::FocusController::isFocused): 36 (WebCore::FocusController::contentIsVisible): 37 - Implemented in terms of ViewState. 38 * page/Page.cpp: 39 (WebCore::Page::Page): 40 - Initialize using PageInitialViewState. 41 (WebCore::Page::setIsInWindow): 42 - Calls setViewState. 43 (WebCore::Page::setIsInWindowInternal): 44 - setIsInWindow -> setIsInWindowInternal. 45 (WebCore::Page::setIsVisuallyIdleInternal): 46 - setIsVisuallyIdle -> setIsVisuallyIdleInternal. 47 (WebCore::Page::setViewState): 48 - Added, update all ViewState flags, including FocusController. 49 (WebCore::Page::setIsVisible): 50 - Calls setViewState. 51 (WebCore::Page::setIsVisibleInternal): 52 - setIsVisible -> setIsVisibleInternal. 53 (WebCore::Page::visibilityState): 54 - m_isVisible -> isVisible() 55 (WebCore::Page::hiddenPageCSSAnimationSuspensionStateChanged): 56 - m_isVisible -> isVisible() 57 * page/Page.h: 58 (WebCore::Page::isVisible): 59 (WebCore::Page::isInWindow): 60 - Implemented in terms of ViewState. 61 (WebCore::Page::scriptedAnimationsSuspended): 62 - Combined member fields into ViewState::Flags. 63 1 64 2014-01-21 Lauro Neto <lauro.neto@openbossa.org> 2 65 -
trunk/Source/WebCore/WebCore.exp.in
r162396 r162452 485 485 __ZN7WebCore15FocusController15setInitialFocusENS_14FocusDirectionEPNS_13KeyboardEventE 486 486 __ZN7WebCore15FocusController17setFocusedElementEPNS_7ElementEN3WTF10PassRefPtrINS_5FrameEEENS_14FocusDirectionE 487 __ZN7WebCore15FocusController19setContentIsVisibleEb488 487 __ZN7WebCore15FocusController9setActiveEb 489 488 __ZN7WebCore15GraphicsContext10strokeRectERKNS_9FloatRectEf … … 976 975 __ZN7WebCore4Page12setGroupNameERKN3WTF6StringE 977 976 __ZN7WebCore4Page12setIsVisibleEbb 977 __ZN7WebCore4Page12setViewStateEjb 978 978 __ZN7WebCore4Page13rangeOfStringERKN3WTF6StringEPNS_5RangeEj 979 979 __ZN7WebCore4Page13setIsInWindowEb … … 985 985 __ZN7WebCore4Page16setCanStartMediaEb 986 986 __ZN7WebCore4Page16setDefersLoadingEb 987 __ZN7WebCore4Page17setIsVisuallyIdleEb988 987 __ZN7WebCore4Page18removeSchedulePairEN3WTF10PassRefPtrINS1_12SchedulePairEEE 989 988 __ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointE -
trunk/Source/WebCore/page/FocusController.cpp
r162107 r162452 159 159 } 160 160 161 FocusController::FocusController(Page& page )161 FocusController::FocusController(Page& page, ViewState::Flags viewState) 162 162 : m_page(page) 163 , m_isActive(false)164 , m_isFocused(false)165 163 , m_isChangingFocusedFrame(false) 166 , m_ contentIsVisible(false)164 , m_viewState(viewState) 167 165 { 168 166 } … … 206 204 void FocusController::setFocused(bool focused) 207 205 { 208 if (isFocused() == focused)209 return; 210 211 m_isFocused = focused; 212 213 if (! m_isFocused)206 m_page.setViewState(focused ? m_viewState | ViewState::IsFocused : m_viewState & ~ViewState::IsFocused); 207 } 208 209 void FocusController::setFocusedInternal(bool focused) 210 { 211 if (!isFocused()) 214 212 focusedOrMainFrame().eventHandler().stopAutoscrollTimer(); 215 213 … … 636 634 } 637 635 636 void FocusController::setViewState(ViewState::Flags viewState) 637 { 638 ViewState::Flags changed = m_viewState ^ viewState; 639 m_viewState = viewState; 640 641 if (changed & ViewState::IsFocused) 642 setFocusedInternal(viewState & ViewState::IsFocused); 643 if (changed & ViewState::WindowIsActive) 644 setActiveInternal(viewState & ViewState::WindowIsActive); 645 if (changed & ViewState::IsVisible) 646 setIsVisibleInternal(viewState & ViewState::IsVisible); 647 } 648 638 649 void FocusController::setActive(bool active) 639 650 { 640 if (m_isActive == active)641 return; 642 643 m_isActive = active; 644 651 m_page.setViewState(active ? m_viewState | ViewState::WindowIsActive : m_viewState & ~ViewState::WindowIsActive); 652 } 653 654 void FocusController::setActiveInternal(bool active) 655 { 645 656 if (FrameView* view = m_page.mainFrame().view()) { 646 657 if (!view->platformWidget()) { … … 664 675 } 665 676 666 void FocusController::setContentIsVisible(bool contentIsVisible) 667 { 668 if (m_contentIsVisible == contentIsVisible) 669 return; 670 671 m_contentIsVisible = contentIsVisible; 672 677 void FocusController::setIsVisibleInternal(bool contentIsVisible) 678 { 673 679 FrameView* view = m_page.mainFrame().view(); 674 680 if (!view) -
trunk/Source/WebCore/page/FocusController.h
r162107 r162452 29 29 #include "FocusDirection.h" 30 30 #include "LayoutRect.h" 31 #include "ViewState.h" 31 32 #include <wtf/Forward.h> 32 33 #include <wtf/Noncopyable.h> … … 63 64 WTF_MAKE_NONCOPYABLE(FocusController); WTF_MAKE_FAST_ALLOCATED; 64 65 public: 65 explicit FocusController(Page& );66 explicit FocusController(Page&, ViewState::Flags); 66 67 67 68 void setFocusedFrame(PassRefPtr<Frame>); … … 74 75 bool setFocusedElement(Element*, PassRefPtr<Frame>, FocusDirection = FocusDirectionNone); 75 76 77 void setViewState(ViewState::Flags); 78 76 79 void setActive(bool); 77 bool isActive() const { return m_ isActive; }80 bool isActive() const { return m_viewState & ViewState::WindowIsActive; } 78 81 79 82 void setFocused(bool); 80 bool isFocused() const { return m_ isFocused; }83 bool isFocused() const { return m_viewState & ViewState::IsFocused; } 81 84 82 void setContentIsVisible(bool);85 bool contentIsVisible() const { return m_viewState & ViewState::IsVisible; } 83 86 84 87 // These methods are used in WebCore/bindings/objc/DOM.mm. … … 87 90 88 91 private: 92 void setActiveInternal(bool); 93 void setFocusedInternal(bool); 94 void setIsVisibleInternal(bool); 95 89 96 bool advanceFocusDirectionally(FocusDirection, KeyboardEvent*); 90 97 bool advanceFocusInDocumentOrder(FocusDirection, KeyboardEvent*, bool initialFocus); … … 112 119 Page& m_page; 113 120 RefPtr<Frame> m_focusedFrame; 114 bool m_isActive;115 bool m_isFocused;116 121 bool m_isChangingFocusedFrame; 117 bool m_contentIsVisible; 118 122 ViewState::Flags m_viewState; 119 123 }; 120 124 -
trunk/Source/WebCore/page/Page.cpp
r162380 r162452 125 125 } 126 126 127 static const ViewState::Flags PageInitialViewState = ViewState::IsVisible | ViewState::IsInWindow; 128 127 129 Page::Page(PageClients& pageClients) 128 130 : m_chrome(std::make_unique<Chrome>(*this, *pageClients.chromeClient)) … … 131 133 , m_dragController(std::make_unique<DragController>(*this, *pageClients.dragClient)) 132 134 #endif 133 , m_focusController(std::make_unique<FocusController>(*this ))135 , m_focusController(std::make_unique<FocusController>(*this, PageInitialViewState)) 134 136 #if ENABLE(CONTEXT_MENUS) 135 137 , m_contextMenuController(std::make_unique<ContextMenuController>(*this, *pageClients.contextMenuClient)) … … 173 175 , m_timerAlignmentInterval(Settings::defaultDOMTimerAlignmentInterval()) 174 176 , m_isEditable(false) 175 , m_isInWindow(true)176 , m_isVisible(true)177 177 , m_isPrerender(false) 178 , m_viewState(PageInitialViewState) 178 179 , m_requestedLayoutMilestones(0) 179 180 , m_headerHeight(0) … … 882 883 void Page::setIsInWindow(bool isInWindow) 883 884 { 884 if (m_isInWindow == isInWindow)885 return; 886 887 m_isInWindow = isInWindow; 888 885 setViewState(isInWindow ? m_viewState | ViewState::IsInWindow : m_viewState & ~ViewState::IsInWindow); 886 } 887 888 void Page::setIsInWindowInternal(bool isInWindow) 889 { 889 890 for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) { 890 891 if (FrameView* frameView = frame->view()) … … 914 915 } 915 916 916 void Page::setIsVisuallyIdle (bool isVisuallyIdle)917 void Page::setIsVisuallyIdleInternal(bool isVisuallyIdle) 917 918 { 918 919 m_pageThrottler->setIsVisuallyIdle(isVisuallyIdle); … … 1217 1218 } 1218 1219 1220 void Page::setViewState(ViewState::Flags viewState, bool isInitialState) 1221 { 1222 ViewState::Flags changed = m_viewState ^ viewState; 1223 m_viewState = viewState; 1224 1225 // We want to make sure to update the active state while hidden, so if the view is going 1226 // to be visible then update the focus controller first (it may currently still be hidden). 1227 if (changed && (m_viewState & ViewState::IsVisible)) 1228 m_focusController->setViewState(viewState); 1229 1230 if (changed & ViewState::IsVisible) 1231 setIsVisibleInternal(viewState & ViewState::IsVisible, isInitialState); 1232 if (changed & ViewState::IsInWindow) 1233 setIsInWindowInternal(viewState & ViewState::IsInWindow); 1234 if (changed & ViewState::IsVisuallyIdle) 1235 setIsVisuallyIdleInternal(viewState & ViewState::IsVisuallyIdle); 1236 1237 if (changed && !(m_viewState & ViewState::IsVisible)) 1238 m_focusController->setViewState(viewState); 1239 } 1240 1219 1241 void Page::setIsVisible(bool isVisible, bool isInitialState) 1242 { 1243 setViewState(isVisible ? m_viewState | ViewState::IsVisible : m_viewState & ~ViewState::IsVisible, isInitialState); 1244 } 1245 1246 void Page::setIsVisibleInternal(bool isVisible, bool isInitialState) 1220 1247 { 1221 1248 // FIXME: The visibility state should be stored on the top-level document. 1222 1249 // https://bugs.webkit.org/show_bug.cgi?id=116769 1223 1224 if (m_isVisible == isVisible)1225 return;1226 m_isVisible = isVisible;1227 1250 1228 1251 if (isVisible) { … … 1287 1310 PageVisibilityState Page::visibilityState() const 1288 1311 { 1289 if ( m_isVisible)1312 if (isVisible()) 1290 1313 return PageVisibilityStateVisible; 1291 1314 if (m_isPrerender) … … 1549 1572 void Page::hiddenPageCSSAnimationSuspensionStateChanged() 1550 1573 { 1551 if (! m_isVisible) {1574 if (!isVisible()) { 1552 1575 if (m_settings->hiddenPageCSSAnimationSuspensionEnabled()) 1553 1576 mainFrame().animation().suspendAnimations(); -
trunk/Source/WebCore/page/Page.h
r162380 r162452 32 32 #include "Region.h" 33 33 #include "Supplementable.h" 34 #include "ViewState.h" 34 35 #include "ViewportArguments.h" 35 36 #include <wtf/Forward.h> … … 298 299 299 300 // Notifications when the Page starts and stops being presented via a native window. 301 void setViewState(ViewState::Flags, bool isInitial = false); 300 302 void setIsVisible(bool isVisible, bool isInitial); 301 303 void setIsPrerender(); 302 bool isVisible() const { return m_ isVisible; }304 bool isVisible() const { return m_viewState & ViewState::IsVisible; } 303 305 304 306 // Notification that this Page was moved into or out of a native window. 305 307 void setIsInWindow(bool); 306 bool isInWindow() const { return m_ isInWindow; }308 bool isInWindow() const { return m_viewState & ViewState::IsInWindow; } 307 309 308 310 void suspendScriptedAnimations(); 309 311 void resumeScriptedAnimations(); 310 312 bool scriptedAnimationsSuspended() const { return m_scriptedAnimationsSuspended; } 311 void setIsVisuallyIdle(bool);312 313 313 314 void userStyleSheetLocationChanged(); … … 426 427 void initGroup(); 427 428 429 void setIsInWindowInternal(bool); 430 void setIsVisibleInternal(bool isVisible, bool isInitial); 431 void setIsVisuallyIdleInternal(bool); 432 428 433 #if ASSERT_DISABLED 429 434 void checkSubframeCountConsistency() const { } … … 529 534 530 535 bool m_isEditable; 531 bool m_isInWindow;532 bool m_isVisible;533 536 bool m_isPrerender; 537 ViewState::Flags m_viewState; 534 538 535 539 LayoutMilestones m_requestedLayoutMilestones; -
trunk/Source/WebKit/mac/ChangeLog
r162379 r162452 1 2014-01-21 Gavin Barraclough <barraclough@apple.com> 2 3 Change Page, FocusController to use ViewState 4 https://bugs.webkit.org/show_bug.cgi?id=126533 5 6 Reviewed by Tim Horton. 7 8 These classes currently maintain a set of separate fields to represent the view state; 9 combine these into a single field, and allow WebPage to send the combined update rather 10 than individual changes. 11 12 Maintain existing interface for WebKit1 clients. 13 14 * WebView/WebView.mm: 15 (-[WebView _windowWillOrderOnScreen:]): 16 (-[WebView _windowWillOrderOffScreen:]): 17 - remove calls to FocusController::setContentIsVisible, these are redundant 18 (this is handled when page visibility is set). 19 1 20 2014-01-20 Jeremy Jones <jeremyj@apple.com> 2 21 -
trunk/Source/WebKit/mac/WebView/WebView.mm
r162379 r162452 5372 5372 [self doWindowDidChangeScreen]; 5373 5373 5374 if (_private && _private->page) {5374 if (_private && _private->page) 5375 5375 _private->page->resumeScriptedAnimations(); 5376 _private->page->focusController().setContentIsVisible(true);5377 }5378 5376 } 5379 5377 … … 5385 5383 - (void)_windowWillOrderOffScreen:(NSNotification *)notification 5386 5384 { 5387 if (_private && _private->page) {5385 if (_private && _private->page) 5388 5386 _private->page->suspendScriptedAnimations(); 5389 _private->page->focusController().setContentIsVisible(false);5390 }5391 5387 } 5392 5388 -
trunk/Source/WebKit2/ChangeLog
r162449 r162452 1 2014-01-21 Gavin Barraclough <barraclough@apple.com> 2 3 Change Page, FocusController to use ViewState 4 https://bugs.webkit.org/show_bug.cgi?id=126533 5 6 Reviewed by Tim Horton. 7 8 These classes currently maintain a set of separate fields to represent the view state; 9 combine these into a single field, and allow WebPage to send the combined update rather 10 than individual changes. 11 12 Maintain existing interface for WebKit1 clients. 13 14 * WebProcess/WebPage/WebPage.cpp: 15 (WebKit::WebPage::WebPage): 16 - Combined separate calls to Page::setViewState. 17 (WebKit::WebPage::updateIsInWindow): 18 - Simplied from setIsInWindow. 19 (WebKit::WebPage::setViewState): 20 - Combined separate calls to Page::setViewState. 21 * WebProcess/WebPage/WebPage.h: 22 - Declare updateIsInWindow. 23 1 24 2014-01-21 Carlos Garcia Campos <cgarcia@igalia.com> 2 25 -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
r162141 r162452 374 374 setMemoryCacheMessagesEnabled(parameters.areMemoryCacheClientCallsEnabled); 375 375 376 setActive(parameters.viewState & ViewState::WindowIsActive); 377 setFocused(parameters.viewState & ViewState::IsFocused); 378 379 // Page defaults to in-window, but setIsInWindow depends on it being a valid indicator of actually having been put into a window. 380 bool isInWindow = parameters.viewState & ViewState::IsInWindow; 381 if (!isInWindow) 382 m_page->setIsInWindow(false); 383 else 384 WebProcess::shared().pageDidEnterWindow(m_pageID); 385 386 setIsInWindow(isInWindow); 376 m_page->setViewState(m_viewState, true); 377 updateIsInWindow(true); 387 378 388 379 setMinimumLayoutSize(parameters.minimumLayoutSize); … … 428 419 WebProcess::shared().eventDispatcher().addScrollingTreeForPage(this); 429 420 #endif 430 431 m_page->setIsVisible(m_viewState & ViewState::IsVisible, true);432 setIsVisuallyIdle(m_viewState & ViewState::IsVisuallyIdle);433 421 } 434 422 … … 1925 1913 } 1926 1914 1927 void WebPage::setActive(bool isActive)1928 {1929 m_page->focusController().setActive(isActive);1930 }1931 1932 void WebPage::setViewIsVisible(bool isVisible)1933 {1934 corePage()->focusController().setContentIsVisible(isVisible);1935 1936 m_page->setIsVisible(m_viewState & ViewState::IsVisible, false);1937 }1938 1939 1915 void WebPage::setDrawsBackground(bool drawsBackground) 1940 1916 { … … 1992 1968 } 1993 1969 1994 void WebPage::setFocused(bool isFocused)1995 {1996 m_page->focusController().setFocused(isFocused);1997 }1998 1999 1970 void WebPage::setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent& event) 2000 1971 { … … 2051 2022 } 2052 2023 2053 void WebPage:: setIsInWindow(bool isInWindow)2054 { 2055 bool pageWasInWindow = m_page->isInWindow();2056 2024 void WebPage::updateIsInWindow(bool isInitialState) 2025 { 2026 bool isInWindow = m_viewState & WebCore::ViewState::IsInWindow; 2027 2057 2028 if (!isInWindow) { 2058 2029 m_setCanStartMediaTimer.stop(); 2059 2030 m_page->setCanStartMedia(false); 2060 2031 2061 if (pageWasInWindow) 2032 // The WebProcess does not yet know about this page; no need to tell it we're leaving the window. 2033 if (!isInitialState) 2062 2034 WebProcess::shared().pageWillLeaveWindow(m_pageID); 2063 2035 } else { … … 2068 2040 m_setCanStartMediaTimer.startOneShot(0); 2069 2041 2070 if (!pageWasInWindow) 2071 WebProcess::shared().pageDidEnterWindow(m_pageID); 2072 } 2073 2074 m_page->setIsInWindow(isInWindow); 2042 WebProcess::shared().pageDidEnterWindow(m_pageID); 2043 } 2075 2044 2076 2045 if (isInWindow) … … 2092 2061 2093 2062 m_drawingArea->viewStateDidChange(changed); 2094 2095 // We want to make sure to update the active state while hidden, so if the view is hidden then update the active state 2096 // early (in case it becomes visible), and if the view was visible then update active state later (in case it hides). 2097 if (changed & ViewState::IsFocused) 2098 setFocused(viewState & ViewState::IsFocused); 2099 if (changed & ViewState::WindowIsActive && !(m_viewState & ViewState::IsVisible)) 2100 setActive(viewState & ViewState::WindowIsActive); 2101 if (changed & ViewState::IsVisible) 2102 setViewIsVisible(viewState & ViewState::IsVisible); 2103 if (changed & ViewState::WindowIsActive && m_viewState & ViewState::IsVisible) 2104 setActive(viewState & ViewState::WindowIsActive); 2105 if (changed & ViewState::IsInWindow) 2106 setIsInWindow(viewState & ViewState::IsInWindow); 2107 if (changed & ViewState::IsVisuallyIdle) 2108 setIsVisuallyIdle(viewState & ViewState::IsVisuallyIdle); 2109 2063 m_page->setViewState(viewState, isInitialState); 2110 2064 for (auto* pluginView : m_pluginViews) 2111 2065 pluginView->viewStateDidChange(changed); 2066 2067 if (changed & ViewState::IsInWindow) 2068 updateIsInWindow(); 2112 2069 } 2113 2070 … … 3713 3670 } 3714 3671 3715 void WebPage::setIsVisuallyIdle(bool isVisuallyIdle)3716 {3717 m_page->setIsVisuallyIdle(isVisuallyIdle);3718 }3719 3720 3672 void WebPage::setScrollingPerformanceLoggingEnabled(bool enabled) 3721 3673 { -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h
r162141 r162452 738 738 void setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&); 739 739 void setWindowResizerSize(const WebCore::IntSize&); 740 void setIsInWindow(bool); 741 void setIsVisuallyIdle(bool); 740 void updateIsInWindow(bool isInitialState = false); 742 741 void setViewState(WebCore::ViewState::Flags, bool wantsDidUpdateViewState); 743 742 void setViewStateInternal(WebCore::ViewState::Flags, bool isInitialState);
Note: See TracChangeset
for help on using the changeset viewer.