Title: [181974] trunk
Revision
181974
Author
[email protected]
Date
2015-03-25 15:38:58 -0700 (Wed, 25 Mar 2015)

Log Message

[Content Extensions] Convert content extension compiling to return error codes and write its output using a client
https://bugs.webkit.org/show_bug.cgi?id=143059

Reviewed by Alex Christensen.

Source/WebCore:

* WebCore.xcodeproj/project.pbxproj:
Add ContentExtensionError.h/cpp.

* contentextensions/ContentExtensionError.cpp: Added.
(WebCore::ContentExtensions::contentExtensionErrorCategory):
* contentextensions/ContentExtensionError.h: Added.
(WebCore::ContentExtensions::make_error_code):
Add ContentExtensionError enum and std::error_code adaptor.

* contentextensions/ContentExtensionCompiler.h:
Instead of returning CompiledContentExtensionData, use a client interface
to pass data. Eventually, this should be turned into a direct streaming 
interface so we can write directly to a file.

* contentextensions/ContentExtensionCompiler.cpp:
(WebCore::ContentExtensions::compileRuleList):
* contentextensions/ContentExtensionParser.cpp:
(WebCore::ContentExtensions::getTypeFlags):
(WebCore::ContentExtensions::loadTrigger):
(WebCore::ContentExtensions::loadAction):
(WebCore::ContentExtensions::loadRule):
(WebCore::ContentExtensions::loadEncodedRules):
(WebCore::ContentExtensions::parseRuleList):
* contentextensions/ContentExtensionParser.h:
Convert to return an error.

Source/WebKit2:

* Shared/WebCompiledContentExtension.cpp:
* Shared/WebCompiledContentExtension.h:
(WebKit::LegacyContentExtensionCompilationClient::LegacyContentExtensionCompilationClient):
(WebKit::LegacyContentExtensionCompilationClient::writeBytecode):
(WebKit::LegacyContentExtensionCompilationClient::writeActions):
Add subclass of ContentExtensionCompilationClient for use with the non-file backed content
extensions.

* UIProcess/API/C/WKUserContentFilterRef.cpp:
(WKUserContentFilterCreate):
* UIProcess/API/Cocoa/_WKUserContentFilter.mm:
(-[_WKUserContentFilter initWithName:serializedRules:]):
Update to use the new interface of compileRuleList().

Tools:

* TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
(TestWebKitAPI::InMemoryCompiledContentExtension::createFromFilter):
Update for new interface of compileRuleList().

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (181973 => 181974)


--- trunk/Source/WebCore/ChangeLog	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/ChangeLog	2015-03-25 22:38:58 UTC (rev 181974)
@@ -1,3 +1,36 @@
+2015-03-25  Sam Weinig  <[email protected]>
+
+        [Content Extensions] Convert content extension compiling to return error codes and write its output using a client
+        https://bugs.webkit.org/show_bug.cgi?id=143059
+
+        Reviewed by Alex Christensen.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Add ContentExtensionError.h/cpp.
+
+        * contentextensions/ContentExtensionError.cpp: Added.
+        (WebCore::ContentExtensions::contentExtensionErrorCategory):
+        * contentextensions/ContentExtensionError.h: Added.
+        (WebCore::ContentExtensions::make_error_code):
+        Add ContentExtensionError enum and std::error_code adaptor.
+
+        * contentextensions/ContentExtensionCompiler.h:
+        Instead of returning CompiledContentExtensionData, use a client interface
+        to pass data. Eventually, this should be turned into a direct streaming 
+        interface so we can write directly to a file.
+
+        * contentextensions/ContentExtensionCompiler.cpp:
+        (WebCore::ContentExtensions::compileRuleList):
+        * contentextensions/ContentExtensionParser.cpp:
+        (WebCore::ContentExtensions::getTypeFlags):
+        (WebCore::ContentExtensions::loadTrigger):
+        (WebCore::ContentExtensions::loadAction):
+        (WebCore::ContentExtensions::loadRule):
+        (WebCore::ContentExtensions::loadEncodedRules):
+        (WebCore::ContentExtensions::parseRuleList):
+        * contentextensions/ContentExtensionParser.h:
+        Convert to return an error.
+
 2015-03-25  Beth Dakin  <[email protected]>
 
         REGRESSION (r181660): Safari navigates to link after a starting and canceling a 

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (181973 => 181974)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2015-03-25 22:38:58 UTC (rev 181974)
@@ -2539,6 +2539,8 @@
 		7CE683471921821500F4D928 /* UserMessageHandlerDescriptorTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		7CE6CBFB187F370700D46BF5 /* FormatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE6CBFA187F370700D46BF5 /* FormatConverter.h */; };
 		7CE6CBFD187F394900D46BF5 /* FormatConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */; };
+		7CFDC57C1AC1D80500E24A57 /* ContentExtensionError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */; };
+		7CFDC57D1AC1D80500E24A57 /* ContentExtensionError.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		7D741BDA177226AA00859170 /* CSSValueKeywords.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 6565814809D13043000E61D7 /* CSSValueKeywords.h */; };
 		7E37EF2E1339208800B29250 /* SubresourceLoaderCF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E37EF2D1339208800B29250 /* SubresourceLoaderCF.cpp */; };
 		7E428CE513E3407F003B661C /* ResourceHandleIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E428CE413E3407F003B661C /* ResourceHandleIOS.mm */; };
@@ -9788,6 +9790,8 @@
 		7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMessageHandlerDescriptorTypes.h; sourceTree = "<group>"; };
 		7CE6CBFA187F370700D46BF5 /* FormatConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatConverter.h; sourceTree = "<group>"; };
 		7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatConverter.cpp; sourceTree = "<group>"; };
+		7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionError.cpp; sourceTree = "<group>"; };
+		7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionError.h; sourceTree = "<group>"; };
 		7E37EF2D1339208800B29250 /* SubresourceLoaderCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SubresourceLoaderCF.cpp; path = cf/SubresourceLoaderCF.cpp; sourceTree = "<group>"; };
 		7E428CE413E3407F003B661C /* ResourceHandleIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ResourceHandleIOS.mm; sourceTree = "<group>"; };
 		7E46F6F81627A2C900062223 /* JSOESElementIndexUint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSOESElementIndexUint.cpp; sourceTree = "<group>"; };
@@ -15501,6 +15505,8 @@
 				7C93F3471AA6BA5E00A98BAB /* CompiledContentExtension.cpp */,
 				7C93F3481AA6BA5E00A98BAB /* CompiledContentExtension.h */,
 				5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */,
+				7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */,
+				7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */,
 				7C93F34B1AA6BF0700A98BAB /* ContentExtensionCompiler.cpp */,
 				7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */,
 				26F0C8951A2E724B002794F8 /* ContentExtensionParser.cpp */,
@@ -25413,6 +25419,7 @@
 				B2FA3D9B0AB75A6F000E5AC4 /* JSSVGGElement.h in Headers */,
 				724ED3321A3A8B2300F5F13C /* JSEXTBlendMinMax.h in Headers */,
 				B27B28280CEF0C0700D39D54 /* JSSVGGlyphElement.h in Headers */,
+				7CFDC57D1AC1D80500E24A57 /* ContentExtensionError.h in Headers */,
 				24D9129A13CA971400D21915 /* JSSVGGlyphRefElement.h in Headers */,
 				B2FA3D9D0AB75A6F000E5AC4 /* JSSVGGradientElement.h in Headers */,
 				7BE7427381FA906FBB4F0F2C /* JSSVGGraphicsElement.h in Headers */,
@@ -28429,6 +28436,7 @@
 				F350B73513F1377D00880C43 /* InstrumentingAgents.cpp in Sources */,
 				2D46F04E17B96FBD005647F0 /* IntPoint.cpp in Sources */,
 				B27535600B053814002CE64F /* IntPointCG.cpp in Sources */,
+				7CFDC57C1AC1D80500E24A57 /* ContentExtensionError.cpp in Sources */,
 				B275357C0B053814002CE64F /* IntPointMac.mm in Sources */,
 				B27535730B053814002CE64F /* IntRect.cpp in Sources */,
 				B27535610B053814002CE64F /* IntRectCG.cpp in Sources */,

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp (181973 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -30,6 +30,7 @@
 
 #include "CompiledContentExtension.h"
 #include "ContentExtensionActions.h"
+#include "ContentExtensionError.h"
 #include "ContentExtensionParser.h"
 #include "ContentExtensionRule.h"
 #include "ContentExtensionsDebugging.h"
@@ -99,9 +100,12 @@
 }
 
 
-CompiledContentExtensionData compileRuleList(const String& ruleList)
+std::error_code compileRuleList(const String& ruleList, ContentExtensionCompilationClient& client)
 {
-    auto parsedRuleList = parseRuleList(ruleList);
+    Vector<ContentExtensionRule> parsedRuleList;
+    auto parserError = parseRuleList(ruleList, parsedRuleList);
+    if (parserError)
+        return parserError;
 
 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
     double nfaBuildTimeStart = monotonicallyIncreasingTime();
@@ -178,7 +182,10 @@
     dfa.debugPrintDot();
 #endif
 
-    return { WTF::move(bytecode), WTF::move(actions) };
+    client.writeBytecode(WTF::move(bytecode));
+    client.writeActions(WTF::move(actions));
+
+    return { };
 }
 
 } // namespace ContentExtensions

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.h (181973 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.h	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.h	2015-03-25 22:38:58 UTC (rev 181974)
@@ -29,6 +29,7 @@
 #if ENABLE(CONTENT_EXTENSIONS)
 
 #include "CompiledContentExtension.h"
+#include <system_error>
 #include <wtf/Forward.h>
 #include <wtf/Ref.h>
 
@@ -40,8 +41,16 @@
     Vector<SerializedActionByte> actions;
 };
 
-WEBCORE_EXPORT CompiledContentExtensionData compileRuleList(const String&);
+class ContentExtensionCompilationClient {
+public:
+    virtual ~ContentExtensionCompilationClient() { }
+    
+    virtual void writeBytecode(Vector<DFABytecode>&&) = 0;
+    virtual void writeActions(Vector<SerializedActionByte>&&) = 0;
+};
 
+WEBCORE_EXPORT std::error_code compileRuleList(const String&, ContentExtensionCompilationClient&);
+
 } // namespace ContentExtensions
 } // namespace WebCore
 

Added: trunk/Source/WebCore/contentextensions/ContentExtensionError.cpp (0 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionError.cpp	                        (rev 0)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionError.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ContentExtensionError.h"
+
+#if ENABLE(CONTENT_EXTENSIONS)
+
+#include <string>
+#include <wtf/NeverDestroyed.h>
+
+namespace WebCore {
+namespace ContentExtensions {
+
+const std::error_category& contentExtensionErrorCategory()
+{
+    class ContentExtensionErrorCategory : public std::error_category {
+        const char* name() const noexcept override
+        {
+            return "content extension";
+        }
+
+        virtual std::string message(int errorCode) const override
+        {
+            switch (static_cast<ContentExtensionError>(errorCode)) {
+            case ContentExtensionError::JSONInvalid:
+                return "Failed to parse the JSON String.";
+            case ContentExtensionError::JSONTopLevelStructureNotAnObject:
+                return "Invalid input, the top level structure is not an object.";
+            case ContentExtensionError::JSONTopLevelStructureNotAnArray:
+                return "Invalid input, the top level structure is not an array.";
+            case ContentExtensionError::JSONInvalidObjectInTopLevelArray:
+                return "Invalid object in the top level array.";
+            case ContentExtensionError::JSONInvalidRule:
+                return "Invalid rule.";
+            case ContentExtensionError::JSONContainsNoRules:
+                return "Empty extension.";
+            case ContentExtensionError::JSONInvalidTrigger:
+                return "Invalid trigger object.";
+            case ContentExtensionError::JSONInvalidURLFilterInTrigger:
+                return "Invalid url-filter object.";
+            case ContentExtensionError::JSONInvalidTriggerFlagsArray:
+                return "Invalid trigger flags array.";
+            case ContentExtensionError::JSONInvalidObjectInTriggerFlagsArray:
+                return "Invalid object in the trigger flags array.";
+            case ContentExtensionError::JSONInvalidStringInTriggerFlagsArray:
+                return "Invalid string in the trigger flags array.";
+            case ContentExtensionError::JSONInvalidAction:
+                return "Invalid action object.";
+            case ContentExtensionError::JSONInvalidActionType:
+                return "Invalid action type.";
+            case ContentExtensionError::JSONInvalidCSSDisplayNoneActionType:
+                return "Invalid css-display-none action type. Requires a selector.";
+            }
+
+            return std::string();
+        }
+    };
+
+    static NeverDestroyed<ContentExtensionErrorCategory> contentExtensionErrorCategory;
+    return contentExtensionErrorCategory;
+}
+
+} // namespace ContentExtensions
+} // namespace WebCore
+
+#endif // ENABLE(CONTENT_EXTENSIONS)

Added: trunk/Source/WebCore/contentextensions/ContentExtensionError.h (0 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionError.h	                        (rev 0)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionError.h	2015-03-25 22:38:58 UTC (rev 181974)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ContentExtensionError_h
+#define ContentExtensionError_h
+
+#if ENABLE(CONTENT_EXTENSIONS)
+
+#include <system_error>
+
+namespace WebCore {
+namespace ContentExtensions {
+
+enum class ContentExtensionError {
+    // JSON parser error
+    JSONInvalid = 1,
+    
+    // JSON semantics error
+    JSONTopLevelStructureNotAnObject,
+    JSONTopLevelStructureNotAnArray,
+    JSONInvalidObjectInTopLevelArray,
+    JSONInvalidRule,
+    JSONContainsNoRules,
+    
+    JSONInvalidTrigger,
+    JSONInvalidURLFilterInTrigger,
+    JSONInvalidTriggerFlagsArray,
+    JSONInvalidObjectInTriggerFlagsArray,
+    JSONInvalidStringInTriggerFlagsArray,
+    
+    JSONInvalidAction,
+    JSONInvalidActionType,
+    JSONInvalidCSSDisplayNoneActionType,
+};
+
+const std::error_category& contentExtensionErrorCategory();
+
+inline std::error_code make_error_code(ContentExtensionError error)
+{
+    return { static_cast<int>(error), contentExtensionErrorCategory() };
+}
+
+} // namespace ContentExtensions
+} // namespace WebCore
+
+namespace std {
+    template<> struct is_error_code_enum<WebCore::ContentExtensions::ContentExtensionError> : public true_type { };
+}
+
+#endif // ENABLE(CONTENT_EXTENSIONS)
+#endif // ContentExtensionError_h

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp (181973 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -28,6 +28,7 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
 
+#include "ContentExtensionError.h"
 #include "ContentExtensionRule.h"
 #include "ContentExtensionsBackend.h"
 #include "ContentExtensionsDebugging.h"
@@ -46,57 +47,48 @@
 
 namespace ContentExtensions {
 
-static bool getTypeFlags(ExecState& exec, const JSValue& typeValue, ResourceFlags& flags, uint16_t(*stringToType)(const String&))
+static std::error_code getTypeFlags(ExecState& exec, const JSValue& typeValue, ResourceFlags& flags, uint16_t(*stringToType)(const String&))
 {
     if (!typeValue.isObject())
-        return true;
+        return { };
 
     JSObject* object = typeValue.toObject(&exec);
-    if (!isJSArray(object)) {
-        WTFLogAlways("Invalid trigger flags array");
-        return false;
-    }
+    if (!isJSArray(object))
+        return ContentExtensionError::JSONInvalidTriggerFlagsArray;
 
     JSArray* array = jsCast<JSArray*>(object);
     
     unsigned length = array->length();
     for (unsigned i = 0; i < length; ++i) {
         JSValue value = array->getIndex(&exec, i);
-        if (exec.hadException() || !value) {
-            WTFLogAlways("Invalid object in the trigger flags array.");
-            continue;
-        }
+        if (exec.hadException() || !value)
+            return ContentExtensionError::JSONInvalidObjectInTriggerFlagsArray;
         
         String name = value.toWTFString(&exec);
         uint16_t type = stringToType(name);
-        if (!type) {
-            WTFLogAlways("Invalid string in the trigger flags array.");
-            continue;
-        }
+        if (!type)
+            return ContentExtensionError::JSONInvalidStringInTriggerFlagsArray;
+
         flags |= type;
     }
-    return true;
+
+    return { };
 }
     
-static bool loadTrigger(ExecState& exec, JSObject& ruleObject, Trigger& trigger)
+static std::error_code loadTrigger(ExecState& exec, JSObject& ruleObject, Trigger& trigger)
 {
     JSValue triggerObject = ruleObject.get(&exec, Identifier(&exec, "trigger"));
-    if (!triggerObject || exec.hadException() || !triggerObject.isObject()) {
-        WTFLogAlways("Invalid trigger object.");
-        return false;
-    }
-
+    if (!triggerObject || exec.hadException() || !triggerObject.isObject())
+        return ContentExtensionError::JSONInvalidTrigger;
+    
     JSValue urlFilterObject = triggerObject.get(&exec, Identifier(&exec, "url-filter"));
-    if (!urlFilterObject || exec.hadException() || !urlFilterObject.isString()) {
-        WTFLogAlways("Invalid url-filter object.");
-        return false;
-    }
+    if (!urlFilterObject || exec.hadException() || !urlFilterObject.isString())
+        return ContentExtensionError::JSONInvalidURLFilterInTrigger;
 
     String urlFilter = urlFilterObject.toWTFString(&exec);
-    if (urlFilter.isEmpty()) {
-        WTFLogAlways("Invalid url-filter object. The url is empty.");
-        return false;
-    }
+    if (urlFilter.isEmpty())
+        return ContentExtensionError::JSONInvalidURLFilterInTrigger;
+
     trigger.urlFilter = urlFilter;
 
     JSValue urlFilterCaseValue = triggerObject.get(&exec, Identifier(&exec, "url-filter-is-case-sensitive"));
@@ -104,29 +96,31 @@
         trigger.urlFilterIsCaseSensitive = urlFilterCaseValue.toBoolean(&exec);
 
     JSValue resourceTypeValue = triggerObject.get(&exec, Identifier(&exec, "resource-type"));
-    if (resourceTypeValue && !exec.hadException() && !getTypeFlags(exec, resourceTypeValue, trigger.flags, readResourceType))
-        return false;
-    
+    if (resourceTypeValue && !exec.hadException()) {
+        auto typeFlagsError = getTypeFlags(exec, resourceTypeValue, trigger.flags, readResourceType);
+        if (typeFlagsError)
+            return typeFlagsError;
+    }
+
     JSValue loadTypeValue = triggerObject.get(&exec, Identifier(&exec, "load-type"));
-    if (loadTypeValue && !exec.hadException() && !getTypeFlags(exec, loadTypeValue, trigger.flags, readLoadType))
-        return false;
+    if (loadTypeValue && !exec.hadException()) {
+        auto typeFlagsError = getTypeFlags(exec, loadTypeValue, trigger.flags, readLoadType);
+        if (typeFlagsError)
+            return typeFlagsError;
+    }
 
-    return true;
+    return { };
 }
 
-static bool loadAction(ExecState& exec, JSObject& ruleObject, Action& action)
+static std::error_code loadAction(ExecState& exec, JSObject& ruleObject, Action& action)
 {
     JSValue actionObject = ruleObject.get(&exec, Identifier(&exec, "action"));
-    if (!actionObject || exec.hadException() || !actionObject.isObject()) {
-        WTFLogAlways("Invalid action object.");
-        return false;
-    }
+    if (!actionObject || exec.hadException() || !actionObject.isObject())
+        return ContentExtensionError::JSONInvalidAction;
 
     JSValue typeObject = actionObject.get(&exec, Identifier(&exec, "type"));
-    if (!typeObject || exec.hadException() || !typeObject.isString()) {
-        WTFLogAlways("Invalid url-filter object.");
-        return false;
-    }
+    if (!typeObject || exec.hadException() || !typeObject.isString())
+        return ContentExtensionError::JSONInvalidActionType;
 
     String actionType = typeObject.toWTFString(&exec);
 
@@ -138,77 +132,73 @@
         action = ""
     else if (actionType == "css-display-none") {
         JSValue selector = actionObject.get(&exec, Identifier(&exec, "selector"));
-        if (!selector || exec.hadException() || !selector.isString()) {
-            WTFLogAlways("css-display-none action type requires a selector");
-            return false;
-        }
+        if (!selector || exec.hadException() || !selector.isString())
+            return ContentExtensionError::JSONInvalidCSSDisplayNoneActionType;
+
         action = "" selector.toWTFString(&exec));
-    } else {
-        WTFLogAlways("Unrecognized action: \"%s\"", actionType.utf8().data());
-        return false;
-    }
+    } else
+        return ContentExtensionError::JSONInvalidActionType;
 
-    return true;
+    return { };
 }
 
-static void loadRule(ExecState& exec, JSObject& ruleObject, Vector<ContentExtensionRule>& ruleList)
+static std::error_code loadRule(ExecState& exec, JSObject& ruleObject, Vector<ContentExtensionRule>& ruleList)
 {
     Trigger trigger;
-    if (!loadTrigger(exec, ruleObject, trigger))
-        return;
+    auto triggerError = loadTrigger(exec, ruleObject, trigger);
+    if (triggerError)
+        return triggerError;
 
     Action action;
-    if (!loadAction(exec, ruleObject, action))
-        return;
+    auto actionError = loadAction(exec, ruleObject, action);
+    if (actionError)
+        return actionError;
 
     ruleList.append(ContentExtensionRule(trigger, action));
+    return { };
 }
 
-static Vector<ContentExtensionRule> loadEncodedRules(ExecState& exec, const String& rules)
+static std::error_code loadEncodedRules(ExecState& exec, const String& rules, Vector<ContentExtensionRule>& ruleList)
 {
     JSValue decodedRules = JSONParse(&exec, rules);
 
-    if (exec.hadException() || !decodedRules) {
-        WTFLogAlways("Failed to parse the JSON string.");
-        return Vector<ContentExtensionRule>();
-    }
+    if (exec.hadException() || !decodedRules)
+        return ContentExtensionError::JSONInvalid;
 
-    if (decodedRules.isObject()) {
-        JSObject* topLevelObject = decodedRules.toObject(&exec);
-        if (!topLevelObject || exec.hadException()) {
-            WTFLogAlways("Invalid input, the top level structure is not an object.");
-            return Vector<ContentExtensionRule>();
-        }
+    if (!decodedRules.isObject())
+        return ContentExtensionError::JSONTopLevelStructureNotAnObject;
 
-        if (!isJSArray(topLevelObject)) {
-            WTFLogAlways("Invalid input, the top level object is not an array.");
-            return Vector<ContentExtensionRule>();
-        }
+    JSObject* topLevelObject = decodedRules.toObject(&exec);
+    if (!topLevelObject || exec.hadException())
+        return ContentExtensionError::JSONTopLevelStructureNotAnObject;
+    
+    if (!isJSArray(topLevelObject))
+        return ContentExtensionError::JSONTopLevelStructureNotAnArray;
 
-        Vector<ContentExtensionRule> ruleList;
-        JSArray* topLevelArray = jsCast<JSArray*>(topLevelObject);
+    JSArray* topLevelArray = jsCast<JSArray*>(topLevelObject);
 
-        unsigned length = topLevelArray->length();
-        for (unsigned i = 0; i < length; ++i) {
-            JSValue value = topLevelArray->getIndex(&exec, i);
-            if (exec.hadException() || !value) {
-                WTFLogAlways("Invalid object in the array.");
-                continue;
-            }
+    Vector<ContentExtensionRule> localRuleList;
 
-            JSObject* ruleObject = value.toObject(&exec);
-            if (!ruleObject || exec.hadException()) {
-                WTFLogAlways("Invalid rule");
-                continue;
-            }
-            loadRule(exec, *ruleObject, ruleList);
-        }
-        return ruleList;
+    unsigned length = topLevelArray->length();
+    for (unsigned i = 0; i < length; ++i) {
+        JSValue value = topLevelArray->getIndex(&exec, i);
+        if (exec.hadException() || !value)
+            return ContentExtensionError::JSONInvalidObjectInTopLevelArray;
+
+        JSObject* ruleObject = value.toObject(&exec);
+        if (!ruleObject || exec.hadException())
+            return ContentExtensionError::JSONInvalidRule;
+
+        auto error = loadRule(exec, *ruleObject, localRuleList);
+        if (error)
+            return error;
     }
-    return Vector<ContentExtensionRule>();
+
+    ruleList = WTF::move(localRuleList);
+    return { };
 }
 
-Vector<ContentExtensionRule> parseRuleList(const String& rules)
+std::error_code parseRuleList(const String& rules, Vector<ContentExtensionRule>& ruleList)
 {
 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
     double loadExtensionStartTime = monotonicallyIncreasingTime();
@@ -219,19 +209,22 @@
     JSGlobalObject* globalObject = JSGlobalObject::create(*vm, JSGlobalObject::createStructure(*vm, jsNull()));
 
     ExecState* exec = globalObject->globalExec();
-    Vector<ContentExtensionRule> ruleList = loadEncodedRules(*exec, rules);
+    auto error = loadEncodedRules(*exec, rules, ruleList);
 
     vm.clear();
 
+    if (error)
+        return error;
+
     if (ruleList.isEmpty())
-        WTFLogAlways("Empty extension.");
+        return ContentExtensionError::JSONContainsNoRules;
 
 #if CONTENT_EXTENSIONS_PERFORMANCE_REPORTING
     double loadExtensionEndTime = monotonicallyIncreasingTime();
     dataLogF("Time spent loading extension %f\n", (loadExtensionEndTime - loadExtensionStartTime));
 #endif
 
-    return ruleList;
+    return { };
 }
 
 } // namespace ContentExtensions

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionParser.h (181973 => 181974)


--- trunk/Source/WebCore/contentextensions/ContentExtensionParser.h	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionParser.h	2015-03-25 22:38:58 UTC (rev 181974)
@@ -28,6 +28,7 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
 
+#include <system_error>
 #include <wtf/Forward.h>
 #include <wtf/Vector.h>
 
@@ -37,7 +38,7 @@
 
 class ContentExtensionRule;
 
-Vector<ContentExtensionRule> parseRuleList(const String& rules);
+std::error_code parseRuleList(const String& rules, Vector<ContentExtensionRule>&);
 
 } // namespace ContentExtensions
 } // namespace WebCore

Modified: trunk/Source/WebKit2/ChangeLog (181973 => 181974)


--- trunk/Source/WebKit2/ChangeLog	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebKit2/ChangeLog	2015-03-25 22:38:58 UTC (rev 181974)
@@ -1,3 +1,24 @@
+2015-03-25  Sam Weinig  <[email protected]>
+
+        [Content Extensions] Convert content extension compiling to return error codes and write its output using a client
+        https://bugs.webkit.org/show_bug.cgi?id=143059
+
+        Reviewed by Alex Christensen.
+
+        * Shared/WebCompiledContentExtension.cpp:
+        * Shared/WebCompiledContentExtension.h:
+        (WebKit::LegacyContentExtensionCompilationClient::LegacyContentExtensionCompilationClient):
+        (WebKit::LegacyContentExtensionCompilationClient::writeBytecode):
+        (WebKit::LegacyContentExtensionCompilationClient::writeActions):
+        Add subclass of ContentExtensionCompilationClient for use with the non-file backed content
+        extensions.
+
+        * UIProcess/API/C/WKUserContentFilterRef.cpp:
+        (WKUserContentFilterCreate):
+        * UIProcess/API/Cocoa/_WKUserContentFilter.mm:
+        (-[_WKUserContentFilter initWithName:serializedRules:]):
+        Update to use the new interface of compileRuleList().
+
 2015-03-25  Ryosuke Niwa  <[email protected]>
 
         Web Inspector: Switching tabs to window with inspector open prohibits typing into console

Modified: trunk/Source/WebKit2/Shared/WebCompiledContentExtension.cpp (181973 => 181974)


--- trunk/Source/WebKit2/Shared/WebCompiledContentExtension.cpp	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebKit2/Shared/WebCompiledContentExtension.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -28,10 +28,24 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
 
-#include <WebCore/ContentExtensionCompiler.h>
-
 namespace WebKit {
 
+LegacyContentExtensionCompilationClient::LegacyContentExtensionCompilationClient(WebCore::ContentExtensions::CompiledContentExtensionData& data)
+    : m_data(data)
+{
+}
+
+void LegacyContentExtensionCompilationClient::writeBytecode(Vector<WebCore::ContentExtensions::DFABytecode>&& bytecode)
+{
+    m_data.bytecode = WTF::move(bytecode);
+}
+
+void LegacyContentExtensionCompilationClient::writeActions(Vector<WebCore::ContentExtensions::SerializedActionByte>&& actions)
+{
+    m_data.actions = WTF::move(actions);
+}
+
+
 Ref<WebCompiledContentExtension> WebCompiledContentExtension::createFromCompiledContentExtensionData(const WebCore::ContentExtensions::CompiledContentExtensionData& compilerData)
 {
     RefPtr<SharedMemory> sharedMemory = SharedMemory::create(compilerData.bytecode.size() + compilerData.actions.size());
@@ -42,7 +56,7 @@
     data.data = ""
     data.bytecodeOffset = 0;
     data.bytecodeSize = compilerData.bytecode.size();
-    data.actionsOffset = compilerData.bytecode.size();
+    data.actionsOffset = compilerData.  bytecode.size();
     data.actionsSize = compilerData.actions.size();
 
     return create(WTF::move(data));

Modified: trunk/Source/WebKit2/Shared/WebCompiledContentExtension.h (181973 => 181974)


--- trunk/Source/WebKit2/Shared/WebCompiledContentExtension.h	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebKit2/Shared/WebCompiledContentExtension.h	2015-03-25 22:38:58 UTC (rev 181974)
@@ -29,16 +29,24 @@
 #if ENABLE(CONTENT_EXTENSIONS)
 
 #include "WebCompiledContentExtensionData.h"
+#include <WebCore/ContentExtensionCompiler.h>
 #include <WebCore/CompiledContentExtension.h>
 
-namespace WebCore {
-namespace ContentExtensions {
-struct CompiledContentExtensionData;
-}
-}
-
 namespace WebKit {
 
+// FIXME: Remove this once everyone is converted to using the UserContentExtensionStore.
+class LegacyContentExtensionCompilationClient final : public WebCore::ContentExtensions::ContentExtensionCompilationClient {
+public:
+    LegacyContentExtensionCompilationClient(WebCore::ContentExtensions::CompiledContentExtensionData&);
+
+    virtual void writeBytecode(Vector<WebCore::ContentExtensions::DFABytecode>&&) override;
+    virtual void writeActions(Vector<WebCore::ContentExtensions::SerializedActionByte>&&) override;
+
+private:
+    WebCore::ContentExtensions::CompiledContentExtensionData& m_data;
+};
+
+
 class WebCompiledContentExtension final : public WebCore::ContentExtensions::CompiledContentExtension {
 public:
     // FIXME: Remove this once everyone is converted to using the UserContentExtensionStore.

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKUserContentFilterRef.cpp (181973 => 181974)


--- trunk/Source/WebKit2/UIProcess/API/C/WKUserContentFilterRef.cpp	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKUserContentFilterRef.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -30,6 +30,7 @@
 #include "WKAPICast.h"
 #include "WebCompiledContentExtension.h"
 #include <WebCore/ContentExtensionCompiler.h>
+#include <WebCore/ContentExtensionError.h>
 
 using namespace WebKit;
 
@@ -41,9 +42,15 @@
 WKUserContentFilterRef WKUserContentFilterCreate(WKStringRef nameRef, WKStringRef serializedRulesRef)
 {
 #if ENABLE(CONTENT_EXTENSIONS)
-    auto compiledContentExtensionData = WebCore::ContentExtensions::compileRuleList(toWTFString(serializedRulesRef));
-    auto compiledContentExtension = WebKit::WebCompiledContentExtension::createFromCompiledContentExtensionData(compiledContentExtensionData);
+    WebCore::ContentExtensions::CompiledContentExtensionData data;
+    LegacyContentExtensionCompilationClient client(data);
 
+    auto compilerError = WebCore::ContentExtensions::compileRuleList(toWTFString(serializedRulesRef), client);
+    if (compilerError)
+        return nullptr;
+
+    auto compiledContentExtension = WebKit::WebCompiledContentExtension::createFromCompiledContentExtensionData(data);
+
     return toAPI(&API::UserContentExtension::create(toWTFString(nameRef), WTF::move(compiledContentExtension)).leakRef());
 #else
     UNUSED_PARAM(nameRef);

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentFilter.mm (181973 => 181974)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentFilter.mm	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserContentFilter.mm	2015-03-25 22:38:58 UTC (rev 181974)
@@ -30,6 +30,8 @@
 
 #include "WebCompiledContentExtension.h"
 #include <WebCore/ContentExtensionCompiler.h>
+#include <WebCore/ContentExtensionError.h>
+#include <string>
 
 @implementation _WKUserContentFilter
 
@@ -38,9 +40,14 @@
     if (!(self = [super init]))
         return nil;
 
-    auto compiledContentExtensionData = WebCore::ContentExtensions::compileRuleList(String(serializedRules));
-    auto compiledContentExtension = WebKit::WebCompiledContentExtension::createFromCompiledContentExtensionData(compiledContentExtensionData);
+    WebCore::ContentExtensions::CompiledContentExtensionData data;
+    WebKit::LegacyContentExtensionCompilationClient client(data);
 
+    auto compilerError = WebCore::ContentExtensions::compileRuleList(String(serializedRules), client);
+    if (compilerError)
+        [NSException raise:NSGenericException format:@"Failed to compile rules with error: %s", compilerError.message().c_str()];
+
+    auto compiledContentExtension = WebKit::WebCompiledContentExtension::createFromCompiledContentExtensionData(data);
     API::Object::constructInWrapper<API::UserContentExtension>(self, String(name), WTF::move(compiledContentExtension));
 
     return self;

Modified: trunk/Tools/ChangeLog (181973 => 181974)


--- trunk/Tools/ChangeLog	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Tools/ChangeLog	2015-03-25 22:38:58 UTC (rev 181974)
@@ -1,3 +1,14 @@
+2015-03-25  Sam Weinig  <[email protected]>
+
+        [Content Extensions] Convert content extension compiling to return error codes and write its output using a client
+        https://bugs.webkit.org/show_bug.cgi?id=143059
+
+        Reviewed by Alex Christensen.
+
+        * TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
+        (TestWebKitAPI::InMemoryCompiledContentExtension::createFromFilter):
+        Update for new interface of compileRuleList().
+
 2015-03-25  Alex Christensen  <[email protected]>
 
         [Content Extensions] Add multi-DFA compiling and interpreting.

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp (181973 => 181974)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp	2015-03-25 21:33:59 UTC (rev 181973)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp	2015-03-25 22:38:58 UTC (rev 181974)
@@ -74,8 +74,40 @@
     }
 };
 
+class InMemoryContentExtensionCompilationClient final : public WebCore::ContentExtensions::ContentExtensionCompilationClient {
+public:
+    InMemoryContentExtensionCompilationClient(WebCore::ContentExtensions::CompiledContentExtensionData& data)
+        : m_data(data)
+    {
+    }
+
+    virtual void writeBytecode(Vector<WebCore::ContentExtensions::DFABytecode>&& bytecode) override
+    {
+        m_data.bytecode = WTF::move(bytecode);
+    }
+    
+    virtual void writeActions(Vector<WebCore::ContentExtensions::SerializedActionByte>&& actions) override
+    {
+        m_data.actions = WTF::move(actions);
+    }
+
+private:
+    WebCore::ContentExtensions::CompiledContentExtensionData& m_data;
+};
+
 class InMemoryCompiledContentExtension : public ContentExtensions::CompiledContentExtension {
 public:
+    static RefPtr<InMemoryCompiledContentExtension> createFromFilter(const String& filter)
+    {
+        WebCore::ContentExtensions::CompiledContentExtensionData extensionData;
+        InMemoryContentExtensionCompilationClient client(extensionData);
+        auto compilerError = ContentExtensions::compileRuleList(filter, client);
+        if (compilerError)
+            return nullptr;
+
+        return InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    }
+
     static RefPtr<InMemoryCompiledContentExtension> create(ContentExtensions::CompiledContentExtensionData&& data)
     {
         return adoptRef(new InMemoryCompiledContentExtension(WTF::move(data)));
@@ -126,8 +158,7 @@
 
 TEST_F(ContentExtensionTest, Basic)
 {
-    auto extensionData = ContentExtensions::compileRuleList(basicFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(basicFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("testFilter", extension);
@@ -139,8 +170,7 @@
 {
     const char* rangeBasicFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"w[0-9]c\", \"url-filter-is-case-sensitive\":true}},"
         "{\"action\":{\"type\":\"block-cookies\"},\"trigger\":{\"url-filter\":\"[A-H][a-z]cko\", \"url-filter-is-case-sensitive\":true}}]";
-    auto extensionData = ContentExtensions::compileRuleList(rangeBasicFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(rangeBasicFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("PatternNestedGroupsFilter", extension);
@@ -166,8 +196,7 @@
 {
     // Transition of the type ([^X]X) effictively transition on every input.
     const char* rangeExclusionGeneratingUniversalTransitionFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"[^a]+afoobar\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(rangeExclusionGeneratingUniversalTransitionFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(rangeExclusionGeneratingUniversalTransitionFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("PatternNestedGroupsFilter", extension);
@@ -189,8 +218,7 @@
 TEST_F(ContentExtensionTest, PatternStartingWithGroup)
 {
     const char* patternsStartingWithGroupFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^(http://whatwg\\\\.org/)?webkit\134\134.org\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(patternsStartingWithGroupFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(patternsStartingWithGroupFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("PatternNestedGroupsFilter", extension);
@@ -206,8 +234,7 @@
 {
     const char* patternNestedGroupsFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^http://webkit\\\\.org/(foo(bar)*)+\"}}]";
 
-    auto extensionData = ContentExtensions::compileRuleList(patternNestedGroupsFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(patternNestedGroupsFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("PatternNestedGroupsFilter", extension);
@@ -229,8 +256,7 @@
 {
     const char* matchPastEndOfStringFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".+\"}}]";
 
-    auto extensionData = ContentExtensions::compileRuleList(matchPastEndOfStringFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(matchPastEndOfStringFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("MatchPastEndOfString", extension);
@@ -249,8 +275,7 @@
 
 TEST_F(ContentExtensionTest, StartOfLineAssertion)
 {
-    auto extensionData = ContentExtensions::compileRuleList(startOfLineAssertionFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(startOfLineAssertionFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("StartOfLineAssertion", extension);
@@ -268,8 +293,7 @@
 TEST_F(ContentExtensionTest, EndOfLineAssertion)
 {
     const char* endOfLineAssertionFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"foobar$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(endOfLineAssertionFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(endOfLineAssertionFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("EndOfLineAssertion", extension);
@@ -285,8 +309,7 @@
 TEST_F(ContentExtensionTest, EndOfLineAssertionWithInvertedCharacterSet)
 {
     const char* endOfLineAssertionWithInvertedCharacterSetFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"[^y]$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(endOfLineAssertionWithInvertedCharacterSetFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(endOfLineAssertionWithInvertedCharacterSetFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("EndOfLineAssertion", extension);
@@ -308,8 +331,7 @@
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^prefix\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"suffix$\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^http://exact\\\\.org/$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(prefixInfixSuffixExactMatchFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(prefixInfixSuffixExactMatchFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("PrefixInfixSuffixExactMatch", extension);
@@ -334,8 +356,7 @@
 {
     const char* duplicatedMatchAllTermsInVariousFormatFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*.*(.)*(.*)(.+)*(.?)*infix\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"pre(.?)+(.+)?post\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(duplicatedMatchAllTermsInVariousFormatFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(duplicatedMatchAllTermsInVariousFormatFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("DuplicatedMatchAllTermsInVariousFormat", extension);
@@ -367,8 +388,7 @@
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^pre8(.?)*post8$\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^pre9(.+)?post9$\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^pre0(.?)+post0$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(termsKnownToMatchAnythingFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(termsKnownToMatchAnythingFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("TermsKnownToMatchAnything", extension);
@@ -411,8 +431,7 @@
 {
     const char* trailingDotStarFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"foo.*$\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"bar(.*)$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(trailingDotStarFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(trailingDotStarFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("TrailingDotStar", extension);
@@ -435,8 +454,7 @@
     const char* trailingTermsCarryingNoDataFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"foob?a?r?\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"bazo(ok)?a?$\"}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"cats*$\"}}]";
-    auto extensionData = ContentExtensions::compileRuleList(trailingTermsCarryingNoDataFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(trailingTermsCarryingNoDataFilter);
 
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("TrailingTermsCarryingNoData", extension);
@@ -478,8 +496,7 @@
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"whatwg.org\",\"load-type\":[\"first-party\"]}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"alwaysblock.pdf\"}}]";
 
-    auto extensionData = ContentExtensions::compileRuleList(loadTypeFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(loadTypeFilter);
         
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("LoadTypeFilter", extension);
@@ -499,8 +516,7 @@
     const char* resourceTypeFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"block_all_types.org\",\"resource-type\":[\"document\",\"image\",\"style-sheet\",\"script\",\"font\",\"raw\",\"svg-document\",\"media\"]}},"
         "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"block_only_images\",\"resource-type\":[\"image\"]}}]";
 
-    auto extensionData = ContentExtensions::compileRuleList(resourceTypeFilter);
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(resourceTypeFilter);
         
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("ResourceTypeFilter", extension);
@@ -545,8 +561,7 @@
     }
     ruleList.append(']');
     
-    auto extensionData = ContentExtensions::compileRuleList(ruleList.toString());
-    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+    auto extension = InMemoryCompiledContentExtension::createFromFilter(ruleList.toString());
         
     ContentExtensions::ContentExtensionsBackend backend;
     backend.addContentExtension("ResourceTypeFilter", extension);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to