Changeset 181000 in webkit
- Timestamp:
- Mar 4, 2015 8:41:31 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 7 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r180997 r181000 1 2015-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 1 53 2015-03-04 Philippe Normand <pnormand@igalia.com> 2 54 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r180996 r181000 1032 1032 26C17A3F1491D2D400D12BA2 /* FileSystemIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26C17A3D1491D2D400D12BA2 /* FileSystemIOS.mm */; }; 1033 1033 26E98A10130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E98A0F130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h */; }; 1034 26F0C8971A2E724B002794F8 /* ContentExtension sManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F0C8951A2E724B002794F8 /* ContentExtensionsManager.cpp */; };1035 26F0C8981A2E724B002794F8 /* ContentExtension sManager.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, ); }; }; 1036 1036 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, ); }; }; 1038 1038 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, ); }; }; 1040 1040 26F40D4A14904A6300CA67C4 /* EventLoopIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26F40D4914904A6300CA67C4 /* EventLoopIOS.mm */; }; 1041 1041 26F9A83818A046AC00AEB88A /* ViewportConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F9A83618A046AC00AEB88A /* ViewportConfiguration.cpp */; }; … … 2145 2145 5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C39305E1AA0F6A90029C816 /* DFABytecodeCompiler.cpp */; }; 2146 2146 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, ); }; }; 2148 2148 5CD9F5671AA0F74200DA45FF /* DFABytecodeCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305F1AA0F6A90029C816 /* DFABytecodeCompiler.h */; }; 2149 2149 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, ); }; }; 2151 2151 5CFC4350192409E300A0D3B5 /* PointerLockController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CFC434E192406A900A0D3B5 /* PointerLockController.cpp */; }; 2152 2152 5D21A80213ECE5DF00BB7064 /* WebVTTParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D21A80013ECE5DF00BB7064 /* WebVTTParser.cpp */; }; … … 2501 2501 7C74D43B1882400400E5ED57 /* UTextProviderUTF16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C74D4391882400400E5ED57 /* UTextProviderUTF16.cpp */; }; 2502 2502 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, ); }; }; 2503 2507 7C9DBFED1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */; }; 2504 2508 7C9DBFEE1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C9DBFEC1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h */; }; … … 8079 8083 26C17A3D1491D2D400D12BA2 /* FileSystemIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FileSystemIOS.mm; path = ios/FileSystemIOS.mm; sourceTree = "<group>"; }; 8080 8084 26E98A0F130A9FCA008EB7B2 /* TextCodecASCIIFastPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCodecASCIIFastPath.h; sourceTree = "<group>"; }; 8081 26F0C8951A2E724B002794F8 /* ContentExtension sManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionsManager.cpp; sourceTree = "<group>"; };8082 26F0C8961A2E724B002794F8 /* ContentExtension sManager.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>"; }; 8083 8087 26F0C8991A2EC110002794F8 /* ContentExtensionRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionRule.cpp; sourceTree = "<group>"; }; 8084 8088 26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionRule.h; sourceTree = "<group>"; }; … … 9711 9715 7C74D4391882400400E5ED57 /* UTextProviderUTF16.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UTextProviderUTF16.cpp; sourceTree = "<group>"; }; 9712 9716 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>"; }; 9713 9721 7C9DBFEA1A9C489F000D6B25 /* HTMLAttachmentElement.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = HTMLAttachmentElement.idl; sourceTree = "<group>"; }; 9714 9722 7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLAttachmentElement.cpp; sourceTree = "<group>"; }; … … 15410 15418 isa = PBXGroup; 15411 15419 children = ( 15420 7C93F3471AA6BA5E00A98BAB /* CompiledContentExtension.cpp */, 15421 7C93F3481AA6BA5E00A98BAB /* CompiledContentExtension.h */, 15412 15422 5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */, 15423 7C93F34B1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp */, 15424 7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */, 15425 26F0C8951A2E724B002794F8 /* ContentExtensionParser.cpp */, 15426 26F0C8961A2E724B002794F8 /* ContentExtensionParser.h */, 15413 15427 26F0C8991A2EC110002794F8 /* ContentExtensionRule.cpp */, 15414 15428 26F0C89A1A2EC110002794F8 /* ContentExtensionRule.h */, … … 15416 15430 26F0C89E1A2EC3BE002794F8 /* ContentExtensionsBackend.h */, 15417 15431 262391351A648CEE007251A3 /* ContentExtensionsDebugging.h */, 15418 26F0C8951A2E724B002794F8 /* ContentExtensionsManager.cpp */,15419 26F0C8961A2E724B002794F8 /* ContentExtensionsManager.h */,15420 15432 267725F61A5B3AD9003C24DD /* DFA.cpp */, 15421 15433 267725F71A5B3AD9003C24DD /* DFA.h */, … … 25240 25252 B2FA3D590AB75A6F000E5AC4 /* JSSVGCircleElement.h in Headers */, 25241 25253 B2FA3D5B0AB75A6F000E5AC4 /* JSSVGClipPathElement.h in Headers */, 25242 26F0C8981A2E724B002794F8 /* ContentExtension sManager.h in Headers */,25254 26F0C8981A2E724B002794F8 /* ContentExtensionParser.h in Headers */, 25243 25255 B2FA3D5D0AB75A6F000E5AC4 /* JSSVGColor.h in Headers */, 25244 25256 B2FA3D5F0AB75A6F000E5AC4 /* JSSVGComponentTransferFunctionElement.h in Headers */, … … 26446 26458 B2227A300D00BF220071B782 /* SVGLangSpace.h in Headers */, 26447 26459 B2227A330D00BF220071B782 /* SVGLength.h in Headers */, 26460 7C93F34A1AA6BA5E00A98BAB /* CompiledContentExtension.h in Headers */, 26448 26461 7134496E146941B300720312 /* SVGLengthContext.h in Headers */, 26449 26462 B2227A360D00BF220071B782 /* SVGLengthList.h in Headers */, … … 26510 26523 84300BD6120C9AAC0021954A /* SVGPathStringSource.h in Headers */, 26511 26524 84C5B2FB1216DC810088B53A /* SVGPathTraversalStateBuilder.h in Headers */, 26525 7C93F34E1AA6BF0700A98BAB /* ContentExtensionCompiler.h in Headers */, 26512 26526 71A57DF2154BE25C0009D120 /* SVGPathUtilities.h in Headers */, 26513 26527 B2227A880D00BF220071B782 /* SVGPatternElement.h in Headers */, … … 28419 28433 FB91392B16AE4FC0001FE682 /* JSDOMPath.cpp in Sources */, 28420 28434 A9D247FE0D757E6900FDF959 /* JSDOMPlugin.cpp in Sources */, 28421 26F0C8971A2E724B002794F8 /* ContentExtension sManager.cpp in Sources */,28435 26F0C8971A2E724B002794F8 /* ContentExtensionParser.cpp in Sources */, 28422 28436 A9D248000D757E6900FDF959 /* JSDOMPluginArray.cpp in Sources */, 28423 28437 A9C6E64C0D7465E7006442E9 /* JSDOMPluginArrayCustom.cpp in Sources */, … … 28894 28908 7118FED415685CC60030B79A /* JSSVGViewSpec.cpp in Sources */, 28895 28909 8485227D1190162C006EDC7F /* JSSVGVKernElement.cpp in Sources */, 28910 7C93F3491AA6BA5E00A98BAB /* CompiledContentExtension.cpp in Sources */, 28896 28911 71DCB7011568197600862271 /* JSSVGZoomAndPan.cpp in Sources */, 28897 28912 B2FA3E180AB75A6F000E5AC4 /* JSSVGZoomEvent.cpp in Sources */, … … 29077 29092 6C568CB019DAFEA000430CA2 /* MaskImageOperation.cpp in Sources */, 29078 29093 CDA98E0D1603FE4A00FEA3B1 /* MediaKeys.cpp in Sources */, 29094 7C93F34D1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp in Sources */, 29079 29095 CDA98E0E1603FE5800FEA3B1 /* MediaKeySession.cpp in Sources */, 29080 29096 A8EA80090A19516E00A8EF5F /* MediaList.cpp in Sources */, -
trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp
r180984 r181000 25 25 26 26 #include "config.h" 27 #include "ContentExtension sManager.h"27 #include "ContentExtensionParser.h" 28 28 29 29 #if ENABLE(CONTENT_EXTENSIONS) … … 47 47 namespace ContentExtensions { 48 48 49 namespace ExtensionsManager {50 51 49 static bool loadTrigger(ExecState& exec, JSObject& ruleObject, Trigger& trigger) 52 50 { … … 171 169 } 172 170 173 Vector<ContentExtensionRule> createRuleList(const String& rules)171 Vector<ContentExtensionRule> parseRuleList(const String& rules) 174 172 { 175 173 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING … … 197 195 } 198 196 199 } // namespace ExtensionsManager200 197 } // namespace ContentExtensions 201 198 } // namespace WebCore -
trunk/Source/WebCore/contentextensions/ContentExtensionParser.h
r180984 r181000 24 24 */ 25 25 26 #ifndef ContentExtension sManager_h27 #define ContentExtension sManager_h26 #ifndef ContentExtensionParser_h 27 #define ContentExtensionParser_h 28 28 29 29 #if ENABLE(CONTENT_EXTENSIONS) … … 38 38 class ContentExtensionRule; 39 39 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 40 Vector<ContentExtensionRule> parseRuleList(const String& rules); 46 41 47 42 } // namespace ContentExtensions … … 50 45 #endif // ENABLE(CONTENT_EXTENSIONS) 51 46 52 #endif // ContentExtension sManager_h47 #endif // ContentExtensionParser_h -
trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp
r180978 r181000 29 29 #if ENABLE(CONTENT_EXTENSIONS) 30 30 31 #include "ContentExtensionsDebugging.h" 32 #include "DFABytecodeCompiler.h" 31 #include "CompiledContentExtension.h" 33 32 #include "DFABytecodeInterpreter.h" 34 #include "NFA.h"35 #include "NFAToDFA.h"36 33 #include "URL.h" 37 #include "URLFilterParser.h"38 #include <wtf/CurrentTime.h>39 #include <wtf/DataLog.h>40 #include <wtf/NeverDestroyed.h>41 34 #include <wtf/text/CString.h> 42 35 … … 45 38 namespace ContentExtensions { 46 39 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) 40 void ContentExtensionsBackend::addContentExtension(const String& identifier, RefPtr<CompiledContentExtension> compiledContentExtension) 95 41 { 96 42 ASSERT(!identifier.isEmpty()); … … 98 44 return; 99 45 100 if ( ruleList.isEmpty()) {101 remove RuleList(identifier);46 if (!compiledContentExtension) { 47 removeContentExtension(identifier); 102 48 return; 103 49 } 104 50 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); 158 52 } 159 53 160 void ContentExtensionsBackend::remove RuleList(const String& identifier)54 void ContentExtensionsBackend::removeContentExtension(const String& identifier) 161 55 { 162 m_ ruleLists.remove(identifier);56 m_contentExtensions.remove(identifier); 163 57 } 164 58 165 void ContentExtensionsBackend::removeAll RuleLists()59 void ContentExtensionsBackend::removeAllContentExtensions() 166 60 { 167 m_ ruleLists.clear();61 m_contentExtensions.clear(); 168 62 } 169 63 … … 175 69 176 70 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()); 180 73 DFABytecodeInterpreter::Actions triggeredActions = interpreter.interpret(urlCString); 181 74 … … 189 82 // Add actions in reverse order to properly deal with IgnorePreviousRules. 190 83 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]); 192 85 if (action.type() == ActionType::IgnorePreviousRules) 193 86 break; -
trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h
r180978 r181000 30 30 31 31 #include "ContentExtensionRule.h" 32 #include "DFA.h"33 #include "DFABytecode.h"34 #include "UserContentController.h"35 32 #include <wtf/HashMap.h> 36 33 #include <wtf/text/StringHash.h> … … 42 39 43 40 namespace ContentExtensions { 41 42 class CompiledContentExtension; 44 43 45 44 // The ContentExtensionsBackend is the internal model of all the content extensions. … … 54 53 // Set a list of rules for a given name. If there were existing rules for the name, they are overriden. 55 54 // 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(); 59 58 60 59 // - Internal WebCore Interface. 61 Vector<Action> actionsForURL(const URL&);60 WEBCORE_EXPORT Vector<Action> actionsForURL(const URL&); 62 61 63 62 private: 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; 72 64 }; 73 65 -
trunk/Source/WebCore/page/UserContentController.cpp
r180978 r181000 39 39 40 40 #if ENABLE(CONTENT_EXTENSIONS) 41 #include "ContentExtensionCompiler.h" 41 42 #include "ContentExtensionsBackend.h" 42 #include "ContentExtensionsManager.h"43 43 #endif 44 44 … … 185 185 m_contentExtensionBackend = std::make_unique<ContentExtensions::ContentExtensionsBackend>(); 186 186 187 m_contentExtensionBackend-> setRuleList(name, ContentExtensions::ExtensionsManager::createRuleList(ruleList));187 m_contentExtensionBackend->addContentExtension(name, ContentExtensions::compileRuleList(ruleList)); 188 188 } 189 189 … … 193 193 return; 194 194 195 m_contentExtensionBackend->remove RuleList(name);195 m_contentExtensionBackend->removeContentExtension(name); 196 196 } 197 197 … … 201 201 return; 202 202 203 m_contentExtensionBackend->removeAll RuleLists();203 m_contentExtensionBackend->removeAllContentExtensions(); 204 204 } 205 205 -
trunk/Tools/ChangeLog
r180999 r181000 1 2015-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 1 16 2015-03-04 Matthew Mirman <mmirman@apple.com> 2 17 -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r180885 r181000 62 62 7C89D2AC1A69B80D003A5FDE /* WKPageConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C89D2AA1A69B80D003A5FDE /* WKPageConfiguration.cpp */; }; 63 63 7C9ED98B17A19F4B00E4DC33 /* attributedStringStrikethrough.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 7C9ED98A17A19D0600E4DC33 /* attributedStringStrikethrough.html */; }; 64 7CB184C61AA3F2100066EDFD /* ContentFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CB184C41AA3F2100066EDFD /* ContentFilter.cpp */; }; 64 65 7CCE7EA41A4119F300447C4C /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */; }; 65 66 7CCE7EA51A411A0800447C4C /* JavaScriptTestMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C081224013FC172400DC39AE /* JavaScriptTestMac.mm */; }; … … 524 525 7C8DDAA91735DE1D00EA5AC0 /* CloseThenTerminate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CloseThenTerminate.cpp; sourceTree = "<group>"; }; 525 526 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>"; }; 526 528 7CBBA07619BB8A9100BBF025 /* OSObjectPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OSObjectPtr.cpp; sourceTree = "<group>"; }; 527 529 7CC3E1FA197E234100BE6252 /* UserContentController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserContentController.mm; sourceTree = "<group>"; }; … … 827 829 CDC2C7141797089D00E627FB /* TimeRanges.cpp */, 828 830 440A1D3814A0103A008A66F2 /* URL.cpp */, 831 7CB184C41AA3F2100066EDFD /* ContentFilter.cpp */, 829 832 ); 830 833 path = WebCore; … … 1493 1496 7CCE7ECF1A411A7E00447C4C /* StopLoadingFromDidReceiveResponse.mm in Sources */, 1494 1497 7CCE7F441A411B8E00447C4C /* StringBuilder.cpp in Sources */, 1498 7CB184C61AA3F2100066EDFD /* ContentFilter.cpp in Sources */, 1495 1499 7CCE7ED01A411A7E00447C4C /* StringByEvaluatingJavaScriptFromString.mm in Sources */, 1496 1500 7CCE7F451A411B8E00447C4C /* StringHasher.cpp in Sources */,
Note: See TracChangeset
for help on using the changeset viewer.