<!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 &lt;achristensen@webkit.org&gt; 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  &lt;achristensen@webkit.org&gt;
+
+        [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  &lt;timothy_horton@apple.com&gt;
</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 = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51EAC5B018163F4E004F1BA4 /* IDBRecordIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBRecordIdentifier.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51EC925D0CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCustomSQLStatementErrorCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                51EE7B371AA50B0500F92B21 /* ResourceLoadInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51EE7B391AA5123100F92B21 /* ResourceLoadInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceLoadInfo.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 51F6A3D50663BF04004D2919 /* HTMLCanvasElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLCanvasElement.cpp; sourceTree = &quot;&lt;group&gt;&quot;; 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 = &quot;&lt;group&gt;&quot;; tabWidth = 8; usesTabs = 0; };
</span><span class="cx">                 51FB5502113E3E9100821176 /* JSCloseEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCloseEvent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</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&amp; 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&lt;uint64_t&gt;(trigger.flags) &lt;&lt; 32) | static_cast&lt;uint64_t&gt;(actionLocations[ruleIndex]));
</ins><span class="cx"> 
</span><span class="cx">         if (!error.isNull()) {
</span><span class="cx">             dataLogF(&quot;Error while parsing %s: %s\n&quot;, 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&amp; exec, const JSValue&amp; typeValue, ResourceFlags&amp; flags, uint16_t(*stringToType)(const String&amp;))
+{
+    if (!typeValue.isObject())
+        return true;
+
+    JSObject* object = typeValue.toObject(&amp;exec);
+    if (!isJSArray(object)) {
+        WTFLogAlways(&quot;Invalid trigger flags array&quot;);
+        return false;
+    }
+
+    JSArray* array = jsCast&lt;JSArray*&gt;(object);
+    
+    unsigned length = array-&gt;length();
+    for (unsigned i = 0; i &lt; length; ++i) {
+        JSValue value = array-&gt;getIndex(&amp;exec, i);
+        if (exec.hadException() || !value) {
+            WTFLogAlways(&quot;Invalid object in the trigger flags array.&quot;);
+            continue;
+        }
+        
+        String name = value.toWTFString(&amp;exec);
+        uint16_t type = stringToType(name);
+        if (!type) {
+            WTFLogAlways(&quot;Invalid string in the trigger flags array.&quot;);
+            continue;
+        }
+        flags |= type;
+    }
+    return true;
+}
+    
</ins><span class="cx"> static bool loadTrigger(ExecState&amp; exec, JSObject&amp; ruleObject, Trigger&amp; trigger)
</span><span class="cx"> {
</span><span class="cx">     JSValue triggerObject = ruleObject.get(&amp;exec, Identifier(&amp;exec, &quot;trigger&quot;));
</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(&amp;exec, Identifier(&amp;exec, &quot;url-filter-is-case-sensitive&quot;));
-    if (urlFilterCaseObject &amp;&amp; !exec.hadException() &amp;&amp; urlFilterCaseObject.isBoolean())
-        trigger.urlFilterIsCaseSensitive = urlFilterCaseObject.toBoolean(&amp;exec);
</del><ins>+    JSValue urlFilterCaseValue = triggerObject.get(&amp;exec, Identifier(&amp;exec, &quot;url-filter-is-case-sensitive&quot;));
+    if (urlFilterCaseValue &amp;&amp; !exec.hadException() &amp;&amp; urlFilterCaseValue.isBoolean())
+        trigger.urlFilterIsCaseSensitive = urlFilterCaseValue.toBoolean(&amp;exec);
</ins><span class="cx"> 
</span><ins>+    JSValue resourceTypeValue = triggerObject.get(&amp;exec, Identifier(&amp;exec, &quot;resource-type&quot;));
+    if (resourceTypeValue &amp;&amp; !exec.hadException() &amp;&amp; !getTypeFlags(exec, resourceTypeValue, trigger.flags, readResourceType))
+        return false;
+    
+    JSValue loadTypeValue = triggerObject.get(&amp;exec, Identifier(&amp;exec, &quot;load-type&quot;));
+    if (loadTypeValue &amp;&amp; !exec.hadException() &amp;&amp; !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 &quot;ContentExtensionActions.h&quot;
</span><ins>+#include &quot;ResourceLoadInfo.h&quot;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</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 &quot;CompiledContentExtension.h&quot;
</span><span class="cx"> #include &quot;DFABytecodeInterpreter.h&quot;
</span><ins>+#include &quot;ResourceLoadInfo.h&quot;
</ins><span class="cx"> #include &quot;URL.h&quot;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</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&lt;Action&gt; ContentExtensionsBackend::actionsForURL(const URL&amp; url)
</del><ins>+Vector&lt;Action&gt; ContentExtensionsBackend::actionsForResourceLoad(const ResourceLoadInfo&amp; resourceLoadInfo) const
</ins><span class="cx"> {
</span><del>-    const String&amp; urlString = url.string();
</del><ins>+    const String&amp; urlString = resourceLoadInfo.resourceURL.string();
</ins><span class="cx">     ASSERT_WITH_MESSAGE(urlString.containsOnlyASCII(), &quot;A decoded URL should only contain ASCII characters. The matching algorithm assumes the input is ASCII.&quot;);
</span><span class="cx">     const CString&amp; urlCString = urlString.utf8();
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;Action&gt; finalActions;
</span><ins>+    ResourceFlags flags = resourceLoadInfo.getResourceFlags();
</ins><span class="cx">     for (auto&amp; compiledContentExtension : m_contentExtensions.values()) {
</span><span class="cx">         DFABytecodeInterpreter interpreter(compiledContentExtension-&gt;bytecode(), compiledContentExtension-&gt;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-&gt;actions();
</span><span class="cx">         const unsigned actionsLength = compiledContentExtension-&gt;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&lt;Action&gt; actionsForURL(const URL&amp;);
</del><ins>+    WEBCORE_EXPORT Vector&lt;Action&gt; actionsForResourceLoad(const ResourceLoadInfo&amp;) const;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     HashMap&lt;String, RefPtr&lt;CompiledContentExtension&gt;&gt; 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&lt;unsigned&gt;(m_bytecode, action);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DFABytecodeCompiler::emitTestFlagsAndAppendAction(uint16_t flags, unsigned action)
+{
+    ASSERT(flags);
+    append&lt;DFABytecodeInstruction&gt;(m_bytecode, DFABytecodeInstruction::TestFlagsAndAppendAction);
+    append&lt;uint16_t&gt;(m_bytecode, flags);
+    append&lt;unsigned&gt;(m_bytecode, action);
+}
+
</ins><span class="cx"> void DFABytecodeCompiler::emitJump(unsigned destinationNodeIndex)
</span><span class="cx"> {
</span><span class="cx">     append&lt;DFABytecodeInstruction&gt;(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&lt;unsigned&gt;(action));
</del><ins>+    for (uint64_t action : node.actions) {
+        // High bits are used to store flags. See compileRuleList.
+        if (action &amp; 0xFFFF00000000)
+            emitTestFlagsAndAppendAction(static_cast&lt;uint16_t&gt;(action &gt;&gt; 32), static_cast&lt;unsigned&gt;(action));
+        else
+            emitAppendAction(static_cast&lt;unsigned&gt;(action));
+    }
</ins><span class="cx">     
</span><span class="cx">     for (const auto&amp; 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&lt;const IntType*&gt;(&amp;bytecode[index]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DFABytecodeInterpreter::Actions DFABytecodeInterpreter::interpret(const CString&amp; urlCString)
</del><ins>+DFABytecodeInterpreter::Actions DFABytecodeInterpreter::interpret(const CString&amp; 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 &amp; getBits&lt;uint16_t&gt;(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode)))
+                actions.add(static_cast&lt;uint64_t&gt;(getBits&lt;unsigned&gt;(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&lt;uint64_t, DefaultHash&lt;uint64_t&gt;::Hash, WTF::UnsignedWithZeroKeyHashTraits&lt;uint64_t&gt;&gt; Actions;
</span><span class="cx">     
</span><del>-    Actions interpret(const CString&amp;);
</del><ins>+    Actions interpret(const CString&amp;, 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 &quot;config.h&quot;
+#include &quot;ResourceLoadInfo.h&quot;
+
+#include &quot;ContentExtensionActions.h&quot;
+#include &quot;SecurityOrigin.h&quot;
+
+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&amp; name)
+{
+    if (name == &quot;document&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Document);
+    if (name == &quot;image&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Image);
+    if (name == &quot;style-sheet&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::StyleSheet);
+    if (name == &quot;script&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Script);
+    if (name == &quot;font&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Font);
+    if (name == &quot;raw&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Raw);
+    if (name == &quot;svg-document&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::SVGDocument);
+    if (name == &quot;media&quot;)
+        return static_cast&lt;uint16_t&gt;(ResourceType::Media);
+    return static_cast&lt;uint16_t&gt;(ResourceType::Invalid);
+}
+
+uint16_t readLoadType(const String&amp; name)
+{
+    if (name == &quot;first-party&quot;)
+        return static_cast&lt;uint16_t&gt;(LoadType::FirstParty);
+    if (name == &quot;third-party&quot;)
+        return static_cast&lt;uint16_t&gt;(LoadType::ThirdParty);
+    return static_cast&lt;uint16_t&gt;(LoadType::Invalid);
+}
+
+bool ResourceLoadInfo::isThirdParty() const
+{
+    Ref&lt;SecurityOrigin&gt; mainDocumentSecurityOrigin = SecurityOrigin::create(mainDocumentURL);
+    Ref&lt;SecurityOrigin&gt; resourceSecurityOrigin = SecurityOrigin::create(resourceURL);
+
+    return !mainDocumentSecurityOrigin-&gt;canAccess(&amp;resourceSecurityOrigin.get());
+}
+    
+ResourceFlags ResourceLoadInfo::getResourceFlags() const
+{
+    ResourceFlags flags = 0;
+    ASSERT(type != ResourceType::Invalid);
+    flags |= static_cast&lt;ResourceFlags&gt;(type);
+    flags |= isThirdParty() ? static_cast&lt;ResourceFlags&gt;(LoadType::ThirdParty) : static_cast&lt;ResourceFlags&gt;(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 &quot;CachedResource.h&quot;
+#include &quot;URL.h&quot;
+
+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&amp;);
+uint16_t readLoadType(const String&amp;);
+
+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 &quot;PingLoader.h&quot;
</span><span class="cx"> #include &quot;PlatformStrategies.h&quot;
</span><span class="cx"> #include &quot;RenderElement.h&quot;
</span><ins>+#include &quot;ResourceLoadInfo.h&quot;
</ins><span class="cx"> #include &quot;ResourceLoadScheduler.h&quot;
</span><span class="cx"> #include &quot;ScriptController.h&quot;
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="lines">@@ -507,8 +508,14 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     Vector&lt;ContentExtensions::Action&gt; actions;
</span><span class="cx"> 
</span><del>-    if (frame() &amp;&amp; frame()-&gt;page() &amp;&amp; frame()-&gt;page()-&gt;userContentController())
-        actions = frame()-&gt;page()-&gt;userContentController()-&gt;actionsForURL(url);
</del><ins>+    URL mainDocumentURL;
+    if (frame() &amp;&amp; frame()-&gt;mainFrame().document())
+        mainDocumentURL = frame()-&gt;mainFrame().document()-&gt;url();
+    
+    ResourceLoadInfo resourceLoadInfo = { url, mainDocumentURL, toResourceType(type) };
+    
+    if (frame() &amp;&amp; frame()-&gt;mainFrame().page() &amp;&amp; frame()-&gt;mainFrame().page()-&gt;userContentController())
+        actions = frame()-&gt;mainFrame().page()-&gt;userContentController()-&gt;actionsForResourceLoad(resourceLoadInfo);
</ins><span class="cx"> 
</span><span class="cx">     bool willBlockLoad = false;
</span><span class="cx">     for (const auto&amp; 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 &quot;Document.h&quot;
</span><span class="cx"> #include &quot;MainFrame.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><ins>+#include &quot;ResourceLoadInfo.h&quot;
</ins><span class="cx"> #include &quot;UserScript.h&quot;
</span><span class="cx"> #include &quot;UserStyleSheet.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -203,12 +204,12 @@
</span><span class="cx">     m_contentExtensionBackend-&gt;removeAllContentExtensions();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;ContentExtensions::Action&gt; UserContentController::actionsForURL(const URL&amp; url)
</del><ins>+Vector&lt;ContentExtensions::Action&gt; UserContentController::actionsForResourceLoad(const ResourceLoadInfo&amp; resourceLoadInfo)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_contentExtensionBackend)
</span><span class="cx">         return Vector&lt;ContentExtensions::Action&gt;();
</span><span class="cx"> 
</span><del>-    return m_contentExtensionBackend-&gt;actionsForURL(url);
</del><ins>+    return m_contentExtensionBackend-&gt;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&amp; 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&lt;ContentExtensions::Action&gt; actionsForURL(const URL&amp;);
</del><ins>+    Vector&lt;ContentExtensions::Action&gt; actionsForResourceLoad(const ResourceLoadInfo&amp;);
</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  &lt;achristensen@webkit.org&gt;
+
+        [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  &lt;sam@webkit.org&gt;
</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 &lt;JavaScriptCore/InitializeThreading.h&gt;
</span><span class="cx"> #include &lt;WebCore/ContentExtensionCompiler.h&gt;
</span><span class="cx"> #include &lt;WebCore/ContentExtensionsBackend.h&gt;
</span><ins>+#include &lt;WebCore/ResourceLoadInfo.h&gt;
</ins><span class="cx"> #include &lt;WebCore/URL.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</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&amp; url, Vector&lt;ContentExtensions::ActionType&gt; expectedActions)
</del><ins>+void static testRequest(ContentExtensions::ContentExtensionsBackend contentExtensionsBackend, const ResourceLoadInfo&amp; resourceLoadInfo, Vector&lt;ContentExtensions::ActionType&gt; 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 = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*webkit.org\&quot;}}]&quot;;
</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(&quot;testFilter&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(ParsedURLString, &quot;http://webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* patternsStartingWithGroupFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;(http://whatwg\\\\.org/)?webkit\134\134.org\&quot;}}]&quot;;
</span><span class="lines">@@ -126,11 +132,11 @@
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx">     backend.addContentExtension(&quot;PatternNestedGroupsFilter&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://whatwg.org/webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://whatwg.org/webkit.org&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://whatwg.org/&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://whatwg.org&quot;), { });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://whatwg.org/webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://whatwg.org/webkit.org&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://whatwg.org/&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://whatwg.org&quot;), { });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* patternNestedGroupsFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;http://webkit\\\\.org/(foo(bar)*)+\&quot;}}]&quot;;
</span><span class="lines">@@ -143,18 +149,17 @@
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx">     backend.addContentExtension(&quot;PatternNestedGroupsFilter&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://webkit.org/foo&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarbar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foofoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foob&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foor&quot;), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foo&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarbar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foofoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foob&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foor&quot;), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> 
</span><del>-
-    testURL(backend, URL(URL(), &quot;http://webkit.org/&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/bar&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/fobar&quot;), { });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/bar&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/fobar&quot;), { });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* matchPastEndOfStringFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.+\&quot;}}]&quot;;
</span><span class="lines">@@ -167,14 +172,14 @@
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx">     backend.addContentExtension(&quot;MatchPastEndOfString&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foo&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarbar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foofoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foob&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foor&quot;), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foo&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarbar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foofoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foob&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foor&quot;), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* startOfLineAssertionFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;^foobar\&quot;}}]&quot;;
</span><span class="lines">@@ -187,14 +192,14 @@
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx">     backend.addContentExtension(&quot;StartOfLineAssertion&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;foobar://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;foobars:///foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;foobarfoobar:///foobarfoobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;foobar://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;foobars:///foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;foobarfoobar:///foobarfoobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarfoo&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarf&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://foobar.org/&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://foobar.org/&quot;), { });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarfoo&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarf&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://foobar.org/&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://foobar.org/&quot;), { });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* endOfLineAssertionFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*foobar$\&quot;}}]&quot;;
</span><span class="lines">@@ -207,12 +212,57 @@
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend backend;
</span><span class="cx">     backend.addContentExtension(&quot;EndOfLineAssertion&quot;, extension);
</span><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;file:///foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
-    testURL(backend, URL(URL(), &quot;file:///foobarfoobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;file:///foobar&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;file:///foobarfoobarfoobar&quot;), { ContentExtensions::ActionType::BlockLoad });
</ins><span class="cx"> 
</span><del>-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarfoo&quot;), { });
-    testURL(backend, URL(URL(), &quot;http://webkit.org/foobarf&quot;), { });
</del><ins>+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarfoo&quot;), { });
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org/foobarf&quot;), { });
</ins><span class="cx"> }
</span><ins>+    
+const char* loadTypeFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*webkit.org\&quot;,\&quot;load-type\&quot;:[\&quot;third-party\&quot;]}},&quot;
+    &quot;{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*whatwg.org\&quot;,\&quot;load-type\&quot;:[\&quot;first-party\&quot;]}},&quot;
+    &quot;{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*alwaysblock.pdf\&quot;}}]&quot;;
</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(&quot;LoadTypeFilter&quot;, extension);
+        
+    testRequest(backend, mainDocumentRequest(&quot;http://webkit.org&quot;), { });
+    testRequest(backend, {URL(URL(), &quot;http://webkit.org&quot;), URL(URL(), &quot;http://not_webkit.org&quot;), ResourceType::Document}, { ContentExtensions::ActionType::BlockLoad });
+        
+    testRequest(backend, mainDocumentRequest(&quot;http://whatwg.org&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, {URL(URL(), &quot;http://whatwg.org&quot;), URL(URL(), &quot;http://not_whatwg.org&quot;), ResourceType::Document}, { });
+    
+    testRequest(backend, mainDocumentRequest(&quot;http://foobar.org/alwaysblock.pdf&quot;), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, {URL(URL(), &quot;http://foobar.org/alwaysblock.pdf&quot;), URL(URL(), &quot;http://not_foobar.org/alwaysblock.pdf&quot;), ResourceType::Document}, { ContentExtensions::ActionType::BlockLoad });
+}
+    
+const char* resourceTypeFilter = &quot;[{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*block_all_types.org\&quot;,\&quot;resource-type\&quot;:[\&quot;document\&quot;,\&quot;image\&quot;,\&quot;style-sheet\&quot;,\&quot;script\&quot;,\&quot;font\&quot;,\&quot;raw\&quot;,\&quot;svg-document\&quot;,\&quot;media\&quot;]}},&quot;
+    &quot;{\&quot;action\&quot;:{\&quot;type\&quot;:\&quot;block\&quot;},\&quot;trigger\&quot;:{\&quot;url-filter\&quot;:\&quot;.*block_only_images\&quot;,\&quot;resource-type\&quot;:[\&quot;image\&quot;]}}]&quot;;
+    
+TEST_F(ContentExtensionTest, ResourceType)
+{
+    auto extensionData = ContentExtensions::compileRuleList(resourceTypeFilter);
+    auto extension = InMemoryCompiledContentExtension::create(WTF::move(extensionData));
+        
+    ContentExtensions::ContentExtensionsBackend backend;
+    backend.addContentExtension(&quot;ResourceTypeFilter&quot;, extension);
+
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Document), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Image), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::StyleSheet), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Script), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Font), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Raw), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::SVGDocument), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_all_types.org&quot;, ResourceType::Media), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_only_images.org&quot;, ResourceType::Image), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(backend, mainDocumentRequest(&quot;http://block_only_images.org&quot;, ResourceType::Document), { });
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>

</body>
</html>