Changeset 158372 in webkit
- Timestamp:
- Oct 31, 2013 11:05:25 AM (10 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r158369 r158372 1 2013-10-31 Gavin Barraclough <barraclough@apple.com> 2 3 Change WebPage, WebPageProxy, WebPageCreationParameters to use ViewState 4 https://bugs.webkit.org/show_bug.cgi?id=123379 5 6 Reviewed by Darin Adler. 7 8 Visibility state of the Page should be stored and communicated consistently. 9 10 Remove individual visibility flags from WebPageProxy, WebPageCreationParameters, 11 and replace them with a ViewState, and add a ViewState member to WebPage. 12 Merge together all messages that convey and individual aspect of the ViewState. 13 14 Restructure WebPageProxy::viewStateDidChange to break the operation down into 15 three steps: 1) update m_viewState, 2) send the new ViewState to the WebProcess, 16 and 3) perform any further work necessary in the UIProcess. 17 18 This patch fixes a problem that if the web process crashes m_isVisible & 19 m_isInWindow in WebPageProxy were not updated, and could have held stale values 20 on reattach. 21 22 In WebPage, add a new message to update the entire ViewState - diff the prior 23 value against the new one to detect changes, call existing methods accordingly. 24 25 * Shared/ViewState.h: 26 - Add constants 'Reset', 'AllFlags' 27 * Shared/WebPageCreationParameters.cpp: 28 (WebKit::WebPageCreationParameters::encode): 29 (WebKit::WebPageCreationParameters::decode): 30 * Shared/WebPageCreationParameters.h: 31 - Removed boolean visibility flags, added viewState. 32 * UIProcess/WebPageProxy.cpp: 33 (WebKit::WebPageProxy::WebPageProxy): 34 - Constructor calls updateViewState to initialize m_viewState. 35 (WebKit::WebPageProxy::reattachToWebProcess): 36 - ViewStaet is not updated while detatched; recalculate. 37 (WebKit::WebPageProxy::initializeWebPage): 38 - m_isVisible -> isViewVisible() 39 (WebKit::WebPageProxy::updateViewState): 40 - Added, update m_viewState by querying the page client. 41 (WebKit::WebPageProxy::viewStateDidChange): 42 - Restructured to use m_viewState, reordered to combine messages. 43 (WebKit::WebPageProxy::creationParameters): 44 - Removed boolean visibility flags, added viewState. 45 * UIProcess/WebPageProxy.h: 46 (WebKit::WebPageProxy::isInWindow): 47 (WebKit::WebPageProxy::isViewVisible): 48 - Removed boolean visibility flags, added viewState. 49 * WebProcess/WebPage/WebPage.cpp: 50 (WebKit::WebPage::WebPage): 51 - initial state now passed as a ViewState. 52 (WebKit::WebPage::setIsInWindow): 53 - Remove code to send reply (this is handled by setViewState). 54 (WebKit::WebPage::setViewState): 55 - Set m_viewState - diff from prior & call methods to update. 56 * WebProcess/WebPage/WebPage.h: 57 - Added setViewState, m_viewState. 58 * WebProcess/WebPage/WebPage.messages.in: 59 - Add SetViewState, remove individual messages. 60 * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: 61 (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea): 62 - initial state now passed as a ViewState. 63 1 64 2013-10-30 Gavin Barraclough <barraclough@apple.com> 2 65 -
trunk/Source/WebKit2/Shared/ViewState.h
r158028 r158372 37 37 WindowIsVisible = 1 << 4 38 38 }; 39 39 40 typedef unsigned Flags; 41 42 static const Flags NoFlags = 0; 43 static const Flags AllFlags = WindowIsActive | IsFocused | IsVisible | IsInWindow | WindowIsVisible; 40 44 }; 41 45 -
trunk/Source/WebKit2/Shared/WebPageCreationParameters.cpp
r153378 r158372 34 34 { 35 35 encoder << viewSize; 36 encoder << isActive; 37 encoder << isFocused; 38 encoder << isVisible; 39 encoder << isInWindow; 36 encoder << viewState; 40 37 41 38 encoder << store; … … 74 71 if (!decoder.decode(parameters.viewSize)) 75 72 return false; 76 if (!decoder.decode(parameters.isActive)) 77 return false; 78 if (!decoder.decode(parameters.isFocused)) 79 return false; 80 if (!decoder.decode(parameters.isVisible)) 81 return false; 82 if (!decoder.decode(parameters.isInWindow)) 73 if (!decoder.decode(parameters.viewState)) 83 74 return false; 84 75 if (!decoder.decode(parameters.store)) -
trunk/Source/WebKit2/Shared/WebPageCreationParameters.h
r158210 r158372 30 30 #include "LayerTreeContext.h" 31 31 #include "SessionState.h" 32 #include "ViewState.h" 32 33 #include "WebCoreArgumentCoders.h" 33 34 #include "WebPageGroupData.h" … … 56 57 WebCore::IntSize viewSize; 57 58 58 bool isActive; 59 bool isFocused; 60 bool isVisible; 61 bool isInWindow; 59 ViewState::Flags viewState; 62 60 63 61 WebPreferencesStore store; -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r158369 r158372 239 239 , m_notificationPermissionRequestManager(this) 240 240 , m_estimatedProgress(0) 241 , m_isInWindow(m_pageClient->isViewInWindow()) 242 , m_isVisible(m_pageClient->isViewVisible()) 241 , m_viewState(ViewState::NoFlags) 243 242 , m_backForwardList(WebBackForwardList::create(this)) 244 243 , m_loadStateAtProcessExit(WebFrameProxy::LoadStateFinished) … … 320 319 , m_scrollPinningBehavior(DoNotPin) 321 320 { 321 updateViewState(); 322 322 323 platformInitialize(); 323 324 324 325 #if ENABLE(PAGE_VISIBILITY_API) 325 if ( !m_isVisible)326 if (isViewVisible()) 326 327 m_visibilityState = PageVisibilityStateHidden; 327 328 #endif … … 471 472 ASSERT(!m_process->isLaunching()); 472 473 474 updateViewState(); 475 473 476 m_isValid = true; 474 477 … … 529 532 m_process->send(Messages::WebPage::SetVisibilityState(m_visibilityState, /* isInitialState */ true), m_pageID); 530 533 #elif ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) 531 m_process->send(Messages::WebPage::SetVisibilityState( m_isVisible? PageVisibilityStateVisible : PageVisibilityStateHidden, /* isInitialState */ true), m_pageID);534 m_process->send(Messages::WebPage::SetVisibilityState(isViewVisible() ? PageVisibilityStateVisible : PageVisibilityStateHidden, /* isInitialState */ true), m_pageID); 532 535 #endif 533 536 … … 966 969 } 967 970 971 void WebPageProxy::updateViewState(ViewState::Flags flagsToUpdate) 972 { 973 m_viewState &= ~flagsToUpdate; 974 if (flagsToUpdate & ViewState::WindowIsVisible && m_pageClient->isWindowVisible()) 975 m_viewState |= ViewState::WindowIsVisible; 976 if (flagsToUpdate & ViewState::IsFocused && m_pageClient->isViewFocused()) 977 m_viewState |= ViewState::IsFocused; 978 if (flagsToUpdate & ViewState::WindowIsActive && m_pageClient->isViewWindowActive()) 979 m_viewState |= ViewState::WindowIsActive; 980 if (flagsToUpdate & ViewState::IsVisible && m_pageClient->isViewVisible()) 981 m_viewState |= ViewState::IsVisible; 982 if (flagsToUpdate & ViewState::IsInWindow && m_pageClient->isViewInWindow()) 983 m_viewState |= ViewState::IsInWindow; 984 } 985 968 986 void WebPageProxy::viewStateDidChange(ViewState::Flags mayHaveChanged, WantsReplyOrNot wantsReply) 969 987 { 970 // Wants reply currently only applies to the IsInWindow flag, so check only this is set. 971 ASSERT(wantsReply == WantsReplyOrNot::DoesNotWantReply || mayHaveChanged == ViewState::IsInWindow); 972 973 if (!isValid()) 974 return; 975 976 if (mayHaveChanged & ViewState::WindowIsVisible) 977 process()->send(Messages::WebPage::SetWindowIsVisible(m_pageClient->isWindowVisible()), m_pageID); 978 979 if (mayHaveChanged & ViewState::IsFocused) 980 m_process->send(Messages::WebPage::SetFocused(m_pageClient->isViewFocused()), m_pageID); 981 982 // We want to make sure to update the active state while hidden, so if the view is hidden then update the active state 983 // early (in case it becomes visible), and if the view was visible then update active state later (in case it hides). 984 bool viewWasVisible = m_isVisible; 985 986 if (mayHaveChanged & ViewState::WindowIsActive && !viewWasVisible) 987 m_process->send(Messages::WebPage::SetActive(m_pageClient->isViewWindowActive()), m_pageID); 988 989 if (mayHaveChanged & ViewState::IsVisible) { 990 bool isVisible = m_pageClient->isViewVisible(); 991 if (isVisible != m_isVisible) { 992 m_isVisible = isVisible; 993 m_process->pageVisibilityChanged(this); 994 m_process->send(Messages::WebPage::SetViewIsVisible(isVisible), m_pageID); 995 996 if (!m_isVisible) { 997 // If we've started the responsiveness timer as part of telling the web process to update the backing store 998 // state, it might not send back a reply (since it won't paint anything if the web page is hidden) so we 999 // stop the unresponsiveness timer here. 1000 m_process->responsivenessTimer()->stop(); 1001 } 1002 1003 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) && !ENABLE(PAGE_VISIBILITY_API) 1004 PageVisibilityState visibilityState = m_isVisible ? PageVisibilityStateVisible : PageVisibilityStateHidden; 1005 m_process->send(Messages::WebPage::SetVisibilityState(visibilityState, false), m_pageID); 1006 #endif 988 if (!isValid()) 989 return; 990 991 // Record the prior view state, update the flags that may have changed, 992 // and check which flags have actually changed. 993 ViewState::Flags previousViewState = m_viewState; 994 updateViewState(mayHaveChanged); 995 ViewState::Flags changed = m_viewState ^ previousViewState; 996 997 if (changed) 998 m_process->send(Messages::WebPage::SetViewState(m_viewState, wantsReply == WantsReplyOrNot::DoesWantReply), m_pageID); 999 1000 if (changed & ViewState::IsVisible) { 1001 m_process->pageVisibilityChanged(this); 1002 1003 if (!isViewVisible()) { 1004 // If we've started the responsiveness timer as part of telling the web process to update the backing store 1005 // state, it might not send back a reply (since it won't paint anything if the web page is hidden) so we 1006 // stop the unresponsiveness timer here. 1007 m_process->responsivenessTimer()->stop(); 1007 1008 } 1008 } 1009 1010 if (mayHaveChanged & ViewState::WindowIsActive && viewWasVisible) 1011 m_process->send(Messages::WebPage::SetActive(m_pageClient->isViewWindowActive()), m_pageID); 1009 1010 #if ENABLE(PAGE_VISIBILITY_API) 1011 m_visibilityState = isViewVisible() ? PageVisibilityStateVisible : PageVisibilityStateHidden; 1012 m_process->send(Messages::WebPage::SetVisibilityState(m_visibilityState, false), m_pageID); 1013 #elif ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) 1014 PageVisibilityState visibilityState = isViewVisible() ? PageVisibilityStateVisible : PageVisibilityStateHidden; 1015 m_process->send(Messages::WebPage::SetVisibilityState(visibilityState, false), m_pageID); 1016 #endif 1017 } 1012 1018 1013 1019 if (mayHaveChanged & ViewState::IsInWindow) { 1014 bool isInWindow = m_pageClient->isViewInWindow(); 1015 if (m_isInWindow != isInWindow) { 1016 m_isInWindow = isInWindow; 1017 m_process->send(Messages::WebPage::SetIsInWindow(isInWindow, wantsReply == WantsReplyOrNot::DoesWantReply), m_pageID); 1018 } 1019 1020 if (isInWindow) { 1020 if (m_viewState & ViewState::IsInWindow) { 1021 1021 LayerHostingMode layerHostingMode = m_pageClient->viewLayerHostingMode(); 1022 1022 if (m_layerHostingMode != layerHostingMode) { … … 1033 1033 #endif 1034 1034 } 1035 1036 #if ENABLE(PAGE_VISIBILITY_API)1037 PageVisibilityState visibilityState = PageVisibilityStateHidden;1038 1039 if (m_isVisible)1040 visibilityState = PageVisibilityStateVisible;1041 1042 if (visibilityState != m_visibilityState) {1043 m_visibilityState = visibilityState;1044 m_process->send(Messages::WebPage::SetVisibilityState(visibilityState, false), m_pageID);1045 }1046 #endif1047 1035 1048 1036 updateBackingStoreDiscardableState(); … … 3837 3825 { 3838 3826 m_creationParameters.viewSize = m_pageClient->viewSize(); 3839 m_creationParameters.isActive = m_pageClient->isViewWindowActive(); 3840 m_creationParameters.isFocused = m_pageClient->isViewFocused(); 3841 m_creationParameters.isVisible = m_pageClient->isViewVisible(); 3842 m_creationParameters.isInWindow = m_pageClient->isViewInWindow(); 3827 m_creationParameters.viewState = m_viewState; 3843 3828 m_creationParameters.drawingAreaType = m_drawingArea->type(); 3844 3829 m_creationParameters.store = m_pageGroup->preferences()->store(); -
trunk/Source/WebKit2/UIProcess/WebPageProxy.h
r158369 r158372 327 327 enum class WantsReplyOrNot { DoesNotWantReply, DoesWantReply }; 328 328 void viewStateDidChange(ViewState::Flags mayHaveChanged, WantsReplyOrNot = WantsReplyOrNot::DoesNotWantReply); 329 bool isInWindow() const { return m_ isInWindow; }329 bool isInWindow() const { return m_viewState & ViewState::IsInWindow; } 330 330 void waitForDidUpdateInWindowState(); 331 331 332 332 WebCore::IntSize viewSize() const; 333 bool isViewVisible() const { return m_ isVisible; }333 bool isViewVisible() const { return m_viewState & ViewState::IsVisible; } 334 334 bool isViewWindowActive() const; 335 335 … … 756 756 void platformInitialize(); 757 757 void initializeCreationParameters(); 758 759 void updateViewState(ViewState::Flags flagsToUpdate = ViewState::AllFlags); 758 760 759 761 void resetState(); … … 1089 1091 double m_estimatedProgress; 1090 1092 1091 // Whether the web page is contained in a top-level window. 1092 bool m_isInWindow; 1093 1094 // Whether the page is visible; if the backing view is visible and inserted into a window. 1095 bool m_isVisible; 1093 ViewState::Flags m_viewState; 1096 1094 1097 1095 bool m_canGoBack; -
trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedDrawingArea.cpp
r156861 r158372 61 61 , m_layerTreeStateIsFrozen(false) 62 62 , m_wantsToExitAcceleratedCompositingMode(false) 63 , m_isPaintingSuspended(! parameters.isVisible)63 , m_isPaintingSuspended(!(parameters.viewState & ViewState::IsVisible)) 64 64 , m_displayTimer(RunLoop::main(), this, &CoordinatedDrawingArea::displayTimerFired) 65 65 , m_exitCompositingTimer(RunLoop::main(), this, &CoordinatedDrawingArea::exitAcceleratedCompositingMode) -
trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp
r158013 r158372 58 58 , m_layerTreeStateIsFrozen(false) 59 59 , m_wantsToExitAcceleratedCompositingMode(false) 60 , m_isPaintingSuspended(! parameters.isVisible)60 , m_isPaintingSuspended(!(parameters.viewState & ViewState::IsVisible)) 61 61 , m_alwaysUseCompositing(false) 62 62 , m_displayTimer(RunLoop::main(), this, &DrawingAreaImpl::displayTimerFired) -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
r158360 r158372 282 282 , m_scrollPinningBehavior(DoNotPin) 283 283 , m_useThreadedScrolling(false) 284 , m_viewState(parameters.viewState) 284 285 { 285 286 ASSERT(m_pageID); … … 365 366 setMemoryCacheMessagesEnabled(parameters.areMemoryCacheClientCallsEnabled); 366 367 367 setActive(parameters. isActive);368 setFocused(parameters. isFocused);368 setActive(parameters.viewState & ViewState::WindowIsActive); 369 setFocused(parameters.viewState & ViewState::IsFocused); 369 370 370 371 // Page defaults to in-window, but setIsInWindow depends on it being a valid indicator of actually having been put into a window. 371 if (!parameters.isInWindow) 372 bool isInWindow = parameters.viewState & ViewState::IsInWindow; 373 if (!isInWindow) 372 374 m_page->setIsInWindow(false); 373 375 else 374 376 WebProcess::shared().pageDidEnterWindow(m_pageID); 375 377 376 setIsInWindow( parameters.isInWindow);378 setIsInWindow(isInWindow); 377 379 378 380 setMinimumLayoutSize(parameters.minimumLayoutSize); … … 1984 1986 } 1985 1987 1986 void WebPage::setIsInWindow(bool isInWindow , bool wantsDidUpdateViewInWindowState)1988 void WebPage::setIsInWindow(bool isInWindow) 1987 1989 { 1988 1990 bool pageWasInWindow = m_page->isInWindow(); … … 2012 2014 if (isInWindow) 2013 2015 layoutIfNeeded(); 2014 2015 if (wantsDidUpdateViewInWindowState) 2016 } 2017 2018 void WebPage::setViewState(ViewState::Flags viewState, bool wantsDidUpdateInWindowState) 2019 { 2020 ViewState::Flags changed = m_viewState ^ viewState; 2021 2022 // We want to make sure to update the active state while hidden, so if the view is hidden then update the active state 2023 // early (in case it becomes visible), and if the view was visible then update active state later (in case it hides). 2024 if (changed & ViewState::WindowIsVisible) 2025 setWindowIsVisible(viewState & ViewState::WindowIsVisible); 2026 if (changed & ViewState::IsFocused) 2027 setFocused(viewState & ViewState::IsFocused); 2028 if (changed & ViewState::WindowIsActive && !(m_viewState & ViewState::IsVisible)) 2029 setActive(viewState & ViewState::WindowIsActive); 2030 if (changed & ViewState::IsVisible) 2031 setViewIsVisible(viewState & ViewState::IsVisible); 2032 if (changed & ViewState::WindowIsActive && m_viewState & ViewState::IsVisible) 2033 setActive(viewState & ViewState::WindowIsActive); 2034 if (changed & ViewState::IsInWindow) 2035 setIsInWindow(viewState & ViewState::IsInWindow); 2036 2037 m_viewState = viewState; 2038 2039 if (wantsDidUpdateInWindowState) 2016 2040 m_sendDidUpdateInWindowStateTimer.startOneShot(0); 2017 2041 } -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h
r157996 r158372 50 50 #include "SandboxExtension.h" 51 51 #include "ShareableBitmap.h" 52 #include "ViewState.h" 52 53 #include "WebUndoStep.h" 53 54 #include <WebCore/DictationAlternative.h> … … 684 685 void setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&); 685 686 void setWindowResizerSize(const WebCore::IntSize&); 686 void setIsInWindow(bool isInWindow, bool wantsDidUpdateViewInWindowState = false); 687 void setIsInWindow(bool); 688 void setViewState(ViewState::Flags, bool wantsDidUpdateInWindowState); 687 689 void validateCommand(const String&, uint64_t); 688 690 void executeEditCommand(const String&); … … 992 994 993 995 bool m_useThreadedScrolling; 996 997 ViewState::Flags m_viewState; 994 998 }; 995 999 -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
r157996 r158372 22 22 23 23 messages -> WebPage LegacyReceiver { 24 SetActive(bool active)25 SetFocused(bool focused)26 SetViewIsVisible(bool visible)27 24 SetInitialFocus(bool forward, bool isKeyboardEventValid, WebKit::WebKeyboardEvent event) 28 Set IsInWindow(bool isInWindow, bool wantsDidUpdateViewInWindowState)25 SetViewState(unsigned viewState, bool wantsDidUpdateInWindowState) 29 26 30 27 SetDrawsBackground(bool drawsBackground) … … 245 242 CancelComposition() 246 243 #endif 247 248 SetWindowIsVisible(bool windowIsVisible)249 244 250 245 #if PLATFORM(MAC) -
trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm
r158122 r158372 65 65 , m_layerTreeStateIsFrozen(false) 66 66 , m_layerFlushScheduler(this) 67 , m_isPaintingSuspended(! parameters.isVisible)67 , m_isPaintingSuspended(!(parameters.viewState & ViewState::IsVisible)) 68 68 , m_clipsToExposedRect(false) 69 69 , m_updateIntrinsicContentSizeTimer(this, &TiledCoreAnimationDrawingArea::updateIntrinsicContentSizeTimerFired)
Note: See TracChangeset
for help on using the changeset viewer.