<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[181421] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/181421">181421</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-03-11 18:03:43 -0700 (Wed, 11 Mar 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>[Content Extensions] Add resource type and load type triggers.
https://bugs.webkit.org/show_bug.cgi?id=142422
Patch by Alex Christensen <achristensen@webkit.org> on 2015-03-11
Reviewed by Benjamin Poulain.
Source/WebCore:
New API tests.
* WebCore.xcodeproj/project.pbxproj:
* contentextensions/ContentExtensionCompiler.cpp:
(WebCore::ContentExtensions::compileRuleList):
* contentextensions/ContentExtensionParser.cpp:
(WebCore::ContentExtensions::getTypeFlags):
(WebCore::ContentExtensions::loadTrigger):
* contentextensions/ContentExtensionRule.h:
* contentextensions/ContentExtensionsBackend.cpp:
(WebCore::ContentExtensions::ContentExtensionsBackend::actionsForResourceLoad):
(WebCore::ContentExtensions::ContentExtensionsBackend::actionsForURL): Deleted.
* contentextensions/ContentExtensionsBackend.h:
* contentextensions/DFABytecode.h:
(WebCore::ContentExtensions::instructionSizeWithArguments):
* contentextensions/DFABytecodeCompiler.cpp:
(WebCore::ContentExtensions::DFABytecodeCompiler::emitAppendConditionalAction):
(WebCore::ContentExtensions::DFABytecodeCompiler::compileNode):
* contentextensions/DFABytecodeCompiler.h:
* contentextensions/DFABytecodeInterpreter.cpp:
(WebCore::ContentExtensions::DFABytecodeInterpreter::interpret):
* contentextensions/DFABytecodeInterpreter.h:
* loader/ResourceLoadInfo.cpp: Added.
(WebCore::toResourceType):
(WebCore::readResourceType):
(WebCore::readLoadType):
(WebCore::ResourceLoadInfo::isThirdParty):
(WebCore::ResourceLoadInfo::getResourceFlags):
* loader/ResourceLoadInfo.h: Added.
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::requestResource):
* page/UserContentController.cpp:
(WebCore::UserContentController::actionsForResourceLoad):
(WebCore::UserContentController::actionsForURL): Deleted.
* page/UserContentController.h:
Tools:
* TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
(TestWebKitAPI::testRequest):
(TestWebKitAPI::mainDocumentRequest):
(TestWebKitAPI::TEST_F):
(TestWebKitAPI::testURL): Deleted.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsContentExtensionCompilercpp">trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsContentExtensionParsercpp">trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsContentExtensionRuleh">trunk/Source/WebCore/contentextensions/ContentExtensionRule.h</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsContentExtensionsBackendcpp">trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsContentExtensionsBackendh">trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFABytecodeh">trunk/Source/WebCore/contentextensions/DFABytecode.h</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFABytecodeCompilercpp">trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFABytecodeCompilerh">trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.h</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFABytecodeInterpretercpp">trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFABytecodeInterpreterh">trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceLoadercpp">trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserContentControllercpp">trunk/Source/WebCore/page/UserContentController.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserContentControllerh">trunk/Source/WebCore/page/UserContentController.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreContentExtensionscpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreloaderResourceLoadInfocpp">trunk/Source/WebCore/loader/ResourceLoadInfo.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoadInfoh">trunk/Source/WebCore/loader/ResourceLoadInfo.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/ChangeLog        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2015-03-11 Alex Christensen <achristensen@webkit.org>
+
+ [Content Extensions] Add resource type and load type triggers.
+ https://bugs.webkit.org/show_bug.cgi?id=142422
+
+ Reviewed by Benjamin Poulain.
+
+ New API tests.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * contentextensions/ContentExtensionCompiler.cpp:
+ (WebCore::ContentExtensions::compileRuleList):
+ * contentextensions/ContentExtensionParser.cpp:
+ (WebCore::ContentExtensions::getTypeFlags):
+ (WebCore::ContentExtensions::loadTrigger):
+ * contentextensions/ContentExtensionRule.h:
+ * contentextensions/ContentExtensionsBackend.cpp:
+ (WebCore::ContentExtensions::ContentExtensionsBackend::actionsForResourceLoad):
+ (WebCore::ContentExtensions::ContentExtensionsBackend::actionsForURL): Deleted.
+ * contentextensions/ContentExtensionsBackend.h:
+ * contentextensions/DFABytecode.h:
+ (WebCore::ContentExtensions::instructionSizeWithArguments):
+ * contentextensions/DFABytecodeCompiler.cpp:
+ (WebCore::ContentExtensions::DFABytecodeCompiler::emitAppendConditionalAction):
+ (WebCore::ContentExtensions::DFABytecodeCompiler::compileNode):
+ * contentextensions/DFABytecodeCompiler.h:
+ * contentextensions/DFABytecodeInterpreter.cpp:
+ (WebCore::ContentExtensions::DFABytecodeInterpreter::interpret):
+ * contentextensions/DFABytecodeInterpreter.h:
+ * loader/ResourceLoadInfo.cpp: Added.
+ (WebCore::toResourceType):
+ (WebCore::readResourceType):
+ (WebCore::readLoadType):
+ (WebCore::ResourceLoadInfo::isThirdParty):
+ (WebCore::ResourceLoadInfo::getResourceFlags):
+ * loader/ResourceLoadInfo.h: Added.
+ * loader/cache/CachedResourceLoader.cpp:
+ (WebCore::CachedResourceLoader::requestResource):
+ * page/UserContentController.cpp:
+ (WebCore::UserContentController::actionsForResourceLoad):
+ (WebCore::UserContentController::actionsForURL): Deleted.
+ * page/UserContentController.h:
+
</ins><span class="cx"> 2015-03-11 Tim Horton <timothy_horton@apple.com>
</span><span class="cx">
</span><span class="cx"> Fix the build.
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -2053,6 +2053,8 @@
</span><span class="cx">                 51EAC5681815ED3E004F1BA4 /* IDBTransactionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EAC5661815ED3E004F1BA4 /* IDBTransactionCoordinator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 51EAC5B218163F4E004F1BA4 /* IDBRecordIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EAC5B018163F4E004F1BA4 /* IDBRecordIdentifier.h */; };
</span><span class="cx">                 51EC92650CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51EC925D0CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp */; };
</span><ins>+                51EE7B381AA50B0500F92B21 /* ResourceLoadInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EE7B371AA50B0500F92B21 /* ResourceLoadInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                51EE7B3A1AA5123100F92B21 /* ResourceLoadInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51EE7B391AA5123100F92B21 /* ResourceLoadInfo.cpp */; };
</ins><span class="cx">                 51FA2D78152132B300C1BA0B /* DOMWindowExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 517FBA18151AA71B00B57959 /* DOMWindowExtension.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 51FB5504113E3E9100821176 /* JSCloseEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 51FB5502113E3E9100821176 /* JSCloseEvent.h */; };
</span><span class="cx">                 51FB5505113E3E9100821176 /* JSCloseEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51FB5503113E3E9100821176 /* JSCloseEvent.cpp */; };
</span><span class="lines">@@ -9226,6 +9228,8 @@
</span><span class="cx">                 51EAC5661815ED3E004F1BA4 /* IDBTransactionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBTransactionCoordinator.h; sourceTree = "<group>"; };
</span><span class="cx">                 51EAC5B018163F4E004F1BA4 /* IDBRecordIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBRecordIdentifier.h; sourceTree = "<group>"; };
</span><span class="cx">                 51EC925D0CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCustomSQLStatementErrorCallback.cpp; sourceTree = "<group>"; };
</span><ins>+                51EE7B371AA50B0500F92B21 /* ResourceLoadInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadInfo.h; sourceTree = "<group>"; };
+                51EE7B391AA5123100F92B21 /* ResourceLoadInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceLoadInfo.cpp; sourceTree = "<group>"; };
</ins><span class="cx">                 51F6A3D50663BF04004D2919 /* HTMLCanvasElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLCanvasElement.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
</span><span class="cx">                 51F6A3D60663BF04004D2919 /* HTMLCanvasElement.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = HTMLCanvasElement.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
</span><span class="cx">                 51FB5502113E3E9100821176 /* JSCloseEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCloseEvent.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -21453,6 +21457,8 @@
</span><span class="cx">                                 656D37270ADBA5DE00A4554D /* ResourceLoader.h */,
</span><span class="cx">                                 D0A3A7301405A39800FB8ED3 /* ResourceLoaderOptions.h */,
</span><span class="cx">                                 51AF503516F100F60095B2E8 /* ResourceLoaderTypes.h */,
</span><ins>+                                51EE7B391AA5123100F92B21 /* ResourceLoadInfo.cpp */,
+                                51EE7B371AA50B0500F92B21 /* ResourceLoadInfo.h */,
</ins><span class="cx">                                 973E325410883B7C005BC493 /* ResourceLoadNotifier.cpp */,
</span><span class="cx">                                 973E325510883B7C005BC493 /* ResourceLoadNotifier.h */,
</span><span class="cx">                                 D0CE58F6125E4CC200F3F199 /* ResourceLoadScheduler.cpp */,
</span><span class="lines">@@ -25133,6 +25139,7 @@
</span><span class="cx">                                 1AE2AEC80A1D297B00B42B25 /* JSHTMLQuoteElement.h in Headers */,
</span><span class="cx">                                 1AE2ABAD0A1CE90500B42B25 /* JSHTMLScriptElement.h in Headers */,
</span><span class="cx">                                 E1E6EEA80B628DB3005F2F70 /* JSHTMLSelectElement.h in Headers */,
</span><ins>+                                51EE7B381AA50B0500F92B21 /* ResourceLoadInfo.h in Headers */,
</ins><span class="cx">                                 AB4CB4EB0B8BDA3D009F40B0 /* JSHTMLSelectElementCustom.h in Headers */,
</span><span class="cx">                                 E446143C0CD689CC00FADA75 /* JSHTMLSourceElement.h in Headers */,
</span><span class="cx">                                 9752D38E1413104B003305BD /* JSHTMLSpanElement.h in Headers */,
</span><span class="lines">@@ -30119,6 +30126,7 @@
</span><span class="cx">                                 A14832B1187F61E100DA63A6 /* WAKAppKitStubs.m in Sources */,
</span><span class="cx">                                 A14832B3187F629100DA63A6 /* WAKClipView.m in Sources */,
</span><span class="cx">                                 A14832B5187F62FC00DA63A6 /* WAKResponder.m in Sources */,
</span><ins>+                                51EE7B3A1AA5123100F92B21 /* ResourceLoadInfo.cpp in Sources */,
</ins><span class="cx">                                 A14832B7187F636C00DA63A6 /* WAKScrollView.mm in Sources */,
</span><span class="cx">                                 A14832B9187F63D500DA63A6 /* WAKView.mm in Sources */,
</span><span class="cx">                                 A14832BC187F648E00DA63A6 /* WAKWindow.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsContentExtensionCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionCompiler.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -116,7 +116,8 @@
</span><span class="cx"> const Trigger& trigger = contentExtensionRule.trigger();
</span><span class="cx"> ASSERT(trigger.urlFilter.length());
</span><span class="cx">
</span><del>- String error = urlFilterParser.addPattern(trigger.urlFilter, trigger.urlFilterIsCaseSensitive, actionLocations[ruleIndex]);
</del><ins>+ // High bits are used for flags. This should match how they are used in DFABytecodeCompiler::compileNode.
+ String error = urlFilterParser.addPattern(trigger.urlFilter, trigger.urlFilterIsCaseSensitive, (static_cast<uint64_t>(trigger.flags) << 32) | static_cast<uint64_t>(actionLocations[ruleIndex]));
</ins><span class="cx">
</span><span class="cx"> if (!error.isNull()) {
</span><span class="cx"> dataLogF("Error while parsing %s: %s\n", trigger.urlFilter.utf8().data(), error.utf8().data());
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsContentExtensionParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionParser.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -46,6 +46,38 @@
</span><span class="cx">
</span><span class="cx"> namespace ContentExtensions {
</span><span class="cx">
</span><ins>+static bool getTypeFlags(ExecState& exec, const JSValue& typeValue, ResourceFlags& flags, uint16_t(*stringToType)(const String&))
+{
+ if (!typeValue.isObject())
+ return true;
+
+ JSObject* object = typeValue.toObject(&exec);
+ if (!isJSArray(object)) {
+ WTFLogAlways("Invalid trigger flags array");
+ return false;
+ }
+
+ 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;
+ }
+
+ String name = value.toWTFString(&exec);
+ uint16_t type = stringToType(name);
+ if (!type) {
+ WTFLogAlways("Invalid string in the trigger flags array.");
+ continue;
+ }
+ flags |= type;
+ }
+ return true;
+}
+
</ins><span class="cx"> static bool loadTrigger(ExecState& exec, JSObject& ruleObject, Trigger& trigger)
</span><span class="cx"> {
</span><span class="cx"> JSValue triggerObject = ruleObject.get(&exec, Identifier(&exec, "trigger"));
</span><span class="lines">@@ -67,10 +99,18 @@
</span><span class="cx"> }
</span><span class="cx"> trigger.urlFilter = urlFilter;
</span><span class="cx">
</span><del>- JSValue urlFilterCaseObject = triggerObject.get(&exec, Identifier(&exec, "url-filter-is-case-sensitive"));
- if (urlFilterCaseObject && !exec.hadException() && urlFilterCaseObject.isBoolean())
- trigger.urlFilterIsCaseSensitive = urlFilterCaseObject.toBoolean(&exec);
</del><ins>+ JSValue urlFilterCaseValue = triggerObject.get(&exec, Identifier(&exec, "url-filter-is-case-sensitive"));
+ if (urlFilterCaseValue && !exec.hadException() && urlFilterCaseValue.isBoolean())
+ trigger.urlFilterIsCaseSensitive = urlFilterCaseValue.toBoolean(&exec);
</ins><span class="cx">
</span><ins>+ JSValue resourceTypeValue = triggerObject.get(&exec, Identifier(&exec, "resource-type"));
+ if (resourceTypeValue && !exec.hadException() && !getTypeFlags(exec, resourceTypeValue, trigger.flags, readResourceType))
+ return false;
+
+ JSValue loadTypeValue = triggerObject.get(&exec, Identifier(&exec, "load-type"));
+ if (loadTypeValue && !exec.hadException() && !getTypeFlags(exec, loadTypeValue, trigger.flags, readLoadType))
+ return false;
+
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsContentExtensionRuleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/ContentExtensionRule.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/ContentExtensionRule.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionRule.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">
</span><span class="cx"> #include "ContentExtensionActions.h"
</span><ins>+#include "ResourceLoadInfo.h"
</ins><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -43,6 +44,7 @@
</span><span class="cx"> struct Trigger {
</span><span class="cx"> String urlFilter;
</span><span class="cx"> bool urlFilterIsCaseSensitive { false };
</span><ins>+ ResourceFlags flags { 0 };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> struct Action {
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsContentExtensionsBackendcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx">
</span><span class="cx"> #include "CompiledContentExtension.h"
</span><span class="cx"> #include "DFABytecodeInterpreter.h"
</span><ins>+#include "ResourceLoadInfo.h"
</ins><span class="cx"> #include "URL.h"
</span><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="lines">@@ -61,16 +62,17 @@
</span><span class="cx"> m_contentExtensions.clear();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Vector<Action> ContentExtensionsBackend::actionsForURL(const URL& url)
</del><ins>+Vector<Action> ContentExtensionsBackend::actionsForResourceLoad(const ResourceLoadInfo& resourceLoadInfo) const
</ins><span class="cx"> {
</span><del>- const String& urlString = url.string();
</del><ins>+ const String& urlString = resourceLoadInfo.resourceURL.string();
</ins><span class="cx"> ASSERT_WITH_MESSAGE(urlString.containsOnlyASCII(), "A decoded URL should only contain ASCII characters. The matching algorithm assumes the input is ASCII.");
</span><span class="cx"> const CString& urlCString = urlString.utf8();
</span><span class="cx">
</span><span class="cx"> Vector<Action> finalActions;
</span><ins>+ ResourceFlags flags = resourceLoadInfo.getResourceFlags();
</ins><span class="cx"> for (auto& compiledContentExtension : m_contentExtensions.values()) {
</span><span class="cx"> DFABytecodeInterpreter interpreter(compiledContentExtension->bytecode(), compiledContentExtension->bytecodeLength());
</span><del>- DFABytecodeInterpreter::Actions triggeredActions = interpreter.interpret(urlCString);
</del><ins>+ DFABytecodeInterpreter::Actions triggeredActions = interpreter.interpret(urlCString, flags);
</ins><span class="cx">
</span><span class="cx"> const SerializedActionByte* actions = compiledContentExtension->actions();
</span><span class="cx"> const unsigned actionsLength = compiledContentExtension->actionsLength();
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsContentExtensionsBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -37,6 +37,8 @@
</span><span class="cx">
</span><span class="cx"> class URL;
</span><span class="cx">
</span><ins>+struct ResourceLoadInfo;
+
</ins><span class="cx"> namespace ContentExtensions {
</span><span class="cx">
</span><span class="cx"> class CompiledContentExtension;
</span><span class="lines">@@ -57,7 +59,7 @@
</span><span class="cx"> WEBCORE_EXPORT void removeAllContentExtensions();
</span><span class="cx">
</span><span class="cx"> // - Internal WebCore Interface.
</span><del>- WEBCORE_EXPORT Vector<Action> actionsForURL(const URL&);
</del><ins>+ WEBCORE_EXPORT Vector<Action> actionsForResourceLoad(const ResourceLoadInfo&) const;
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> HashMap<String, RefPtr<CompiledContentExtension>> m_contentExtensions;
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFABytecodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFABytecode.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFABytecode.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/DFABytecode.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -44,6 +44,11 @@
</span><span class="cx"> // AppendAction has one argument:
</span><span class="cx"> // The action to append (4 bytes).
</span><span class="cx"> AppendAction,
</span><ins>+
+ // TestFlagsAndAppendAction has two arguments:
+ // The flags to check before appending (2 bytes),
+ // The action to append (4bytes).
+ TestFlagsAndAppendAction,
</ins><span class="cx">
</span><span class="cx"> // Terminate has no arguments.
</span><span class="cx"> Terminate,
</span><span class="lines">@@ -60,6 +65,8 @@
</span><span class="cx"> return sizeof(DFABytecodeInstruction) + sizeof(uint8_t) + sizeof(unsigned);
</span><span class="cx"> case DFABytecodeInstruction::AppendAction:
</span><span class="cx"> return sizeof(DFABytecodeInstruction) + sizeof(unsigned);
</span><ins>+ case DFABytecodeInstruction::TestFlagsAndAppendAction:
+ return sizeof(DFABytecodeInstruction) + sizeof(uint16_t) + sizeof(unsigned);
</ins><span class="cx"> case DFABytecodeInstruction::Terminate:
</span><span class="cx"> return sizeof(DFABytecodeInstruction);
</span><span class="cx"> case DFABytecodeInstruction::Jump:
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFABytecodeCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -53,6 +53,14 @@
</span><span class="cx"> append<unsigned>(m_bytecode, action);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void DFABytecodeCompiler::emitTestFlagsAndAppendAction(uint16_t flags, unsigned action)
+{
+ ASSERT(flags);
+ append<DFABytecodeInstruction>(m_bytecode, DFABytecodeInstruction::TestFlagsAndAppendAction);
+ append<uint16_t>(m_bytecode, flags);
+ append<unsigned>(m_bytecode, action);
+}
+
</ins><span class="cx"> void DFABytecodeCompiler::emitJump(unsigned destinationNodeIndex)
</span><span class="cx"> {
</span><span class="cx"> append<DFABytecodeInstruction>(m_bytecode, DFABytecodeInstruction::Jump);
</span><span class="lines">@@ -80,8 +88,13 @@
</span><span class="cx"> // Record starting index for linking.
</span><span class="cx"> m_nodeStartOffsets[index] = m_bytecode.size();
</span><span class="cx">
</span><del>- for (uint64_t action : node.actions)
- emitAppendAction(static_cast<unsigned>(action));
</del><ins>+ for (uint64_t action : node.actions) {
+ // High bits are used to store flags. See compileRuleList.
+ if (action & 0xFFFF00000000)
+ emitTestFlagsAndAppendAction(static_cast<uint16_t>(action >> 32), static_cast<unsigned>(action));
+ else
+ emitAppendAction(static_cast<unsigned>(action));
+ }
</ins><span class="cx">
</span><span class="cx"> for (const auto& transition : node.transitions)
</span><span class="cx"> emitCheckValue(transition.key, transition.value);
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFABytecodeCompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> void compileNode(unsigned);
</span><span class="cx">
</span><span class="cx"> void emitAppendAction(unsigned);
</span><ins>+ void emitTestFlagsAndAppendAction(uint16_t flags, unsigned);
</ins><span class="cx"> void emitJump(unsigned destinationNodeIndex);
</span><span class="cx"> void emitCheckValue(uint8_t value, unsigned destinationNodeIndex);
</span><span class="cx"> void emitTerminate();
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFABytecodeInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> return *reinterpret_cast<const IntType*>(&bytecode[index]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-DFABytecodeInterpreter::Actions DFABytecodeInterpreter::interpret(const CString& urlCString)
</del><ins>+DFABytecodeInterpreter::Actions DFABytecodeInterpreter::interpret(const CString& urlCString, uint16_t flags)
</ins><span class="cx"> {
</span><span class="cx"> const char* url = urlCString.data();
</span><span class="cx"> ASSERT(url);
</span><span class="lines">@@ -86,6 +86,12 @@
</span><span class="cx"> programCounter += instructionSizeWithArguments(DFABytecodeInstruction::AppendAction);
</span><span class="cx"> break;
</span><span class="cx">
</span><ins>+ case DFABytecodeInstruction::TestFlagsAndAppendAction:
+ if (flags & getBits<uint16_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode)))
+ actions.add(static_cast<uint64_t>(getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint16_t))));
+ programCounter += instructionSizeWithArguments(DFABytecodeInstruction::TestFlagsAndAppendAction);
+ break;
+
</ins><span class="cx"> default:
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED(); // Invalid bytecode.
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFABytecodeInterpreterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx">
</span><span class="cx"> typedef HashSet<uint64_t, DefaultHash<uint64_t>::Hash, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> Actions;
</span><span class="cx">
</span><del>- Actions interpret(const CString&);
</del><ins>+ Actions interpret(const CString&, uint16_t flags);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> const DFABytecode* m_bytecode;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadInfocpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/loader/ResourceLoadInfo.cpp (0 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoadInfo.cpp         (rev 0)
+++ trunk/Source/WebCore/loader/ResourceLoadInfo.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -0,0 +1,117 @@
</span><ins>+/*
+ * 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 "ResourceLoadInfo.h"
+
+#include "ContentExtensionActions.h"
+#include "SecurityOrigin.h"
+
+namespace WebCore {
+
+ResourceType toResourceType(CachedResource::Type type)
+{
+ switch (type) {
+ case CachedResource::MainResource:
+ return ResourceType::Document;
+ case CachedResource::SVGDocumentResource:
+ return ResourceType::SVGDocument;
+ case CachedResource::ImageResource:
+ return ResourceType::Image;
+ case CachedResource::CSSStyleSheet:
+#if ENABLE(XSLT)
+ case CachedResource::XSLStyleSheet:
+#endif
+ return ResourceType::StyleSheet;
+
+ case CachedResource::Script:
+ return ResourceType::Script;
+
+ case CachedResource::FontResource:
+#if ENABLE(SVG_FONTS)
+ case CachedResource::SVGFontResource:
+#endif
+ return ResourceType::Font;
+
+ case CachedResource::RawResource:
+ return ResourceType::Raw;
+
+#if ENABLE(VIDEO_TRACK)
+ case CachedResource::TextTrackResource:
+ return ResourceType::Media;
+#endif
+ default:
+ ASSERT_NOT_REACHED();
+ };
+}
+
+uint16_t readResourceType(const String& name)
+{
+ if (name == "document")
+ return static_cast<uint16_t>(ResourceType::Document);
+ if (name == "image")
+ return static_cast<uint16_t>(ResourceType::Image);
+ if (name == "style-sheet")
+ return static_cast<uint16_t>(ResourceType::StyleSheet);
+ if (name == "script")
+ return static_cast<uint16_t>(ResourceType::Script);
+ if (name == "font")
+ return static_cast<uint16_t>(ResourceType::Font);
+ if (name == "raw")
+ return static_cast<uint16_t>(ResourceType::Raw);
+ if (name == "svg-document")
+ return static_cast<uint16_t>(ResourceType::SVGDocument);
+ if (name == "media")
+ return static_cast<uint16_t>(ResourceType::Media);
+ return static_cast<uint16_t>(ResourceType::Invalid);
+}
+
+uint16_t readLoadType(const String& name)
+{
+ if (name == "first-party")
+ return static_cast<uint16_t>(LoadType::FirstParty);
+ if (name == "third-party")
+ return static_cast<uint16_t>(LoadType::ThirdParty);
+ return static_cast<uint16_t>(LoadType::Invalid);
+}
+
+bool ResourceLoadInfo::isThirdParty() const
+{
+ Ref<SecurityOrigin> mainDocumentSecurityOrigin = SecurityOrigin::create(mainDocumentURL);
+ Ref<SecurityOrigin> resourceSecurityOrigin = SecurityOrigin::create(resourceURL);
+
+ return !mainDocumentSecurityOrigin->canAccess(&resourceSecurityOrigin.get());
+}
+
+ResourceFlags ResourceLoadInfo::getResourceFlags() const
+{
+ ResourceFlags flags = 0;
+ ASSERT(type != ResourceType::Invalid);
+ flags |= static_cast<ResourceFlags>(type);
+ flags |= isThirdParty() ? static_cast<ResourceFlags>(LoadType::ThirdParty) : static_cast<ResourceFlags>(LoadType::FirstParty);
+ return flags;
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadInfohfromrev181420trunkSourceWebCorecontentextensionsDFABytecodeInterpreterh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/loader/ResourceLoadInfo.h (from rev 181420, trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h) (0 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoadInfo.h         (rev 0)
+++ trunk/Source/WebCore/loader/ResourceLoadInfo.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+/*
+ * 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 ResourceLoadInfo_h
+#define ResourceLoadInfo_h
+
+#include "CachedResource.h"
+#include "URL.h"
+
+namespace WebCore {
+
+enum class ResourceType : uint16_t {
+ Invalid = 0x0000,
+ Document = 0x0001,
+ Image = 0x0002,
+ StyleSheet = 0x0004,
+ Script = 0x0008,
+ Font = 0x0010,
+ Raw = 0x0020,
+ SVGDocument = 0x0040,
+ Media = 0x0080,
+};
+
+enum class LoadType : uint16_t {
+ Invalid = 0x0000,
+ FirstParty = 0x0100,
+ ThirdParty = 0x0200,
+};
+
+typedef uint16_t ResourceFlags;
+
+ResourceType toResourceType(CachedResource::Type);
+uint16_t readResourceType(const String&);
+uint16_t readLoadType(const String&);
+
+struct ResourceLoadInfo {
+ URL resourceURL;
+ URL mainDocumentURL;
+ ResourceType type;
+
+ bool isThirdParty() const;
+ ResourceFlags getResourceFlags() const;
+};
+
+
+} // namespace WebCore
+
+#endif // ResourceLoadInfo_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -58,6 +58,7 @@
</span><span class="cx"> #include "PingLoader.h"
</span><span class="cx"> #include "PlatformStrategies.h"
</span><span class="cx"> #include "RenderElement.h"
</span><ins>+#include "ResourceLoadInfo.h"
</ins><span class="cx"> #include "ResourceLoadScheduler.h"
</span><span class="cx"> #include "ScriptController.h"
</span><span class="cx"> #include "SecurityOrigin.h"
</span><span class="lines">@@ -507,8 +508,14 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> Vector<ContentExtensions::Action> actions;
</span><span class="cx">
</span><del>- if (frame() && frame()->page() && frame()->page()->userContentController())
- actions = frame()->page()->userContentController()->actionsForURL(url);
</del><ins>+ URL mainDocumentURL;
+ if (frame() && frame()->mainFrame().document())
+ mainDocumentURL = frame()->mainFrame().document()->url();
+
+ ResourceLoadInfo resourceLoadInfo = { url, mainDocumentURL, toResourceType(type) };
+
+ if (frame() && frame()->mainFrame().page() && frame()->mainFrame().page()->userContentController())
+ actions = frame()->mainFrame().page()->userContentController()->actionsForResourceLoad(resourceLoadInfo);
</ins><span class="cx">
</span><span class="cx"> bool willBlockLoad = false;
</span><span class="cx"> for (const auto& action : actions) {
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/page/UserContentController.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include "Document.h"
</span><span class="cx"> #include "MainFrame.h"
</span><span class="cx"> #include "Page.h"
</span><ins>+#include "ResourceLoadInfo.h"
</ins><span class="cx"> #include "UserScript.h"
</span><span class="cx"> #include "UserStyleSheet.h"
</span><span class="cx">
</span><span class="lines">@@ -203,12 +204,12 @@
</span><span class="cx"> m_contentExtensionBackend->removeAllContentExtensions();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Vector<ContentExtensions::Action> UserContentController::actionsForURL(const URL& url)
</del><ins>+Vector<ContentExtensions::Action> UserContentController::actionsForResourceLoad(const ResourceLoadInfo& resourceLoadInfo)
</ins><span class="cx"> {
</span><span class="cx"> if (!m_contentExtensionBackend)
</span><span class="cx"> return Vector<ContentExtensions::Action>();
</span><span class="cx">
</span><del>- return m_contentExtensionBackend->actionsForURL(url);
</del><ins>+ return m_contentExtensionBackend->actionsForResourceLoad(resourceLoadInfo);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.h (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.h        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Source/WebCore/page/UserContentController.h        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> class UserScript;
</span><span class="cx"> class UserStyleSheet;
</span><span class="cx"> class UserMessageHandlerDescriptor;
</span><ins>+struct ResourceLoadInfo;
</ins><span class="cx">
</span><span class="cx"> namespace ContentExtensions {
</span><span class="cx"> class CompiledContentExtension;
</span><span class="lines">@@ -85,8 +86,7 @@
</span><span class="cx"> WEBCORE_EXPORT void removeUserContentExtension(const String& name);
</span><span class="cx"> WEBCORE_EXPORT void removeAllUserContentExtensions();
</span><span class="cx">
</span><del>- // FIXME: Consider putting this (and other future content extension predicates) in its own class.
- Vector<ContentExtensions::Action> actionsForURL(const URL&);
</del><ins>+ Vector<ContentExtensions::Action> actionsForResourceLoad(const ResourceLoadInfo&);
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Tools/ChangeLog        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2015-03-11 Alex Christensen <achristensen@webkit.org>
+
+ [Content Extensions] Add resource type and load type triggers.
+ https://bugs.webkit.org/show_bug.cgi?id=142422
+
+ Reviewed by Benjamin Poulain.
+
+ * TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
+ (TestWebKitAPI::testRequest):
+ (TestWebKitAPI::mainDocumentRequest):
+ (TestWebKitAPI::TEST_F):
+ (TestWebKitAPI::testURL): Deleted.
+
</ins><span class="cx"> 2015-03-10 Sam Weinig <sam@webkit.org>
</span><span class="cx">
</span><span class="cx"> Allow adding a button in input elements for auto fill related functionality
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreContentExtensionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp (181420 => 181421)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp        2015-03-12 00:38:04 UTC (rev 181420)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp        2015-03-12 01:03:43 UTC (rev 181421)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include <JavaScriptCore/InitializeThreading.h>
</span><span class="cx"> #include <WebCore/ContentExtensionCompiler.h>
</span><span class="cx"> #include <WebCore/ContentExtensionsBackend.h>
</span><ins>+#include <WebCore/ResourceLoadInfo.h>
</ins><span class="cx"> #include <WebCore/URL.h>
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx"> #include <wtf/RunLoop.h>
</span><span class="lines">@@ -92,9 +93,9 @@
</span><span class="cx"> ContentExtensions::CompiledContentExtensionData m_data;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-void static testURL(ContentExtensions::ContentExtensionsBackend contentExtensionsBackend, const URL& url, Vector<ContentExtensions::ActionType> expectedActions)
</del><ins>+void static testRequest(ContentExtensions::ContentExtensionsBackend contentExtensionsBackend, const ResourceLoadInfo& resourceLoadInfo, Vector<ContentExtensions::ActionType> expectedActions)
</ins><span class="cx"> {
</span><del>- auto actions = contentExtensionsBackend.actionsForURL(url);
</del><ins>+ auto actions = contentExtensionsBackend.actionsForResourceLoad(resourceLoadInfo);
</ins><span class="cx"> EXPECT_EQ(expectedActions.size(), actions.size());
</span><span class="cx"> if (expectedActions.size() != actions.size())
</span><span class="cx"> return;
</span><span class="lines">@@ -103,6 +104,11 @@
</span><span class="cx"> EXPECT_EQ(expectedActions[i], actions[i].type());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ResourceLoadInfo mainDocumentRequest(const char* url, ResourceType resourceType = ResourceType::Document)
+{
+ return { URL(URL(), url), URL(URL(), url), resourceType };
+}
+
</ins><span class="cx"> const char* basicFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*webkit.org\"}}]";
</span><span class="cx">
</span><span class="cx"> TEST_F(ContentExtensionTest, Basic)
</span><span class="lines">@@ -113,7 +119,7 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("testFilter", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(ParsedURLString, "http://webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char* patternsStartingWithGroupFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"(http://whatwg\\\\.org/)?webkit\134\134.org\"}}]";
</span><span class="lines">@@ -126,11 +132,11 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("PatternNestedGroupsFilter", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://whatwg.org/webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://whatwg.org/webkit.org"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/"), { });
- testURL(backend, URL(URL(), "http://whatwg.org/"), { });
- testURL(backend, URL(URL(), "http://whatwg.org"), { });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://whatwg.org/webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://whatwg.org/webkit.org"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/"), { });
+ testRequest(backend, mainDocumentRequest("http://whatwg.org/"), { });
+ testRequest(backend, mainDocumentRequest("http://whatwg.org"), { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char* patternNestedGroupsFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"http://webkit\\\\.org/(foo(bar)*)+\"}}]";
</span><span class="lines">@@ -143,18 +149,17 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("PatternNestedGroupsFilter", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://webkit.org/foo"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobarbar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foofoobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foob"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foor"), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/foo"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarbar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foofoobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foob"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foor"), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx">
</span><del>-
- testURL(backend, URL(URL(), "http://webkit.org/"), { });
- testURL(backend, URL(URL(), "http://webkit.org/bar"), { });
- testURL(backend, URL(URL(), "http://webkit.org/fobar"), { });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/"), { });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/bar"), { });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/fobar"), { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char* matchPastEndOfStringFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".+\"}}]";
</span><span class="lines">@@ -167,14 +172,14 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("MatchPastEndOfString", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foo"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobarbar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foofoobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foob"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "http://webkit.org/foor"), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foo"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarbar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foofoobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foob"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foor"), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char* startOfLineAssertionFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"^foobar\"}}]";
</span><span class="lines">@@ -187,14 +192,14 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("StartOfLineAssertion", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(URL(), "foobar://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "foobars:///foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "foobarfoobar:///foobarfoobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+ testRequest(backend, mainDocumentRequest("foobar://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("foobars:///foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("foobarfoobar:///foobarfoobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://webkit.org/foobarfoo"), { });
- testURL(backend, URL(URL(), "http://webkit.org/foobarf"), { });
- testURL(backend, URL(URL(), "http://foobar.org/"), { });
- testURL(backend, URL(URL(), "http://foobar.org/"), { });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarfoo"), { });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarf"), { });
+ testRequest(backend, mainDocumentRequest("http://foobar.org/"), { });
+ testRequest(backend, mainDocumentRequest("http://foobar.org/"), { });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char* endOfLineAssertionFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*foobar$\"}}]";
</span><span class="lines">@@ -207,12 +212,57 @@
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx"> backend.addContentExtension("EndOfLineAssertion", extension);
</span><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "file:///foobar"), { ContentExtensions::ActionType::BlockLoad });
- testURL(backend, URL(URL(), "file:///foobarfoobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("file:///foobar"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("file:///foobarfoobarfoobar"), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx">
</span><del>- testURL(backend, URL(URL(), "http://webkit.org/foobarfoo"), { });
- testURL(backend, URL(URL(), "http://webkit.org/foobarf"), { });
</del><ins>+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarfoo"), { });
+ testRequest(backend, mainDocumentRequest("http://webkit.org/foobarf"), { });
</ins><span class="cx"> }
</span><ins>+
+const char* loadTypeFilter = "[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*webkit.org\",\"load-type\":[\"third-party\"]}},"
+ "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*whatwg.org\",\"load-type\":[\"first-party\"]}},"
+ "{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\".*alwaysblock.pdf\"}}]";
</ins><span class="cx">
</span><ins>+TEST_F(ContentExtensionTest, LoadType)
+{
+ auto extensionData = ContentExtensions::compileRuleList(loadTypeFilter);
+ auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+
+ ContentExtensions::ContentExtensionsBackend backend;
+ backend.addContentExtension("LoadTypeFilter", extension);
+
+ testRequest(backend, mainDocumentRequest("http://webkit.org"), { });
+ testRequest(backend, {URL(URL(), "http://webkit.org"), URL(URL(), "http://not_webkit.org"), ResourceType::Document}, { ContentExtensions::ActionType::BlockLoad });
+
+ testRequest(backend, mainDocumentRequest("http://whatwg.org"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, {URL(URL(), "http://whatwg.org"), URL(URL(), "http://not_whatwg.org"), ResourceType::Document}, { });
+
+ testRequest(backend, mainDocumentRequest("http://foobar.org/alwaysblock.pdf"), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, {URL(URL(), "http://foobar.org/alwaysblock.pdf"), URL(URL(), "http://not_foobar.org/alwaysblock.pdf"), ResourceType::Document}, { ContentExtensions::ActionType::BlockLoad });
+}
+
+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\"]}}]";
+
+TEST_F(ContentExtensionTest, ResourceType)
+{
+ auto extensionData = ContentExtensions::compileRuleList(resourceTypeFilter);
+ auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+
+ ContentExtensions::ContentExtensionsBackend backend;
+ backend.addContentExtension("ResourceTypeFilter", extension);
+
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Document), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Image), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::StyleSheet), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Script), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Font), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Raw), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::SVGDocument), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_all_types.org", ResourceType::Media), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_only_images.org", ResourceType::Image), { ContentExtensions::ActionType::BlockLoad });
+ testRequest(backend, mainDocumentRequest("http://block_only_images.org", ResourceType::Document), { });
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>
</body>
</html>