WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-150515-20151210125813.patch (text/plain), 17.12 KB, created by
Kat Graff
on 2015-12-10 12:58:45 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Kat Graff
Created:
2015-12-10 12:58:45 PST
Size:
17.12 KB
patch
obsolete
>Subversion Revision: 193642 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 1d000212b8055436cd5eb51fb1629202179e7def..19334b2a25ba982fdac4b4d37590f19551907941 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,42 @@ >+2015-12-10 Katlyn Graff <kgraff@apple.com> >+ >+ Safari background tabs should be fully suspended where possible. >+ https://bugs.webkit.org/show_bug.cgi?id=150515 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Tab suspension support for Mac implemented from a page-down level, enabled with default >+ WebKitTabSuspension. Document-level suspend and resume functions call documentWillSuspend >+ and documentDidResume, which are shared with the Page Cache. Tab suspension policy uses >+ PageActivityState and IsVisible to determine whether a nonvisible page has load activity >+ or audio. UnsuspendableFlags added to PageActivityState to support changing tab suspension >+ policy. >+ >+ * dom/Document.cpp: >+ (WebCore::Document::setInPageCache): >+ (WebCore::Document::documentWillSuspend): >+ (WebCore::Document::documentDidResume): >+ (WebCore::Document::suspend): >+ (WebCore::Document::resume): >+ * dom/Document.h: >+ * dom/ScriptExecutionContext.cpp: >+ (WebCore::ScriptExecutionContext::suspendActiveDOMObjects): >+ * history/CachedFrame.cpp: >+ (WebCore::CachedFrameBase::restore): >+ (WebCore::CachedFrame::CachedFrame): >+ * loader/FrameLoader.cpp: >+ (WebCore::FrameLoader::commitProvisionalLoad): >+ * page/Page.cpp: >+ (WebCore::Page::setPageActivityState): >+ (WebCore::Page::setIsVisible): >+ (WebCore::Page::setIsVisibleInternal): >+ (WebCore::Page::canTabSuspend): >+ (WebCore::Page::setIsTabSuspended): >+ (WebCore::Page::setTabSuspension): >+ * page/Page.h: >+ (WebCore::Page::isTabSuspended): >+ * page/PageThrottler.h: >+ > 2015-12-07 Nikos Andronikos <nikos.andronikos-webkit@cisra.canon.com.au> > > Update Objective-C code generator to pass a reference to calling object for partial interfaces >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index f7ee9acbccccee5ef4dba4f00dc9956ad86275b1..ff6ab714d24e5b43538cdd1618db73528ab4eb2c 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,3 +1,21 @@ >+2015-12-10 Katlyn Graff <kgraff@apple.com> >+ >+ Safari background tabs should be fully suspended where possible. >+ https://bugs.webkit.org/show_bug.cgi?id=150515 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Shared/WebProcessCreationParameters.cpp: >+ (WebKit::WebProcessCreationParameters::WebProcessCreationParameters): >+ (WebKit::WebProcessCreationParameters::encode): >+ (WebKit::WebProcessCreationParameters::decode): >+ * Shared/WebProcessCreationParameters.h: >+ * UIProcess/Cocoa/WebProcessPoolCocoa.mm: >+ (WebKit::registerUserDefaultsIfNeeded): >+ (WebKit::WebProcessPool::platformInitializeWebProcess): >+ * WebProcess/cocoa/WebProcessCocoa.mm: >+ (WebKit::WebProcess::platformInitializeWebProcess): >+ > 2015-12-07 Philippe Normand <pnormand@igalia.com> > > [GTK][Mac] socketpair assertion failure >diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp >index 00ab223485ca756eb1969fcf966ceb683dd4b5f6..489c46d8ef30a5135be46da24d2c4f481cc7acf9 100644 >--- a/Source/WebCore/dom/Document.cpp >+++ b/Source/WebCore/dom/Document.cpp >@@ -4503,7 +4503,7 @@ void Document::documentWillBecomeInactive() > renderView()->setIsInWindow(false); > } > >-void Document::suspend() >+void Document::documentWillSuspend() > { > documentWillBecomeInactive(); > >@@ -4520,9 +4520,12 @@ void Document::suspend() > if (view->usesCompositing()) > view->compositor().cancelCompositingLayerUpdate(); > } >+ >+ suspendActiveDOMObjects(ActiveDOMObject::PageCache); >+ suspendScriptedAnimationControllerCallbacks(); > } > >-void Document::resume() >+void Document::documentDidResume() > { > Vector<Element*> elements; > copyToVector(m_documentSuspensionCallbackElements, elements); >@@ -4539,6 +4542,33 @@ void Document::resume() > m_frame->loader().client().dispatchDidBecomeFrameset(isFrameSet()); > } > >+void Document::suspend() >+{ >+ ASSERT(page()); >+ page()->lockAllOverlayScrollbarsToHidden(true); >+ >+ documentWillSuspend(); >+ >+ m_visualUpdatesAllowed = false; >+ m_visualUpdatesSuppressionTimer.stop(); >+ >+ ASSERT(m_frame); >+ m_frame->clearTimers(); >+} >+ >+void Document::resume() >+{ >+ documentDidResume(); >+ >+ resumeActiveDOMObjects(ActiveDOMObject::PageWillBeSuspended); >+ resumeScriptedAnimationControllerCallbacks(); >+ >+ ASSERT(m_frame); >+ m_frame->animation().resumeAnimationsForDocument(this); >+ >+ m_visualUpdatesAllowed = true; >+} >+ > void Document::registerForDocumentSuspensionCallbacks(Element* e) > { > m_documentSuspensionCallbackElements.add(e); >diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h >index d28650d5948f4564be479580a9bfb360263b3845..a2031c2ea24fabc918234e68551114477bd8d2f9 100644 >--- a/Source/WebCore/dom/Document.h >+++ b/Source/WebCore/dom/Document.h >@@ -1008,6 +1008,8 @@ public: > void unregisterForDocumentSuspensionCallbacks(Element*); > > void documentWillBecomeInactive(); >+ void documentWillSuspend(); >+ void documentDidResume(); > void suspend(); > void resume(); > >@@ -1706,6 +1708,7 @@ private: > bool m_scheduledTasksAreSuspended; > > bool m_visualUpdatesAllowed; >+ void suspendAllVisualUpdates(); > Timer m_visualUpdatesSuppressionTimer; > > RefPtr<NamedFlowCollection> m_namedFlows; >diff --git a/Source/WebCore/history/CachedFrame.cpp b/Source/WebCore/history/CachedFrame.cpp >index 260fdb382ae35ec1cddb50501775611eb993ad45..195c1aa4ce23c6b375ee25cc660f055e6305089a 100644 >--- a/Source/WebCore/history/CachedFrame.cpp >+++ b/Source/WebCore/history/CachedFrame.cpp >@@ -135,7 +135,9 @@ void CachedFrameBase::restore() > m_document->page()->chrome().client().needTouchEvents(true); > #endif > >- m_document->resume(); >+ if (frame.page()->isTabSuspended()) >+ frame.page()->setIsTabSuspended(false); >+ m_document->documentDidResume(); > } > > CachedFrame::CachedFrame(Frame& frame) >@@ -165,9 +167,11 @@ CachedFrame::CachedFrame(Frame& frame) > // but after we've fired the pagehide event, in case that creates more objects. > // Suspending must also happen after we've recursed over child frames, in case > // those create more objects. >- m_document->suspend(); >- m_document->suspendScriptedAnimationControllerCallbacks(); >- m_document->suspendActiveDOMObjects(ActiveDOMObject::PageCache); >+ >+ if (frame.page()->isTabSuspended()) >+ frame.page()->setIsTabSuspended(false); >+ m_document->documentWillSuspend(); >+ > m_cachedFrameScriptData = std::make_unique<ScriptCachedFrameData>(frame); > > m_document->domWindow()->suspendForDocumentSuspension(); >diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp >index 48150a0e3a4f27d8902250ca3adfc02f3563c681..94d398115e430e943cf4c5c373bdf7a8be6e0da5 100644 >--- a/Source/WebCore/loader/FrameLoader.cpp >+++ b/Source/WebCore/loader/FrameLoader.cpp >@@ -1820,7 +1820,10 @@ void FrameLoader::commitProvisionalLoad() > if (m_frame.document()->doctype() && m_frame.page()) > m_frame.page()->chrome().didReceiveDocType(&m_frame); > #endif >- m_frame.document()->resume(); >+ >+ if (m_frame.page()->isTabSuspended()) >+ m_frame.page()->setIsTabSuspended(false); >+ m_frame.document()->documentDidResume(); > > // Force a layout to update view size and thereby update scrollbars. > #if PLATFORM(IOS) >diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp >index 30e585d43075bb060e6b40af48c949a0568721f9..72fba244e88ca73ae8495804b0aa890a76ffcbf9 100644 >--- a/Source/WebCore/page/Page.cpp >+++ b/Source/WebCore/page/Page.cpp >@@ -143,6 +143,7 @@ static void networkStateChanged(bool isOnLine) > } > > static const ViewState::Flags PageInitialViewState = ViewState::IsVisible | ViewState::IsInWindow; >+bool Page::s_tabSuspension = false; > > Page::Page(PageConfiguration& pageConfiguration) > : m_chrome(std::make_unique<Chrome>(*this, *pageConfiguration.chromeClient)) >@@ -1292,7 +1293,12 @@ void Page::setViewState(ViewState::Flags viewState) > > void Page::setPageActivityState(PageActivityState::Flags activityState) > { >+ if (m_pageActivityState == activityState) >+ return; >+ > chrome().client().setPageActivityState(activityState); >+ m_pageActivityState = activityState; >+ setIsTabSuspended(!isVisible()); > } > > void Page::setIsVisible(bool isVisible) >@@ -1301,6 +1307,8 @@ void Page::setIsVisible(bool isVisible) > setViewState((m_viewState & ~ViewState::IsVisuallyIdle) | ViewState::IsVisible | ViewState::IsVisibleOrOccluded); > else > setViewState((m_viewState & ~(ViewState::IsVisible | ViewState::IsVisibleOrOccluded)) | ViewState::IsVisuallyIdle); >+ >+ setIsTabSuspended(!isVisible); > } > > void Page::setIsVisibleInternal(bool isVisible) >@@ -1338,6 +1346,8 @@ void Page::setIsVisibleInternal(bool isVisible) > if (FrameView* view = mainFrame().view()) > view->hide(); > } >+ >+ setIsTabSuspended(!isVisible); > } > > void Page::setIsPrerender() >@@ -1821,4 +1831,34 @@ void Page::setResourceUsageOverlayVisible(bool visible) > } > #endif > >+bool Page::canTabSuspend() >+{ >+ return s_tabSuspension && !(m_pageActivityState & PageActivityState::UnsuspendableFlags) && PageCache::singleton().canCache(this); >+} >+ >+void Page::setIsTabSuspended(bool shouldSuspend) >+{ >+ if (m_isTabSuspended == shouldSuspend) >+ return; >+ >+ if (shouldSuspend && !canTabSuspend()) >+ return; >+ >+ for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) { >+ if (auto* document = frame->document()) { >+ if (shouldSuspend) >+ document->suspend(); >+ else >+ document->resume(); >+ } >+ } >+ >+ m_isTabSuspended = shouldSuspend; >+} >+ >+void Page::setTabSuspension(bool enable) >+{ >+ s_tabSuspension = enable; >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h >index 9ee50c7f316f3d4ef0ce01234ec1cbd26bd28303..1d347dcea34c7f1b181284180842a9dd87fdacfb 100644 >--- a/Source/WebCore/page/Page.h >+++ b/Source/WebCore/page/Page.h >@@ -138,6 +138,7 @@ class Page : public Supplementable<Page> { > public: > WEBCORE_EXPORT static void updateStyleForAllPagesAfterGlobalChangeInEnvironment(); > WEBCORE_EXPORT static void clearPreviousItemFromAllPages(HistoryItem*); >+ WEBCORE_EXPORT static void setTabSuspension(bool); > > WEBCORE_EXPORT explicit Page(PageConfiguration&); > WEBCORE_EXPORT ~Page(); >@@ -365,6 +366,8 @@ public: > // with exponential growth in the number of frames. > static const int maxNumberOfFrames = 1000; > >+ static bool s_tabSuspension; >+ > void setEditable(bool isEditable) { m_isEditable = isEditable; } > bool isEditable() { return m_isEditable; } > >@@ -488,6 +491,8 @@ public: > > void setShowAllPlugins(bool showAll) { m_showAllPlugins = showAll; } > bool showAllPlugins() const; >+ void setIsTabSuspended(bool); >+ bool isTabSuspended() { return m_isTabSuspended; }; > > private: > WEBCORE_EXPORT void initGroup(); >@@ -602,6 +607,7 @@ private: > bool m_isEditable; > bool m_isPrerender; > ViewState::Flags m_viewState; >+ PageActivityState::Flags m_pageActivityState; > > LayoutMilestones m_requestedLayoutMilestones; > >@@ -652,6 +658,9 @@ private: > SessionID m_sessionID; > > bool m_isClosing; >+ bool m_isTabSuspended { false }; >+ >+ bool canTabSuspend(); > > MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying }; > >diff --git a/Source/WebCore/page/PageThrottler.h b/Source/WebCore/page/PageThrottler.h >index 631633b16e5ae2c859a15bb8ec1d12a841e81dc0..c330a8a2a20bb35b4c75bf35640afdd94e122382 100644 >--- a/Source/WebCore/page/PageThrottler.h >+++ b/Source/WebCore/page/PageThrottler.h >@@ -51,6 +51,7 @@ struct PageActivityState { > > static const Flags NoFlags = 0; > static const Flags AllFlags = UserInputActivity | AudiblePlugin | MediaActivity | PageLoadActivity; >+ static const Flags UnsuspendableFlags = MediaActivity | PageLoadActivity; > }; > > class PageThrottler { >diff --git a/Source/WebKit2/Shared/WebProcessCreationParameters.cpp b/Source/WebKit2/Shared/WebProcessCreationParameters.cpp >index a932f0c859d18092c9b061e195323e5d318414fd..6af317edcccb3f378ed89491c4adf7b6ceb1bbe9 100644 >--- a/Source/WebKit2/Shared/WebProcessCreationParameters.cpp >+++ b/Source/WebKit2/Shared/WebProcessCreationParameters.cpp >@@ -43,6 +43,9 @@ WebProcessCreationParameters::WebProcessCreationParameters() > , shouldEnableJIT(false) > , shouldEnableFTLJIT(false) > #endif >+#if PLATFORM(MAC) >+ , shouldEnableTabSuspension(false) >+#endif > , memoryCacheDisabled(false) > #if ENABLE(SERVICE_CONTROLS) > , hasImageServices(false) >@@ -118,6 +121,10 @@ void WebProcessCreationParameters::encode(IPC::ArgumentEncoder& encoder) const > encoder << bundleParameterData->dataReference(); > #endif > >+#if PLATFORM(MAC) >+ encoder << shouldEnableTabSuspension; >+#endif >+ > #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) > encoder << notificationPermissions; > #endif >@@ -257,6 +264,11 @@ bool WebProcessCreationParameters::decode(IPC::ArgumentDecoder& decoder, WebProc > } > #endif > >+#if PLATFORM(MAC) >+ if (!decoder.decode(parameters.shouldEnableTabSuspension)) >+ return false; >+#endif >+ > #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) > if (!decoder.decode(parameters.notificationPermissions)) > return false; >diff --git a/Source/WebKit2/Shared/WebProcessCreationParameters.h b/Source/WebKit2/Shared/WebProcessCreationParameters.h >index 8088ddd2c157103057f6928320d529ebb46b00e4..2f80c63d78354909eead52e68b4f829c1c179562 100644 >--- a/Source/WebKit2/Shared/WebProcessCreationParameters.h >+++ b/Source/WebKit2/Shared/WebProcessCreationParameters.h >@@ -142,6 +142,10 @@ struct WebProcessCreationParameters { > > #endif // PLATFORM(COCOA) > >+#if PLATFORM(MAC) >+ bool shouldEnableTabSuspension; >+#endif >+ > #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) > HashMap<String, bool> notificationPermissions; > #endif >diff --git a/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm b/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm >index 7d4f4945d22984e4e3c7eccd786e69cdb517b5bc..7468d4407df5fda43bd6d57ab192eb3a29368f0c 100644 >--- a/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm >+++ b/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm >@@ -62,6 +62,7 @@ using namespace WebCore; > NSString *WebDatabaseDirectoryDefaultsKey = @"WebDatabaseDirectory"; > NSString *WebKitLocalCacheDefaultsKey = @"WebKitLocalCache"; > NSString *WebStorageDirectoryDefaultsKey = @"WebKitLocalStorageDatabasePathPreferenceKey"; >+NSString *WebKitTabSuspension = @"WebKitTabSuspension"; > NSString *WebKitJSCJITEnabledDefaultsKey = @"WebKitJSCJITEnabledDefaultsKey"; > NSString *WebKitJSCFTLJITEnabledDefaultsKey = @"WebKitJSCFTLJITEnabledDefaultsKey"; > NSString *WebKitMediaKeysStorageDirectoryDefaultsKey = @"WebKitMediaKeysStorageDirectory"; >@@ -101,6 +102,10 @@ static void registerUserDefaultsIfNeeded() > [registrationDictionary setObject:[NSNumber numberWithBool:YES] forKey:WebKitJSCJITEnabledDefaultsKey]; > [registrationDictionary setObject:[NSNumber numberWithBool:YES] forKey:WebKitJSCFTLJITEnabledDefaultsKey]; > >+#if PLATFORM(MAC) >+ [registrationDictionary setObject:[NSNumber numberWithBool:NO] forKey:WebKitTabSuspension]; >+#endif >+ > #if ENABLE(NETWORK_CACHE) > [registrationDictionary setObject:[NSNumber numberWithBool:YES] forKey:WebKitNetworkCacheEnabledDefaultsKey]; > [registrationDictionary setObject:[NSNumber numberWithBool:NO] forKey:WebKitNetworkCacheEfficacyLoggingEnabledDefaultsKey]; >@@ -170,6 +175,10 @@ void WebProcessPool::platformInitializeWebProcess(WebProcessCreationParameters& > parameters.accessibilityEnhancedUserInterfaceEnabled = false; > #endif > >+#if PLATFORM(MAC) >+ parameters.shouldEnableTabSuspension = [[NSUserDefaults standardUserDefaults] boolForKey:WebKitTabSuspension]; >+#endif >+ > parameters.shouldEnableJIT = [[NSUserDefaults standardUserDefaults] boolForKey:WebKitJSCJITEnabledDefaultsKey]; > parameters.shouldEnableFTLJIT = [[NSUserDefaults standardUserDefaults] boolForKey:WebKitJSCFTLJITEnabledDefaultsKey]; > parameters.shouldEnableMemoryPressureReliefLogging = [[NSUserDefaults standardUserDefaults] boolForKey:@"LogMemoryJetsamDetails"]; >diff --git a/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm b/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm >index e56f1301bcc69214b27179e91249e759dc133892..380cb719b76414f682743c9efaa9fb4d3544456d 100644 >--- a/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm >+++ b/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm >@@ -145,6 +145,7 @@ void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&& par > > #if PLATFORM(MAC) > WebCore::FontCache::setFontWhitelist(parameters.fontWhitelist); >+ Page::setTabSuspension(parameters.shouldEnableTabSuspension); > #endif > > m_compositingRenderServerPort = WTF::move(parameters.acceleratedCompositingPort);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 150515
:
265649
|
265651
|
265652
|
265653
|
266016
|
267092
|
267120
|
267122
|
267153
|
267167
|
267181
|
267222
|
267224
|
267225
|
267227