Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 5e5036cfc5f23e8cc1381e199696a67afa2e62b3
https://github.com/WebKit/WebKit/commit/5e5036cfc5f23e8cc1381e199696a67afa2e62b3
Author: Alex Christensen <[email protected]>
Date: 2025-10-24 (Fri, 24 Oct 2025)
Changed paths:
M Source/WebCore/CMakeLists.txt
M Source/WebCore/DerivedSources-input.xcfilelist
M Source/WebCore/DerivedSources-output.xcfilelist
M Source/WebCore/DerivedSources.make
M Source/WebCore/Headers.cmake
M Source/WebCore/Sources.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/loader/EmptyClients.cpp
M Source/WebCore/page/LocalDOMWindow.cpp
M Source/WebCore/page/UserContentController.h
M Source/WebCore/page/UserContentProvider.h
M Source/WebCore/page/WebKitNamespace.cpp
M Source/WebCore/page/WebKitNamespace.h
M Source/WebCore/page/WebKitNamespace.idl
A Source/WebCore/page/WebKitStringMatcher.cpp
A Source/WebCore/page/WebKitStringMatcher.h
A Source/WebCore/page/WebKitStringMatcher.idl
A Source/WebCore/page/WebKitStringMatcherOptions.h
A Source/WebCore/page/WebKitStringMatcherOptions.idl
A Source/WebCore/page/WebKitStringMatchersNamespace.cpp
A Source/WebCore/page/WebKitStringMatchersNamespace.h
A Source/WebCore/page/WebKitStringMatchersNamespace.idl
M Source/WebKit/Modules/OSX_Private.modulemap
M Source/WebKit/Modules/iOS_Private.modulemap
M Source/WebKit/Scripts/webkit/messages.py
M Source/WebKit/Shared/API/APIObject.h
M Source/WebKit/Shared/Cocoa/APIObject.mm
M Source/WebKit/Shared/UserContentControllerParameters.h
M Source/WebKit/Shared/UserContentControllerParameters.serialization.in
A Source/WebKit/Shared/WebUserContentControllerDataTypes.cpp
M Source/WebKit/Shared/WebUserContentControllerDataTypes.h
M Source/WebKit/Shared/WebUserContentControllerDataTypes.serialization.in
M Source/WebKit/Sources.txt
M Source/WebKit/SourcesCocoa.txt
A Source/WebKit/UIProcess/API/APIStringMatcher.cpp
A Source/WebKit/UIProcess/API/APIStringMatcher.h
M Source/WebKit/UIProcess/API/Cocoa/WKUserContentController.mm
M Source/WebKit/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h
A Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcher.h
A Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcher.mm
A Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcherInternal.h
M Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp
M Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h
M Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.mm
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/InjectedBundle/InjectedBundleScriptWorld.cpp
M Source/WebKit/WebProcess/InjectedBundle/InjectedBundleScriptWorld.h
A Source/WebKit/WebProcess/UserContent/SharedMemoryStringMatcher.cpp
A Source/WebKit/WebProcess/UserContent/SharedMemoryStringMatcher.h
M Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp
M Source/WebKit/WebProcess/UserContent/WebUserContentController.h
M Source/WebKit/WebProcess/UserContent/WebUserContentController.messages.in
M Tools/TestWebKitAPI/SourcesCocoa.txt
M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
M Tools/TestWebKitAPI/Tests/WebKitCocoa/EnhancedSecurity.mm
A Tools/TestWebKitAPI/Tests/WebKitCocoa/StringMatcher.mm
Log Message:
-----------
Add prototype string matcher API
https://bugs.webkit.org/show_bug.cgi?id=300829
rdar://162715982
Reviewed by Ryosuke Niwa.
Safari has some sets of strings it searches for as substrings of longer strings.
It needs to do the searches quickly with as little startup time as possible.
Arno experimented with using regular expressions instead, but that
had too much start up time because there are thousands of strings being searched
for. I experimented with using a typical DFA with one transition per code unit,
but that had 200x as many transitions as this and didn't fit as well into a
CPU's
L1 cache. Instead, this PR introduces a trie-based finite state machine that
starts
at the root with every code point in the input string. I slightly changed the
format
of the DFA from what is currently in use in Safari to create a primitive that
can match
substrings of each other, such as matching "aba" and "ba" and reporting that
both
were matched instead of only reporting the shortest one being matched.
This new primitive doesn't actually enable anything that can't functionally be
done
with regular expressions, but for large sets of regular expressions that are
used
over and over again in one process then another, this allows a reduction in time
spent compiling the regular expressions.
Even less useful than something that doesn't enable new behavior is a native API
that allows string matching on strings. I added such an interface,
resultsForMatchingCharacters:length:matchAll:searchReverse:, but only
temporarily
as a way for Safari to incrementally transition away from the injected bundle
use
by having a native matcher that behaves exactly the same as _WKStringMatcher.
Once the transition is complete, this will be removed.
* Source/WebCore/CMakeLists.txt:
* Source/WebCore/DerivedSources-input.xcfilelist:
* Source/WebCore/DerivedSources-output.xcfilelist:
* Source/WebCore/DerivedSources.make:
* Source/WebCore/Headers.cmake:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/loader/EmptyClients.cpp:
* Source/WebCore/page/LocalDOMWindow.cpp:
(WebCore::LocalDOMWindow::shouldHaveWebKitNamespaceForWorld):
* Source/WebCore/page/UserContentController.h:
* Source/WebCore/page/UserContentProvider.h:
* Source/WebCore/page/WebKitNamespace.cpp:
(WebCore::WebKitNamespace::WebKitNamespace):
(WebCore::WebKitNamespace::messageHandlers):
(WebCore::WebKitNamespace::stringMatchers):
* Source/WebCore/page/WebKitNamespace.h:
* Source/WebCore/page/WebKitNamespace.idl:
* Source/WebCore/page/WebKitStringMatcher.cpp: Added.
(WebCore::match):
(WebCore::WebKitStringMatcher::match):
(WebCore::WebKitStringMatcher::Trie::Node::traverse const):
(WebCore::WebKitStringMatcher::Trie::Trie):
(WebCore::WebKitStringMatcher::Trie::serialize const):
(WebCore::WebKitStringMatcher::dataForMatchingStrings):
(WebCore::WebKitStringMatcher::statesAndTransitionsFromVersionedData):
* Source/WebCore/page/WebKitStringMatcher.h: Copied from
Source/WebKit/Shared/WebUserContentControllerDataTypes.h.
* Source/WebCore/page/WebKitStringMatcher.idl: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebCore/page/WebKitStringMatcherOptions.h: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebCore/page/WebKitStringMatcherOptions.idl: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebCore/page/WebKitStringMatchersNamespace.cpp: Copied from
Source/WebKit/Shared/WebUserContentControllerDataTypes.h.
(WebCore::WebKitStringMatchersNamespace::WebKitStringMatchersNamespace):
(WebCore::WebKitStringMatchersNamespace::namedItem):
(WebCore::WebKitStringMatchersNamespace::supportedPropertyNames const):
(WebCore::WebKitStringMatchersNamespace::isSupportedPropertyName):
* Source/WebCore/page/WebKitStringMatchersNamespace.h: Copied from
Source/WebKit/Shared/WebUserContentControllerDataTypes.h.
(WebCore::WebKitStringMatchersNamespace::create):
* Source/WebCore/page/WebKitStringMatchersNamespace.idl: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebKit/Modules/OSX_Private.modulemap:
* Source/WebKit/Modules/iOS_Private.modulemap:
* Source/WebKit/Scripts/webkit/messages.py:
(headers_for_type):
* Source/WebKit/Shared/API/APIObject.h:
* Source/WebKit/Shared/Cocoa/APIObject.mm:
(API::Object::newObject):
* Source/WebKit/Shared/UserContentControllerParameters.h:
* Source/WebKit/Shared/UserContentControllerParameters.serialization.in:
* Source/WebKit/Shared/WebUserContentControllerDataTypes.cpp: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
(WebKit::WebStringMatcherData::WebStringMatcherData):
(WebKit::WebStringMatcherData::sharedMemoryHandle const):
* Source/WebKit/Shared/WebUserContentControllerDataTypes.h:
* Source/WebKit/Shared/WebUserContentControllerDataTypes.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/API/APIStringMatcher.cpp: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
(API::StringMatcher::StringMatcher):
(API::StringMatcher::sharedMemory):
(API::StringMatcher::sharedBuffer):
* Source/WebKit/UIProcess/API/APIStringMatcher.h: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebKit/UIProcess/API/Cocoa/WKUserContentController.mm:
(-[WKUserContentController _addStringMatcher:contentWorld:name:]):
(-[WKUserContentController _removeStringMatcherWithName:contentWorld:]):
* Source/WebKit/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcher.h: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcher.mm: Added.
(-[_WKStringMatcher initWithData:]):
(-[_WKStringMatcher initWithDataInFile:]):
(-[_WKStringMatcher dealloc]):
(+[_WKStringMatcher matcherDataForStringsAndIdentifiers:]):
(-[_WKStringMatcher
resultsForMatchingCharacters:length:matchAll:searchReverse:]):
(-[_WKStringMatcher _apiObject]):
* Source/WebKit/UIProcess/API/Cocoa/_WKStringMatcherInternal.h: Copied from
Source/WebKit/Shared/UserContentControllerParameters.h.
* Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp:
(WebKit::WebUserContentControllerProxy::parametersForProcess const):
(WebKit::WebUserContentControllerProxy::addStringMatcher):
(WebKit::WebUserContentControllerProxy::removeStringMatcher):
* Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h:
* Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.mm:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/InjectedBundle/InjectedBundleScriptWorld.cpp:
(WebKit::InjectedBundleScriptWorld::get):
* Source/WebKit/WebProcess/InjectedBundle/InjectedBundleScriptWorld.h:
* Source/WebKit/WebProcess/UserContent/SharedMemoryStringMatcher.cpp: Added.
(WebKit::SharedMemoryStringMatcher::create):
(WebKit::SharedMemoryStringMatcher::SharedMemoryStringMatcher):
* Source/WebKit/WebProcess/UserContent/SharedMemoryStringMatcher.h: Added.
* Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp:
(WebKit::WebUserContentController::getOrCreate):
(WebKit::WebUserContentController::removeContentWorld):
(WebKit::WebUserContentController::addStringMatcher):
(WebKit::WebUserContentController::removeStringMatcher):
(WebKit::WebUserContentController::hasStringMatchersForWorld const):
(WebKit::WebUserContentController::stringMatcher const):
* Source/WebKit/WebProcess/UserContent/WebUserContentController.h:
* Source/WebKit/WebProcess/UserContent/WebUserContentController.messages.in:
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/EnhancedSecurity.mm:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/StringMatcher.mm: Added.
(TEST(StringMatcher, MatcherData)):
(TEST(StringMatcher, MatchResults)):
(TEST(StringMatcher, IDLExposed)):
(TEST(StringMatcher, CharacterEdgeCases)):
Canonical link: https://commits.webkit.org/302111@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications