Skip to content

Commit

Permalink
Update LinkDecorationFilteringObserver/Controller with review feedback
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=266076
rdar://119380680

Reviewed by Wenson Hsieh.

I received review feedback on some similar changes that followed how
LinkDecorationObserver/Controller is defined and implemented. This patch makes
the relevant changes that are appropriate for these classes.

We can simplify and reduce duplication in another patch.

* Source/WebKit/Platform/cocoa/WebPrivacyHelpers.h:
(WebKit::LinkDecorationFilteringDataObserver::LinkDecorationFilteringDataObserver):
* Source/WebKit/Platform/cocoa/WebPrivacyHelpers.mm:
(WebKit::LinkDecorationFilteringController::shared):
(WebKit::LinkDecorationFilteringController::observeUpdates):
(WebKit::LinkDecorationFilteringController::updateStrings):

Canonical link: https://commits.webkit.org/271816@main
  • Loading branch information
sysrqb authored and Matthew Finkel committed Dec 9, 2023
1 parent bceb690 commit 637d7cf
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 22 deletions.
20 changes: 10 additions & 10 deletions Source/WebKit/Platform/cocoa/WebPrivacyHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,21 @@ void requestLinkDecorationFilteringData(CompletionHandler<void(Vector<WebCore::L

class LinkDecorationFilteringDataObserver : public RefCounted<LinkDecorationFilteringDataObserver>, public CanMakeWeakPtr<LinkDecorationFilteringDataObserver> {
public:
~LinkDecorationFilteringDataObserver() = default;

private:
friend class LinkDecorationFilteringController;

LinkDecorationFilteringDataObserver(Function<void()>&& callback)
: m_callback { WTFMove(callback) }
{
}

static Ref<LinkDecorationFilteringDataObserver> create(Function<void()>&& callback)
{
return adoptRef(*new LinkDecorationFilteringDataObserver(WTFMove(callback)));
}

~LinkDecorationFilteringDataObserver() = default;

void invokeCallback() { m_callback(); }

private:
explicit LinkDecorationFilteringDataObserver(Function<void()>&& callback)
: m_callback { WTFMove(callback) }
{
}

Function<void()> m_callback;
};

Expand All @@ -80,7 +78,9 @@ class LinkDecorationFilteringController {
Ref<LinkDecorationFilteringDataObserver> observeUpdates(Function<void()>&&);

private:
friend class NeverDestroyed<LinkDecorationFilteringController, MainThreadAccessTraits>;
LinkDecorationFilteringController() = default;

void setCachedStrings(Vector<WebCore::LinkDecorationFilteringData>&&);

RetainPtr<WKWebPrivacyNotificationListener> m_notificationListener;
Expand Down
27 changes: 15 additions & 12 deletions Source/WebKit/Platform/cocoa/WebPrivacyHelpers.mm
Original file line number Diff line number Diff line change
Expand Up @@ -154,22 +154,24 @@ - (void)didUpdate:(NSNotification *)notification

LinkDecorationFilteringController& LinkDecorationFilteringController::shared()
{
static LinkDecorationFilteringController* sharedInstance = new LinkDecorationFilteringController;
return *sharedInstance;
static MainThreadNeverDestroyed<LinkDecorationFilteringController> sharedInstance;
return sharedInstance.get();
}

Ref<LinkDecorationFilteringDataObserver> LinkDecorationFilteringController::observeUpdates(Function<void()>&& callback)
{
ASSERT(RunLoop::isMain());
if (!m_notificationListener) {
m_notificationListener = adoptNS([WKWebPrivacyNotificationListener new]);
[m_notificationListener listenForLinkFilteringDataChanges:^{
updateStrings([this] {
for (auto& observer : m_observers)
m_observers.forEach([](auto& observer) {
observer.invokeCallback();
});
});
}];
}
auto observer = LinkDecorationFilteringDataObserver::create(WTFMove(callback));
Ref observer = LinkDecorationFilteringDataObserver::create(WTFMove(callback));
m_observers.add(observer.get());
return observer;
}
Expand All @@ -180,19 +182,20 @@ - (void)didUpdate:(NSNotification *)notification
m_cachedStrings.shrinkToFit();
}

void LinkDecorationFilteringController::updateStrings(CompletionHandler<void()>&& callback)
void LinkDecorationFilteringController::updateStrings(CompletionHandler<void()>&& completionHandler)
{
ASSERT(RunLoop::isMain());
if (!WebKit::canUseWebPrivacyFramework()) {
callback();
completionHandler();
return;
}

static NeverDestroyed<Vector<CompletionHandler<void()>, 1>> lookupCallbacks;
lookupCallbacks->append(WTFMove(callback));
if (lookupCallbacks->size() > 1)
static NeverDestroyed<Vector<CompletionHandler<void()>, 1>> lookupCompletionHandlers;
lookupCompletionHandlers->append(WTFMove(completionHandler));
if (lookupCompletionHandlers->size() > 1)
return;

auto options = adoptNS([PAL::allocWPResourceRequestOptionsInstance() init]);
RetainPtr options = adoptNS([PAL::allocWPResourceRequestOptionsInstance() init]);
[options setAfterUpdates:NO];

[[PAL::getWPResourcesClass() sharedInstance] requestLinkFilteringData:options.get() completionHandler:^(WPLinkFilteringData *data, NSError *error) {
Expand All @@ -206,8 +209,8 @@ - (void)didUpdate:(NSNotification *)notification
setCachedStrings(WTFMove(result));
}

for (auto& callback : std::exchange(lookupCallbacks.get(), { }))
callback();
for (auto& completionHandler : std::exchange(lookupCompletionHandlers.get(), { }))
completionHandler();
}];

}
Expand Down

0 comments on commit 637d7cf

Please sign in to comment.