WebKit Bugzilla
Attachment 368677 Details for
Bug 197463
: Reuse existing WebPageProxy quota handler for NetworkProcessProxy quota requests
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-197463-20190501092551.patch (text/plain), 14.77 KB, created by
youenn fablet
on 2019-05-01 09:25:51 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2019-05-01 09:25:51 PDT
Size:
14.77 KB
patch
obsolete
>Subversion Revision: 244802 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 1f6cb44e17f455c96cc0ba221c67d8f6bebc675c..74b8925a4f81ba9a6b832affab0b873e04c2707f 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,34 @@ >+2019-05-01 Youenn Fablet <youenn@apple.com> >+ >+ Reuse existing WebPageProxy quota handler for NetworkProcessProxy quota requests >+ https://bugs.webkit.org/show_bug.cgi?id=197463 >+ <rdar://problem/47403621> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a getter to know whether websitedatastore client implements the quota delegate. >+ If not, find the most visible page that is the same origin as the quota request >+ and reuse the existing exceededDatabasQuota delegate. >+ This approach allows to call the delegate even if the quota request comes from a service worker. >+ If no such page is found, the quota will not be increased. >+ >+ Manually tested. >+ >+ * UIProcess/API/Cocoa/WKWebsiteDataStore.mm: >+ * UIProcess/Network/NetworkProcessProxy.cpp: >+ (WebKit::NetworkProcessProxy::requestStorageSpace): >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::ExceededDatabaseQuotaRecords::createRecord): >+ (WebKit::WebPageProxy::forMostVisibleWebPageIfAny): >+ (WebKit::WebPageProxy::exceededDatabaseQuota): >+ (WebKit::WebPageProxy::requestStorageSpace): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebProcessProxy.cpp: >+ (WebKit::WebProcessProxy::forWebPages): >+ * UIProcess/WebProcessProxy.h: >+ * UIProcess/WebsiteData/WebsiteDataStoreClient.h: >+ (WebKit::WebsiteDataStoreClient::implementsRequestStorageSpaceHandler const): >+ > 2019-04-30 Chris Dumez <cdumez@apple.com> > > Regression(PSON) URL scheme handlers can no longer respond asynchronously >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm >index 7dd4119c97b193b2843655e523ed8b7dc7e592b3..a7ce26e73106e26d255fccbc43134fa8b2573995 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm >@@ -43,7 +43,7 @@ > #import <wtf/URL.h> > #import <wtf/WeakObjCPtr.h> > >-class WebsiteDataStoreClient : public WebKit::WebsiteDataStoreClient { >+class WebsiteDataStoreClient final : public WebKit::WebsiteDataStoreClient { > public: > explicit WebsiteDataStoreClient(id <_WKWebsiteDataStoreDelegate> delegate) > : m_delegate(delegate) >@@ -52,6 +52,7 @@ public: > } > > private: >+ bool implementsRequestStorageSpaceHandler() const final { return m_hasRequestStorageSpaceSelector && !!m_delegate; } > void requestStorageSpace(const WebCore::SecurityOriginData& topOrigin, const WebCore::SecurityOriginData& frameOrigin, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t>)>&& completionHandler) final > { > if (!m_hasRequestStorageSpaceSelector || !m_delegate) { >diff --git a/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp b/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp >index c344d16382735b0b683c696f9b662671071d8464..68911713102e23db67a947645b6ca7cf966a871b 100644 >--- a/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp >@@ -1197,7 +1197,7 @@ void NetworkProcessProxy::establishWorkerContextConnectionToNetworkProcessForExp > } > #endif > >-void NetworkProcessProxy::requestStorageSpace(PAL::SessionID sessionID, const WebCore::ClientOrigin& origin, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t> quota)>&& completionHandler) >+void NetworkProcessProxy::requestStorageSpace(PAL::SessionID sessionID, const WebCore::ClientOrigin& origin, uint64_t currentQuota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t> quota)>&& completionHandler) > { > auto* store = websiteDataStoreFromSessionID(sessionID); > >@@ -1206,7 +1206,26 @@ void NetworkProcessProxy::requestStorageSpace(PAL::SessionID sessionID, const We > return; > } > >- store->client().requestStorageSpace(origin.topOrigin, origin.clientOrigin, quota, currentSize, spaceRequired, WTFMove(completionHandler)); >+ if (store->client().implementsRequestStorageSpaceHandler()) { >+ store->client().requestStorageSpace(origin.topOrigin, origin.clientOrigin, currentQuota, currentSize, spaceRequired, WTFMove(completionHandler)); >+ return; >+ } >+ >+ if (origin.topOrigin != origin.clientOrigin) { >+ completionHandler({ }); >+ return; >+ } >+ >+ WebPageProxy::forMostVisibleWebPageIfAny(sessionID, origin.topOrigin, [completionHandler = WTFMove(completionHandler), origin, currentQuota, currentSize, spaceRequired](auto* page) mutable { >+ if (!page) { >+ completionHandler({ }); >+ return; >+ } >+ String name = makeString(FileSystem::encodeForFileName(origin.topOrigin.host), " content"); >+ page->requestStorageSpace(page->mainFrame()->frameID(), origin.topOrigin.databaseIdentifier(), name, name, currentQuota, currentSize, currentSize, spaceRequired, [completionHandler = WTFMove(completionHandler)](auto quota) mutable { >+ completionHandler(quota); >+ }); >+ }); > } > > void NetworkProcessProxy::takeUploadAssertion() >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index 3d347e209479721a75f21a0c55f079de58419a2d..b0b9b29fbd4122edddfa4ec9d9cfc8955ad9eb2d 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -275,7 +275,7 @@ public: > uint64_t currentOriginUsage; > uint64_t currentDatabaseUsage; > uint64_t expectedUsage; >- Messages::WebPageProxy::ExceededDatabaseQuota::DelayedReply reply; >+ CompletionHandler<void(uint64_t)> completionHandler; > }; > > static ExceededDatabaseQuotaRecords& singleton(); >@@ -283,7 +283,7 @@ public: > std::unique_ptr<Record> createRecord(uint64_t frameID, String originIdentifier, > String databaseName, String displayName, uint64_t currentQuota, > uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, >- Messages::WebPageProxy::ExceededDatabaseQuota::DelayedReply&&); >+ CompletionHandler<void(uint64_t)>&&); > > void add(std::unique_ptr<Record>); > bool areBeingProcessed() const { return !!m_currentRecord; } >@@ -306,7 +306,7 @@ ExceededDatabaseQuotaRecords& ExceededDatabaseQuotaRecords::singleton() > std::unique_ptr<ExceededDatabaseQuotaRecords::Record> ExceededDatabaseQuotaRecords::createRecord( > uint64_t frameID, String originIdentifier, String databaseName, String displayName, > uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, >- uint64_t expectedUsage, Messages::WebPageProxy::ExceededDatabaseQuota::DelayedReply&& reply) >+ uint64_t expectedUsage, CompletionHandler<void(uint64_t)>&& completionHandler) > { > auto record = std::make_unique<Record>(); > record->frameID = frameID; >@@ -317,7 +317,7 @@ std::unique_ptr<ExceededDatabaseQuotaRecords::Record> ExceededDatabaseQuotaRecor > record->currentOriginUsage = currentOriginUsage; > record->currentDatabaseUsage = currentDatabaseUsage; > record->expectedUsage = expectedUsage; >- record->reply = WTFMove(reply); >+ record->completionHandler = WTFMove(completionHandler); > return record; > } > >@@ -393,6 +393,25 @@ private: > WeakPtr<PageClient> m_pageClient; > }; > >+void WebPageProxy::forMostVisibleWebPageIfAny(PAL::SessionID sessionID, const SecurityOriginData& origin, CompletionHandler<void(WebPageProxy*)>&& completionHandler) >+{ >+ // FIXME: If not finding right away a visible page, we might want to try again for a given period of time when there is a change of visibility. >+ WebPageProxy* selectedPage = nullptr; >+ WebProcessProxy::forWebPages(sessionID, origin, [&](auto& page) { >+ if (!page.mainFrame()) >+ return; >+ if (page.isViewVisible() && (!selectedPage || !selectedPage->isViewVisible())) { >+ selectedPage = &page; >+ return; >+ } >+ if (page.isViewFocused() && (!selectedPage || !selectedPage->isViewFocused())) { >+ selectedPage = &page; >+ return; >+ } >+ }); >+ completionHandler(selectedPage); >+} >+ > Ref<WebPageProxy> WebPageProxy::create(PageClient& pageClient, WebProcessProxy& process, uint64_t pageID, Ref<API::PageConfiguration>&& configuration) > { > return adoptRef(*new WebPageProxy(pageClient, process, pageID, WTFMove(configuration))); >@@ -7205,11 +7224,18 @@ void WebPageProxy::didReceiveAuthenticationChallengeProxy(uint64_t, Ref<Authenti > } > > void WebPageProxy::exceededDatabaseQuota(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, Messages::WebPageProxy::ExceededDatabaseQuota::DelayedReply&& reply) >+{ >+ requestStorageSpace(frameID, originIdentifier, databaseName, displayName, currentQuota, currentOriginUsage, currentDatabaseUsage, expectedUsage, [reply = WTFMove(reply)](auto quota) mutable { >+ reply(quota); >+ }); >+} >+ >+void WebPageProxy::requestStorageSpace(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, CompletionHandler<void(uint64_t)>&& completionHandler) > { > ExceededDatabaseQuotaRecords& records = ExceededDatabaseQuotaRecords::singleton(); > std::unique_ptr<ExceededDatabaseQuotaRecords::Record> newRecord = records.createRecord(frameID, > originIdentifier, databaseName, displayName, currentQuota, currentOriginUsage, >- currentDatabaseUsage, expectedUsage, WTFMove(reply)); >+ currentDatabaseUsage, expectedUsage, WTFMove(completionHandler)); > records.add(WTFMove(newRecord)); > > if (records.areBeingProcessed()) >@@ -7221,7 +7247,7 @@ void WebPageProxy::exceededDatabaseQuota(uint64_t frameID, const String& originI > MESSAGE_CHECK(m_process, frame); > > auto origin = API::SecurityOrigin::create(SecurityOriginData::fromDatabaseIdentifier(record->originIdentifier)->securityOrigin()); >- m_uiClient->exceededDatabaseQuota(this, frame, origin.ptr(), record->databaseName, record->displayName, record->currentQuota, record->currentOriginUsage, record->currentDatabaseUsage, record->expectedUsage, WTFMove(record->reply)); >+ m_uiClient->exceededDatabaseQuota(this, frame, origin.ptr(), record->databaseName, record->displayName, record->currentQuota, record->currentOriginUsage, record->currentDatabaseUsage, record->expectedUsage, WTFMove(record->completionHandler)); > record = records.next(); > } > } >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 37658d8c0707e2a34cfdedf05088f4320c9a9655..1c2072118265bb8dd094cf67869df89ef8eb6456 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -383,6 +383,8 @@ public: > static Ref<WebPageProxy> create(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&); > virtual ~WebPageProxy(); > >+ static void forMostVisibleWebPageIfAny(PAL::SessionID, const WebCore::SecurityOriginData&, CompletionHandler<void(WebPageProxy*)>&&); >+ > const API::PageConfiguration& configuration() const; > > uint64_t pageID() const { return m_pageID; } >@@ -1534,6 +1536,8 @@ WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_1 > void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; > void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override; > >+ void requestStorageSpace(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, WTF::CompletionHandler<void(uint64_t)>&&); >+ > private: > WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&); > void platformInitialize(); >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp >index c37208d8dd124616efcb7c3611095848739e5196..eb9ccb1afbae7c0e251c3383a326229a55f06b84 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp >@@ -122,6 +122,15 @@ static WebProcessProxy::WebPageProxyMap& globalPageMap() > return pageMap; > } > >+void WebProcessProxy::forWebPages(PAL::SessionID sessionID, const SecurityOriginData& origin, const WTF::Function<void(WebPageProxy&)>& callback) >+{ >+ for (auto* page : globalPageMap().values()) { >+ if (page->sessionID() != sessionID || SecurityOriginData::fromURL(URL { { }, page->currentURL() }) != origin) >+ continue; >+ callback(*page); >+ } >+} >+ > Ref<WebProcessProxy> WebProcessProxy::create(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed, ShouldLaunchProcess shouldLaunchProcess) > { > auto proxy = adoptRef(*new WebProcessProxy(processPool, websiteDataStore, isPrewarmed)); >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h >index 1284aea5187c1f884acf255ca030ed93cadeff85..a07195b8bab35eceeec5d62b6b240cad98ab6ad5 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -110,6 +110,8 @@ public: > static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore*, IsPrewarmed, ShouldLaunchProcess = ShouldLaunchProcess::Yes); > ~WebProcessProxy(); > >+ static void forWebPages(PAL::SessionID, const WebCore::SecurityOriginData&, const WTF::Function<void(WebPageProxy&)>&); >+ > WebConnection* webConnection() const { return m_webConnection.get(); } > > unsigned suspendedPageCount() const { return m_suspendedPageCount; } >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h >index e9fcf00153995dc1cce135f8c092e92e66dbff3a..1d320aa65e0076ed44d8c8e05b1281fc9f94771e 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h >+++ b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h >@@ -37,6 +37,7 @@ class WebsiteDataStoreClient { > public: > virtual ~WebsiteDataStoreClient() { } > >+ virtual bool implementsRequestStorageSpaceHandler() const { return false; } > virtual void requestStorageSpace(const WebCore::SecurityOriginData& topOrigin, const WebCore::SecurityOriginData& frameOrigin, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t>)>&& completionHandler) > { > completionHandler({ });
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 197463
:
368677
|
369439
|
369449
|
369591
|
369883
|
369897
|
369902
|
369916
|
369960