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);