Changeset 181000 in webkit


Ignore:
Timestamp:
Mar 4, 2015 8:41:31 AM (9 years ago)
Author:
weinig@apple.com
Message:

[Content Extensions] Split parsing and compiling of content extensions into their own files
https://bugs.webkit.org/show_bug.cgi?id=142259

Reviewed by Anders Carlsson.

Source/WebCore:

Added new unit test:

ContentFilterTest.Basic

  • WebCore.xcodeproj/project.pbxproj:

Add new files (CompiledContentExtension.h/cpp, ContentExtensionCompiler.h/cpp, and ContentExtensionParser.h/cpp)

  • contentextensions/CompiledContentExtension.cpp: Added.
  • contentextensions/CompiledContentExtension.h: Added.

Add new class for holding onto the compiled content extension itself. Make it ThreadSafeRefCounted so it is easy
to move between threads which will be important in a subsequent patch where we enable compilation on a background
thread.

  • contentextensions/ContentExtensionCompiler.cpp: Added.

(WebCore::ContentExtensions::serializeActions):
(WebCore::ContentExtensions::compileRuleList):

  • contentextensions/ContentExtensionCompiler.h: Added.

Moving compilation to its own file. Was previously in ContentExtensionsBackend. This is necessary because
we will want to be able to compile without the need of a backend.

  • contentextensions/ContentExtensionParser.cpp: Copied from contentextensions/ContentExtensionsManager.cpp.
  • contentextensions/ContentExtensionParser.h: Copied from contentextensions/ContentExtensionsManager.h.

Renamed ContentExtensionsManager to ContentExtensionParser, since that is all it is doing.

  • contentextensions/ContentExtensionsBackend.cpp:

(WebCore::ContentExtensions::ContentExtensionsBackend::addContentExtension):
(WebCore::ContentExtensions::ContentExtensionsBackend::removeContentExtension):
(WebCore::ContentExtensions::ContentExtensionsBackend::removeAllContentExtensions):
(WebCore::ContentExtensions::ContentExtensionsBackend::actionsForURL):
(WebCore::ContentExtensions::ContentExtensionsBackend::serializeActions): Deleted.
(WebCore::ContentExtensions::ContentExtensionsBackend::setRuleList): Deleted.
(WebCore::ContentExtensions::ContentExtensionsBackend::removeRuleList): Deleted.
(WebCore::ContentExtensions::ContentExtensionsBackend::removeAllRuleLists): Deleted.

  • contentextensions/ContentExtensionsBackend.h:

Change the backend to use the new CompiledContentExtension and change the terminology to
reference content extensions, rather than rule lists.

  • page/UserContentController.cpp:

(WebCore::UserContentController::addUserContentFilter):
(WebCore::UserContentController::removeUserContentFilter):
(WebCore::UserContentController::removeAllUserContentFilters):
Update for new names and change addUserContentFilter to explicitly compile the JSON
rule list before handing it to the backend. In subsequent changes, addUserContentFilter
should be changed to take the compiled content extension, and it should become the responsibility
of the called (WebKit) to create them.

Tools:

Add basic unit test for the content filter compiler.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebCore/ContentFilter.cpp: Added.

(WebCore::ContentExtensions::operator<<):
(TestWebKitAPI::ContentFilterTest::SetUp):
(TestWebKitAPI::TEST_F):

Location:
trunk
Files:
5 added
7 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r180997 r181000  
     12015-03-03  Sam Weinig  <sam@webkit.org>
     2
     3        [Content Extensions] Split parsing and compiling of content extensions into their own files
     4        https://bugs.webkit.org/show_bug.cgi?id=142259
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Added new unit test:
     9            ContentFilterTest.Basic
     10
     11        * WebCore.xcodeproj/project.pbxproj:
     12        Add new files (CompiledContentExtension.h/cpp, ContentExtensionCompiler.h/cpp, and ContentExtensionParser.h/cpp)
     13
     14        * contentextensions/CompiledContentExtension.cpp: Added.
     15        * contentextensions/CompiledContentExtension.h: Added.
     16        Add new class for holding onto the compiled content extension itself. Make it ThreadSafeRefCounted so it is easy
     17        to move between threads which will be important in a subsequent patch where we enable compilation on a background
     18        thread.
     19
     20        * contentextensions/ContentExtensionCompiler.cpp: Added.
     21        (WebCore::ContentExtensions::serializeActions):
     22        (WebCore::ContentExtensions::compileRuleList):
     23        * contentextensions/ContentExtensionCompiler.h: Added.
     24        Moving compilation to its own file. Was previously in ContentExtensionsBackend. This is necessary because
     25        we will want to be able to compile without the need of a backend.
     26
     27        * contentextensions/ContentExtensionParser.cpp: Copied from contentextensions/ContentExtensionsManager.cpp.
     28        * contentextensions/ContentExtensionParser.h: Copied from contentextensions/ContentExtensionsManager.h.
     29        Renamed ContentExtensionsManager to ContentExtensionParser, since that is all it is doing.
     30
     31        * contentextensions/ContentExtensionsBackend.cpp:
     32        (WebCore::ContentExtensions::ContentExtensionsBackend::addContentExtension):
     33        (WebCore::ContentExtensions::ContentExtensionsBackend::removeContentExtension):
     34        (WebCore::ContentExtensions::ContentExtensionsBackend::removeAllContentExtensions):
     35        (WebCore::ContentExtensions::ContentExtensionsBackend::actionsForURL):
     36        (WebCore::ContentExtensions::ContentExtensionsBackend::serializeActions): Deleted.
     37        (WebCore::ContentExtensions::ContentExtensionsBackend::setRuleList): Deleted.
     38        (WebCore::ContentExtensions::ContentExtensionsBackend::removeRuleList): Deleted.
     39        (WebCore::ContentExtensions::ContentExtensionsBackend::removeAllRuleLists): Deleted.
     40        * contentextensions/ContentExtensionsBackend.h:
     41        Change the backend to use the new CompiledContentExtension and change the terminology to
     42        reference content extensions, rather than rule lists.
     43
     44        * page/UserContentController.cpp:
     45        (WebCore::UserContentController::addUserContentFilter):
     46        (WebCore::UserContentController::removeUserContentFilter):
     47        (WebCore::UserContentController::removeAllUserContentFilters):
     48        Update for new names and change addUserContentFilter to explicitly compile the JSON
     49        rule list before handing it to the backend. In subsequent changes, addUserContentFilter
     50        should be changed to take the compiled content extension, and it should become the responsibility
     51        of the called (WebKit) to create them.
     52
    1532015-03-04  Philippe Normand  <pnormand@igalia.com>
    254
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r180996 r181000  
    10321032                26C17A3F1491D2D400D12BA2 /* FileSystemIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26C17A3D1491D2D400D12BA2 /* FileSystemIOS.mm */; };
    10331033                26E98A10130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E98A0F130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h */; };
    1034                 26F0C8971A2E724B002794F8 /* ContentExtensionsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F0C8951A2E724B002794F8 /* ContentExtensionsManager.cpp */; };
    1035                 26F0C8981A2E724B002794F8 /* ContentExtensionsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C8961A2E724B002794F8 /* ContentExtensionsManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1034                26F0C8971A2E724B002794F8 /* ContentExtensionParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F0C8951A2E724B002794F8 /* ContentExtensionParser.cpp */; };
     1035                26F0C8981A2E724B002794F8 /* ContentExtensionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C8961A2E724B002794F8 /* ContentExtensionParser.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10361036                26F0C89B1A2EC110002794F8 /* ContentExtensionRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F0C8991A2EC110002794F8 /* ContentExtensionRule.cpp */; };
    1037                 26F0C89C1A2EC110002794F8 /* ContentExtensionRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */; };
     1037                26F0C89C1A2EC110002794F8 /* ContentExtensionRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10381038                26F0C89F1A2EC3BE002794F8 /* ContentExtensionsBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F0C89D1A2EC3BE002794F8 /* ContentExtensionsBackend.cpp */; };
    1039                 26F0C8A01A2EC3BE002794F8 /* ContentExtensionsBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C89E1A2EC3BE002794F8 /* ContentExtensionsBackend.h */; };
     1039                26F0C8A01A2EC3BE002794F8 /* ContentExtensionsBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0C89E1A2EC3BE002794F8 /* ContentExtensionsBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10401040                26F40D4A14904A6300CA67C4 /* EventLoopIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26F40D4914904A6300CA67C4 /* EventLoopIOS.mm */; };
    10411041                26F9A83818A046AC00AEB88A /* ViewportConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F9A83618A046AC00AEB88A /* ViewportConfiguration.cpp */; };
     
    21452145                5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C39305E1AA0F6A90029C816 /* DFABytecodeCompiler.cpp */; };
    21462146                5C9A7A761AA0F6ED00958ACF /* DFABytecodeInterpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C3930601AA0F6A90029C816 /* DFABytecodeInterpreter.cpp */; };
    2147                 5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; };
     2147                5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; settings = {ATTRIBUTES = (Private, ); }; };
    21482148                5CD9F5671AA0F74200DA45FF /* DFABytecodeCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305F1AA0F6A90029C816 /* DFABytecodeCompiler.h */; };
    21492149                5CD9F5681AA0F74600DA45FF /* DFABytecodeInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C3930611AA0F6A90029C816 /* DFABytecodeInterpreter.h */; };
    2150                 5CDFA6C81AA4F2DA00EA8746 /* ContentExtensionActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */; };
     2150                5CDFA6C81AA4F2DA00EA8746 /* ContentExtensionActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */; settings = {ATTRIBUTES = (Private, ); }; };
    21512151                5CFC4350192409E300A0D3B5 /* PointerLockController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CFC434E192406A900A0D3B5 /* PointerLockController.cpp */; };
    21522152                5D21A80213ECE5DF00BB7064 /* WebVTTParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D21A80013ECE5DF00BB7064 /* WebVTTParser.cpp */; };
     
    25012501                7C74D43B1882400400E5ED57 /* UTextProviderUTF16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C74D4391882400400E5ED57 /* UTextProviderUTF16.cpp */; };
    25022502                7C74D43C1882400400E5ED57 /* UTextProviderUTF16.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C74D43A1882400400E5ED57 /* UTextProviderUTF16.h */; };
     2503                7C93F3491AA6BA5E00A98BAB /* CompiledContentExtension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C93F3471AA6BA5E00A98BAB /* CompiledContentExtension.cpp */; };
     2504                7C93F34A1AA6BA5E00A98BAB /* CompiledContentExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C93F3481AA6BA5E00A98BAB /* CompiledContentExtension.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2505                7C93F34D1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C93F34B1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp */; };
     2506                7C93F34E1AA6BF0700A98BAB /* ContentExtensionCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; };
    25032507                7C9DBFED1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */; };
    25042508                7C9DBFEE1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C9DBFEC1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h */; };
     
    80798083                26C17A3D1491D2D400D12BA2 /* FileSystemIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FileSystemIOS.mm; path = ios/FileSystemIOS.mm; sourceTree = "<group>"; };
    80808084                26E98A0F130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCodecASCIIFastPath.h; sourceTree = "<group>"; };
    8081                 26F0C8951A2E724B002794F8 /* ContentExtensionsManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionsManager.cpp; sourceTree = "<group>"; };
    8082                 26F0C8961A2E724B002794F8 /* ContentExtensionsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionsManager.h; sourceTree = "<group>"; };
     8085                26F0C8951A2E724B002794F8 /* ContentExtensionParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionParser.cpp; sourceTree = "<group>"; };
     8086                26F0C8961A2E724B002794F8 /* ContentExtensionParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionParser.h; sourceTree = "<group>"; };
    80838087                26F0C8991A2EC110002794F8 /* ContentExtensionRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionRule.cpp; sourceTree = "<group>"; };
    80848088                26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionRule.h; sourceTree = "<group>"; };
     
    97119715                7C74D4391882400400E5ED57 /* UTextProviderUTF16.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UTextProviderUTF16.cpp; sourceTree = "<group>"; };
    97129716                7C74D43A1882400400E5ED57 /* UTextProviderUTF16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTextProviderUTF16.h; sourceTree = "<group>"; };
     9717                7C93F3471AA6BA5E00A98BAB /* CompiledContentExtension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompiledContentExtension.cpp; sourceTree = "<group>"; };
     9718                7C93F3481AA6BA5E00A98BAB /* CompiledContentExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompiledContentExtension.h; sourceTree = "<group>"; };
     9719                7C93F34B1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionCompiler.cpp; sourceTree = "<group>"; };
     9720                7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionCompiler.h; sourceTree = "<group>"; };
    97139721                7C9DBFEA1A9C489F000D6B25 /* HTMLAttachmentElement.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = HTMLAttachmentElement.idl; sourceTree = "<group>"; };
    97149722                7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLAttachmentElement.cpp; sourceTree = "<group>"; };
     
    1541015418                        isa = PBXGroup;
    1541115419                        children = (
     15420                                7C93F3471AA6BA5E00A98BAB /* CompiledContentExtension.cpp */,
     15421                                7C93F3481AA6BA5E00A98BAB /* CompiledContentExtension.h */,
    1541215422                                5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */,
     15423                                7C93F34B1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp */,
     15424                                7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */,
     15425                                26F0C8951A2E724B002794F8 /* ContentExtensionParser.cpp */,
     15426                                26F0C8961A2E724B002794F8 /* ContentExtensionParser.h */,
    1541315427                                26F0C8991A2EC110002794F8 /* ContentExtensionRule.cpp */,
    1541415428                                26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */,
     
    1541615430                                26F0C89E1A2EC3BE002794F8 /* ContentExtensionsBackend.h */,
    1541715431                                262391351A648CEE007251A3 /* ContentExtensionsDebugging.h */,
    15418                                 26F0C8951A2E724B002794F8 /* ContentExtensionsManager.cpp */,
    15419                                 26F0C8961A2E724B002794F8 /* ContentExtensionsManager.h */,
    1542015432                                267725F61A5B3AD9003C24DD /* DFA.cpp */,
    1542115433                                267725F71A5B3AD9003C24DD /* DFA.h */,
     
    2524025252                                B2FA3D590AB75A6F000E5AC4 /* JSSVGCircleElement.h in Headers */,
    2524125253                                B2FA3D5B0AB75A6F000E5AC4 /* JSSVGClipPathElement.h in Headers */,
    25242                                 26F0C8981A2E724B002794F8 /* ContentExtensionsManager.h in Headers */,
     25254                                26F0C8981A2E724B002794F8 /* ContentExtensionParser.h in Headers */,
    2524325255                                B2FA3D5D0AB75A6F000E5AC4 /* JSSVGColor.h in Headers */,
    2524425256                                B2FA3D5F0AB75A6F000E5AC4 /* JSSVGComponentTransferFunctionElement.h in Headers */,
     
    2644626458                                B2227A300D00BF220071B782 /* SVGLangSpace.h in Headers */,
    2644726459                                B2227A330D00BF220071B782 /* SVGLength.h in Headers */,
     26460                                7C93F34A1AA6BA5E00A98BAB /* CompiledContentExtension.h in Headers */,
    2644826461                                7134496E146941B300720312 /* SVGLengthContext.h in Headers */,
    2644926462                                B2227A360D00BF220071B782 /* SVGLengthList.h in Headers */,
     
    2651026523                                84300BD6120C9AAC0021954A /* SVGPathStringSource.h in Headers */,
    2651126524                                84C5B2FB1216DC810088B53A /* SVGPathTraversalStateBuilder.h in Headers */,
     26525                                7C93F34E1AA6BF0700A98BAB /* ContentExtensionCompiler.h in Headers */,
    2651226526                                71A57DF2154BE25C0009D120 /* SVGPathUtilities.h in Headers */,
    2651326527                                B2227A880D00BF220071B782 /* SVGPatternElement.h in Headers */,
     
    2841928433                                FB91392B16AE4FC0001FE682 /* JSDOMPath.cpp in Sources */,
    2842028434                                A9D247FE0D757E6900FDF959 /* JSDOMPlugin.cpp in Sources */,
    28421                                 26F0C8971A2E724B002794F8 /* ContentExtensionsManager.cpp in Sources */,
     28435                                26F0C8971A2E724B002794F8 /* ContentExtensionParser.cpp in Sources */,
    2842228436                                A9D248000D757E6900FDF959 /* JSDOMPluginArray.cpp in Sources */,
    2842328437                                A9C6E64C0D7465E7006442E9 /* JSDOMPluginArrayCustom.cpp in Sources */,
     
    2889428908                                7118FED415685CC60030B79A /* JSSVGViewSpec.cpp in Sources */,
    2889528909                                8485227D1190162C006EDC7F /* JSSVGVKernElement.cpp in Sources */,
     28910                                7C93F3491AA6BA5E00A98BAB /* CompiledContentExtension.cpp in Sources */,
    2889628911                                71DCB7011568197600862271 /* JSSVGZoomAndPan.cpp in Sources */,
    2889728912                                B2FA3E180AB75A6F000E5AC4 /* JSSVGZoomEvent.cpp in Sources */,
     
    2907729092                                6C568CB019DAFEA000430CA2 /* MaskImageOperation.cpp in Sources */,
    2907829093                                CDA98E0D1603FE4A00FEA3B1 /* MediaKeys.cpp in Sources */,
     29094                                7C93F34D1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp in Sources */,
    2907929095                                CDA98E0E1603FE5800FEA3B1 /* MediaKeySession.cpp in Sources */,
    2908029096                                A8EA80090A19516E00A8EF5F /* MediaList.cpp in Sources */,
  • trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp

    r180984 r181000  
    2525
    2626#include "config.h"
    27 #include "ContentExtensionsManager.h"
     27#include "ContentExtensionParser.h"
    2828
    2929#if ENABLE(CONTENT_EXTENSIONS)
     
    4747namespace ContentExtensions {
    4848
    49 namespace ExtensionsManager {
    50 
    5149static bool loadTrigger(ExecState& exec, JSObject& ruleObject, Trigger& trigger)
    5250{
     
    171169}
    172170
    173 Vector<ContentExtensionRule> createRuleList(const String& rules)
     171Vector<ContentExtensionRule> parseRuleList(const String& rules)
    174172{
    175173#if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
     
    197195}
    198196
    199 } // namespace ExtensionsManager
    200197} // namespace ContentExtensions
    201198} // namespace WebCore
  • trunk/Source/WebCore/contentextensions/ContentExtensionParser.h

    r180984 r181000  
    2424 */
    2525
    26 #ifndef ContentExtensionsManager_h
    27 #define ContentExtensionsManager_h
     26#ifndef ContentExtensionParser_h
     27#define ContentExtensionParser_h
    2828
    2929#if ENABLE(CONTENT_EXTENSIONS)
     
    3838class ContentExtensionRule;
    3939
    40 // The ExtensionsManager loads serialized content extension rules directly into WebCore.
    41 namespace ExtensionsManager {
    42 
    43 Vector<ContentExtensionRule> createRuleList(const String& rules);
    44 
    45 } // namespace ExtensionsManager
     40Vector<ContentExtensionRule> parseRuleList(const String& rules);
    4641
    4742} // namespace ContentExtensions
     
    5045#endif // ENABLE(CONTENT_EXTENSIONS)
    5146
    52 #endif // ContentExtensionsManager_h
     47#endif // ContentExtensionParser_h
  • trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp

    r180978 r181000  
    2929#if ENABLE(CONTENT_EXTENSIONS)
    3030
    31 #include "ContentExtensionsDebugging.h"
    32 #include "DFABytecodeCompiler.h"
     31#include "CompiledContentExtension.h"
    3332#include "DFABytecodeInterpreter.h"
    34 #include "NFA.h"
    35 #include "NFAToDFA.h"
    3633#include "URL.h"
    37 #include "URLFilterParser.h"
    38 #include <wtf/CurrentTime.h>
    39 #include <wtf/DataLog.h>
    40 #include <wtf/NeverDestroyed.h>
    4134#include <wtf/text/CString.h>
    4235
     
    4538namespace ContentExtensions {
    4639   
    47 Vector<unsigned> ContentExtensionsBackend::serializeActions(const Vector<ContentExtensionRule>& ruleList, Vector<SerializedActionByte>& actions)
    48 {
    49     ASSERT(!actions.size());
    50    
    51     Vector<unsigned> actionLocations;
    52        
    53     for (unsigned ruleIndex = 0; ruleIndex < ruleList.size(); ++ruleIndex) {
    54         const ContentExtensionRule& rule = ruleList[ruleIndex];
    55         actionLocations.append(actions.size());
    56        
    57         switch (rule.action().type()) {
    58         case ActionType::InvalidAction:
    59             RELEASE_ASSERT_NOT_REACHED();
    60 
    61         case ActionType::BlockLoad:
    62         case ActionType::BlockCookies:
    63         case ActionType::IgnorePreviousRules:
    64             actions.append(static_cast<SerializedActionByte>(rule.action().type()));
    65             break;
    66 
    67         case ActionType::CSSDisplayNone: {
    68             const String& selector = rule.action().cssSelector();
    69             // Append action type (1 byte).
    70             actions.append(static_cast<SerializedActionByte>(ActionType::CSSDisplayNone));
    71             // Append Selector length (4 bytes).
    72             unsigned selectorLength = selector.length();
    73             actions.resize(actions.size() + sizeof(unsigned));
    74             *reinterpret_cast<unsigned*>(&actions[actions.size() - sizeof(unsigned)]) = selectorLength;
    75             bool wideCharacters = !selector.is8Bit();
    76             actions.append(wideCharacters);
    77             // Append Selector.
    78             if (wideCharacters) {
    79                 for (unsigned i = 0; i < selectorLength; i++) {
    80                     actions.resize(actions.size() + sizeof(UChar));
    81                     *reinterpret_cast<UChar*>(&actions[actions.size() - sizeof(UChar)]) = selector[i];
    82                 }
    83             } else {
    84                 for (unsigned i = 0; i < selectorLength; i++)
    85                     actions.append(selector[i]);
    86             }
    87             break;
    88         }
    89         }
    90     }
    91     return actionLocations;
    92 }
    93 
    94 void ContentExtensionsBackend::setRuleList(const String& identifier, const Vector<ContentExtensionRule>& ruleList)
     40void ContentExtensionsBackend::addContentExtension(const String& identifier, RefPtr<CompiledContentExtension> compiledContentExtension)
    9541{
    9642    ASSERT(!identifier.isEmpty());
     
    9844        return;
    9945
    100     if (ruleList.isEmpty()) {
    101         removeRuleList(identifier);
     46    if (!compiledContentExtension) {
     47        removeContentExtension(identifier);
    10248        return;
    10349    }
    10450
    105 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
    106     double nfaBuildTimeStart = monotonicallyIncreasingTime();
    107 #endif
    108 
    109     Vector<SerializedActionByte> actions;
    110     Vector<unsigned> actionLocations = serializeActions(ruleList, actions);
    111 
    112     NFA nfa;
    113     URLFilterParser urlFilterParser(nfa);
    114     for (unsigned ruleIndex = 0; ruleIndex < ruleList.size(); ++ruleIndex) {
    115         const ContentExtensionRule& contentExtensionRule = ruleList[ruleIndex];
    116         const Trigger& trigger = contentExtensionRule.trigger();
    117         ASSERT(trigger.urlFilter.length());
    118 
    119         String error = urlFilterParser.addPattern(trigger.urlFilter, trigger.urlFilterIsCaseSensitive, actionLocations[ruleIndex]);
    120 
    121         if (!error.isNull()) {
    122             dataLogF("Error while parsing %s: %s\n", trigger.urlFilter.utf8().data(), error.utf8().data());
    123             continue;
    124         }
    125     }
    126 
    127 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
    128     double nfaBuildTimeEnd = monotonicallyIncreasingTime();
    129     dataLogF("    Time spent building the NFA: %f\n", (nfaBuildTimeEnd - nfaBuildTimeStart));
    130 #endif
    131 
    132 #if CONTENT_EXTENSIONS_STATE_MACHINE_DEBUGGING
    133     nfa.debugPrintDot();
    134 #endif
    135 
    136 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
    137     double dfaBuildTimeStart = monotonicallyIncreasingTime();
    138 #endif
    139 
    140     const DFA dfa = NFAToDFA::convert(nfa);
    141 
    142 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
    143     double dfaBuildTimeEnd = monotonicallyIncreasingTime();
    144     dataLogF("    Time spent building the DFA: %f\n", (dfaBuildTimeEnd - dfaBuildTimeStart));
    145 #endif
    146 
    147     // FIXME: never add a DFA that only matches the empty set.
    148 
    149 #if CONTENT_EXTENSIONS_STATE_MACHINE_DEBUGGING
    150     dfa.debugPrintDot();
    151 #endif
    152 
    153     Vector<DFABytecode> bytecode;
    154     DFABytecodeCompiler compiler(dfa, bytecode);
    155     compiler.compile();
    156     CompiledContentExtension compiledContentExtension = { bytecode, actions };
    157     m_ruleLists.set(identifier, compiledContentExtension);
     51    m_contentExtensions.set(identifier, compiledContentExtension);
    15852}
    15953
    160 void ContentExtensionsBackend::removeRuleList(const String& identifier)
     54void ContentExtensionsBackend::removeContentExtension(const String& identifier)
    16155{
    162     m_ruleLists.remove(identifier);
     56    m_contentExtensions.remove(identifier);
    16357}
    16458
    165 void ContentExtensionsBackend::removeAllRuleLists()
     59void ContentExtensionsBackend::removeAllContentExtensions()
    16660{
    167     m_ruleLists.clear();
     61    m_contentExtensions.clear();
    16862}
    16963
     
    17569
    17670    Vector<Action> actions;
    177     for (auto& ruleListSlot : m_ruleLists) {
    178         const CompiledContentExtension& compiledContentExtension = ruleListSlot.value;
    179         DFABytecodeInterpreter interpreter(compiledContentExtension.bytecode);
     71    for (auto& compiledContentExtension : m_contentExtensions.values()) {
     72        DFABytecodeInterpreter interpreter(compiledContentExtension->bytecode());
    18073        DFABytecodeInterpreter::Actions triggeredActions = interpreter.interpret(urlCString);
    18174       
     
    18982            // Add actions in reverse order to properly deal with IgnorePreviousRules.
    19083            for (unsigned i = actionLocations.size(); i; i--) {
    191                 Action action = Action::deserialize(ruleListSlot.value.actions, actionLocations[i - 1]);
     84                Action action = Action::deserialize(compiledContentExtension->actions(), actionLocations[i - 1]);
    19285                if (action.type() == ActionType::IgnorePreviousRules)
    19386                    break;
  • trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h

    r180978 r181000  
    3030
    3131#include "ContentExtensionRule.h"
    32 #include "DFA.h"
    33 #include "DFABytecode.h"
    34 #include "UserContentController.h"
    3532#include <wtf/HashMap.h>
    3633#include <wtf/text/StringHash.h>
     
    4239
    4340namespace ContentExtensions {
     41
     42class CompiledContentExtension;
    4443
    4544// The ContentExtensionsBackend is the internal model of all the content extensions.
     
    5453    // Set a list of rules for a given name. If there were existing rules for the name, they are overriden.
    5554    // The identifier cannot be empty.
    56     void setRuleList(const String& identifier, const Vector<ContentExtensionRule>&);
    57     void removeRuleList(const String& identifier);
    58     void removeAllRuleLists();
     55    WEBCORE_EXPORT void addContentExtension(const String& identifier, RefPtr<CompiledContentExtension>);
     56    WEBCORE_EXPORT void removeContentExtension(const String& identifier);
     57    WEBCORE_EXPORT void removeAllContentExtensions();
    5958
    6059    // - Internal WebCore Interface.
    61     Vector<Action> actionsForURL(const URL&);
     60    WEBCORE_EXPORT Vector<Action> actionsForURL(const URL&);
    6261
    6362private:
    64     struct CompiledContentExtension {
    65         Vector<DFABytecode> bytecode;
    66         Vector<SerializedActionByte> actions;
    67     };
    68 
    69     Vector<unsigned> serializeActions(const Vector<ContentExtensionRule>& ruleList, Vector<SerializedActionByte>& actions);
    70 
    71     HashMap<String, CompiledContentExtension> m_ruleLists;
     63    HashMap<String, RefPtr<CompiledContentExtension>> m_contentExtensions;
    7264};
    7365
  • trunk/Source/WebCore/page/UserContentController.cpp

    r180978 r181000  
    3939
    4040#if ENABLE(CONTENT_EXTENSIONS)
     41#include "ContentExtensionCompiler.h"
    4142#include "ContentExtensionsBackend.h"
    42 #include "ContentExtensionsManager.h"
    4343#endif
    4444
     
    185185        m_contentExtensionBackend = std::make_unique<ContentExtensions::ContentExtensionsBackend>();
    186186   
    187     m_contentExtensionBackend->setRuleList(name, ContentExtensions::ExtensionsManager::createRuleList(ruleList));
     187    m_contentExtensionBackend->addContentExtension(name, ContentExtensions::compileRuleList(ruleList));
    188188}
    189189
     
    193193        return;
    194194
    195     m_contentExtensionBackend->removeRuleList(name);
     195    m_contentExtensionBackend->removeContentExtension(name);
    196196}
    197197
     
    201201        return;
    202202
    203     m_contentExtensionBackend->removeAllRuleLists();
     203    m_contentExtensionBackend->removeAllContentExtensions();
    204204}
    205205
  • trunk/Tools/ChangeLog

    r180999 r181000  
     12015-03-03  Sam Weinig  <sam@webkit.org>
     2
     3        [Content Extensions] Split parsing and compiling of content extensions into their own files
     4        https://bugs.webkit.org/show_bug.cgi?id=142259
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Add basic unit test for the content filter compiler.
     9
     10        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     11        * TestWebKitAPI/Tests/WebCore/ContentFilter.cpp: Added.
     12        (WebCore::ContentExtensions::operator<<):
     13        (TestWebKitAPI::ContentFilterTest::SetUp):
     14        (TestWebKitAPI::TEST_F):
     15
    1162015-03-04  Matthew Mirman  <mmirman@apple.com>
    217
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r180885 r181000  
    6262                7C89D2AC1A69B80D003A5FDE /* WKPageConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C89D2AA1A69B80D003A5FDE /* WKPageConfiguration.cpp */; };
    6363                7C9ED98B17A19F4B00E4DC33 /* attributedStringStrikethrough.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 7C9ED98A17A19D0600E4DC33 /* attributedStringStrikethrough.html */; };
     64                7CB184C61AA3F2100066EDFD /* ContentFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CB184C41AA3F2100066EDFD /* ContentFilter.cpp */; };
    6465                7CCE7EA41A4119F300447C4C /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */; };
    6566                7CCE7EA51A411A0800447C4C /* JavaScriptTestMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C081224013FC172400DC39AE /* JavaScriptTestMac.mm */; };
     
    524525                7C8DDAA91735DE1D00EA5AC0 /* CloseThenTerminate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CloseThenTerminate.cpp; sourceTree = "<group>"; };
    525526                7C9ED98A17A19D0600E4DC33 /* attributedStringStrikethrough.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = attributedStringStrikethrough.html; sourceTree = "<group>"; };
     527                7CB184C41AA3F2100066EDFD /* ContentFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentFilter.cpp; sourceTree = "<group>"; };
    526528                7CBBA07619BB8A9100BBF025 /* OSObjectPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OSObjectPtr.cpp; sourceTree = "<group>"; };
    527529                7CC3E1FA197E234100BE6252 /* UserContentController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserContentController.mm; sourceTree = "<group>"; };
     
    827829                                CDC2C7141797089D00E627FB /* TimeRanges.cpp */,
    828830                                440A1D3814A0103A008A66F2 /* URL.cpp */,
     831                                7CB184C41AA3F2100066EDFD /* ContentFilter.cpp */,
    829832                        );
    830833                        path = WebCore;
     
    14931496                                7CCE7ECF1A411A7E00447C4C /* StopLoadingFromDidReceiveResponse.mm in Sources */,
    14941497                                7CCE7F441A411B8E00447C4C /* StringBuilder.cpp in Sources */,
     1498                                7CB184C61AA3F2100066EDFD /* ContentFilter.cpp in Sources */,
    14951499                                7CCE7ED01A411A7E00447C4C /* StringByEvaluatingJavaScriptFromString.mm in Sources */,
    14961500                                7CCE7F451A411B8E00447C4C /* StringHasher.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.