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

Reply via email to