RESOLVED FIXED 209016
[ iOS and Mac wk2 ] http/tests/in-app-browser-privacy/ tests failing.
https://bugs.webkit.org/show_bug.cgi?id=209016
Summary [ iOS and Mac wk2 ] http/tests/in-app-browser-privacy/ tests failing.
Kate Cheney
Reported 2020-03-12 13:44:38 PDT
These started failing again after fixing <rdar://problem/60250973>
Attachments
Patch (9.93 KB, patch)
2020-03-12 14:32 PDT, Kate Cheney
no flags
Patch (10.00 KB, patch)
2020-03-12 14:55 PDT, Kate Cheney
no flags
Patch (10.06 KB, patch)
2020-03-13 12:43 PDT, Kate Cheney
no flags
Patch (11.11 KB, patch)
2020-03-13 13:53 PDT, Kate Cheney
no flags
Kate Cheney
Comment 1 2020-03-12 13:45:24 PDT
Kate Cheney
Comment 2 2020-03-12 14:32:21 PDT
Kate Cheney
Comment 3 2020-03-12 14:55:19 PDT
Chris Dumez
Comment 4 2020-03-13 10:46:39 PDT
Comment on attachment 393417 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=393417&action=review > Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h:168 > +WK_EXPORT void WKWebsiteDataStoreReinitializeAppBoundDomains(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreReinitializeAppBoundDomainsFunction completionHandler); This does not seem to need to completion handler since it is sync. > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:515 > +void WebsiteDataStore::reinitializeAppBoundDomains(CompletionHandler<void()>&& completionHandler) This does not seem to need to completion handler since it is sync. > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:518 > + initializeAppBoundDomains(); What clears existing app bound domains? It seems initializeAppBoundDomains() will just keep adding more but I do not think anything doing the clearing.
Kate Cheney
Comment 5 2020-03-13 10:48:48 PDT
(In reply to Chris Dumez from comment #4) > Comment on attachment 393417 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=393417&action=review > > > Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h:168 > > +WK_EXPORT void WKWebsiteDataStoreReinitializeAppBoundDomains(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreReinitializeAppBoundDomainsFunction completionHandler); > > This does not seem to need to completion handler since it is sync. > > > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:515 > > +void WebsiteDataStore::reinitializeAppBoundDomains(CompletionHandler<void()>&& completionHandler) > > This does not seem to need to completion handler since it is sync. > Great! I will remove this. > > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:518 > > + initializeAppBoundDomains(); > > What clears existing app bound domains? It seems initializeAppBoundDomains() > will just keep adding more but I do not think anything doing the clearing. Good point, I will change this to clear before re-initializing
Kate Cheney
Comment 6 2020-03-13 12:43:44 PDT
Chris Dumez
Comment 7 2020-03-13 13:05:19 PDT
Comment on attachment 393519 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=393519&action=review > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:527 > + hasInitializedAppBoundDomains = false; I think that for this code to actually be correct, you'd have to reset hasInitializedAppBoundDomains to false in the lambda inside clearAppBoundDomains(), after clearing the domains. That said, I think we can simplify this code a lot like by tweaking existing code like so: enum class ForceReinitialization : bool { No, Yes }; void WebsiteDataStore::initializeAppBoundDomains(ForceReinitialization forceReinitialization) { ASSERT(RunLoop::isMain()); if (hasInitializedAppBoundDomains && forceReinitialization != ForceReinitialization::Yes) // Updated return; static const auto maxAppBoundDomainCount = 10; appBoundDomainQueue().dispatch([forceReinitialization] () mutable { if (hasInitializedAppBoundDomains && forceReinitialization != ForceReinitialization::Yes) // Updated return; NSArray<NSString *> *domains = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"WKAppBoundDomains"]; RunLoop::main().dispatch([forceReinitialization , domains = retainPtr(domains)] { if ( forceReinitialization == ForceReinitialization::Yes) // New appBoundDomains().clear(); // New for (NSString *domain in domains.get()) { URL url { URL(), domain }; if (!url.isValid()) continue; WebCore::RegistrableDomain appBoundDomain { url }; if (appBoundDomain.isEmpty()) continue; appBoundDomains().add(appBoundDomain); if (appBoundDomains().size() >= maxAppBoundDomainCount) break; } WEBSITE_DATA_STORE_ADDITIONS hasInitializedAppBoundDomains = true; }); }); } Then you only have to call initializeAppBoundDomains(ForceReinitialization::Yes) in your new reinitializeAppBoundDomains() method. What do you think?
Chris Dumez
Comment 8 2020-03-13 13:13:50 PDT
(In reply to Chris Dumez from comment #7) > Comment on attachment 393519 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=393519&action=review > > > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:527 > > + hasInitializedAppBoundDomains = false; > > I think that for this code to actually be correct, you'd have to reset > hasInitializedAppBoundDomains to false in the lambda inside > clearAppBoundDomains(), after clearing the domains. That said, I think we > can simplify this code a lot like by tweaking existing code like so: > > enum class ForceReinitialization : bool { No, Yes }; > void WebsiteDataStore::initializeAppBoundDomains(ForceReinitialization > forceReinitialization) > { > ASSERT(RunLoop::isMain()); > > if (hasInitializedAppBoundDomains && forceReinitialization != > ForceReinitialization::Yes) // Updated > return; > > static const auto maxAppBoundDomainCount = 10; > > appBoundDomainQueue().dispatch([forceReinitialization] () mutable { > if (hasInitializedAppBoundDomains && forceReinitialization != > ForceReinitialization::Yes) // Updated > return; > > NSArray<NSString *> *domains = [[NSBundle mainBundle] > objectForInfoDictionaryKey:@"WKAppBoundDomains"]; > > RunLoop::main().dispatch([forceReinitialization , domains = > retainPtr(domains)] { > if ( forceReinitialization == ForceReinitialization::Yes) // New > appBoundDomains().clear(); // New > > for (NSString *domain in domains.get()) { > URL url { URL(), domain }; > if (!url.isValid()) > continue; > WebCore::RegistrableDomain appBoundDomain { url }; > if (appBoundDomain.isEmpty()) > continue; > appBoundDomains().add(appBoundDomain); > if (appBoundDomains().size() >= maxAppBoundDomainCount) > break; > } > WEBSITE_DATA_STORE_ADDITIONS > hasInitializedAppBoundDomains = true; > }); > }); > } > > Then you only have to call > initializeAppBoundDomains(ForceReinitialization::Yes) in your new > reinitializeAppBoundDomains() method. > > What do you think? Actually, I think you have to reset hasInitializedAppBoundDomains synchronously to false on the main thread to avoid flakiness. Here is a counter proposal then: void WebsiteDataStore::reinitializeAppBoundDomains() { if (!hasInitializedAppBoundDomains) return; appBoundDomains().clear(); hasInitializedAppBoundDomains = false; initializeAppBoundDomains(); }
Kate Cheney
Comment 9 2020-03-13 13:32:47 PDT
(In reply to Chris Dumez from comment #7) > Comment on attachment 393519 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=393519&action=review > > > Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:527 > > + hasInitializedAppBoundDomains = false; > > I think that for this code to actually be correct, you'd have to reset > hasInitializedAppBoundDomains to false in the lambda inside > clearAppBoundDomains(), after clearing the domains. That said, I think we > can simplify this code a lot like by tweaking existing code like so: > > enum class ForceReinitialization : bool { No, Yes }; > void WebsiteDataStore::initializeAppBoundDomains(ForceReinitialization > forceReinitialization) > { > ASSERT(RunLoop::isMain()); > > if (hasInitializedAppBoundDomains && forceReinitialization != > ForceReinitialization::Yes) // Updated > return; > > static const auto maxAppBoundDomainCount = 10; > > appBoundDomainQueue().dispatch([forceReinitialization] () mutable { > if (hasInitializedAppBoundDomains && forceReinitialization != > ForceReinitialization::Yes) // Updated > return; > > NSArray<NSString *> *domains = [[NSBundle mainBundle] > objectForInfoDictionaryKey:@"WKAppBoundDomains"]; > > RunLoop::main().dispatch([forceReinitialization , domains = > retainPtr(domains)] { > if ( forceReinitialization == ForceReinitialization::Yes) // New > appBoundDomains().clear(); // New > > for (NSString *domain in domains.get()) { > URL url { URL(), domain }; > if (!url.isValid()) > continue; > WebCore::RegistrableDomain appBoundDomain { url }; > if (appBoundDomain.isEmpty()) > continue; > appBoundDomains().add(appBoundDomain); > if (appBoundDomains().size() >= maxAppBoundDomainCount) > break; > } > WEBSITE_DATA_STORE_ADDITIONS > hasInitializedAppBoundDomains = true; > }); > }); > } > > Then you only have to call > initializeAppBoundDomains(ForceReinitialization::Yes) in your new > reinitializeAppBoundDomains() method. > > What do you think? This looks good! With the addition of setting hasInitializedAppBoundDomains = false before calling this in reinitializeAppBoundDomains
Kate Cheney
Comment 10 2020-03-13 13:53:43 PDT
WebKit Commit Bot
Comment 11 2020-03-13 14:57:01 PDT
Comment on attachment 393525 [details] Patch Clearing flags on attachment: 393525 Committed r258436: <https://trac.webkit.org/changeset/258436>
WebKit Commit Bot
Comment 12 2020-03-13 14:57:03 PDT
All reviewed patches have been landed. Closing bug.
Radar WebKit Bug Importer
Comment 13 2020-03-13 14:58:17 PDT
Note You need to log in before you can comment on or make changes to this bug.