Title: [185973] trunk
Revision
185973
Author
achristen...@apple.com
Date
2015-06-25 17:57:25 -0700 (Thu, 25 Jun 2015)

Log Message

[Content Extensions] Add a way to match a domain but not subdomains
https://bugs.webkit.org/show_bug.cgi?id=146241
rdar://problem/21557754

Reviewed by Darin Adler.

Source/WebCore:

This patch makes it possible to have a trigger with an if-domain apply to sub2.sub1.webkit.org
but not sub1.webkit.org by making the domains default to only applying to the domain and not subdomains.
To make a domain apply to a domain and any subdomains, the domain must begin with a '*'.

* contentextensions/CombinedURLFilters.cpp:
(WebCore::ContentExtensions::CombinedURLFilters::addDomain):
(WebCore::ContentExtensions::CombinedURLFilters::addPattern):
Make domains apply only to the exact domain unless there is a * at the beginning,
in which case they apply to the domain and any subdomains.

Tools:

* TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
(TestWebKitAPI::TEST_F):
Update subdomain test because of changed behavior and add test for new '*' functionality.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (185972 => 185973)


--- trunk/Source/WebCore/ChangeLog	2015-06-26 00:29:58 UTC (rev 185972)
+++ trunk/Source/WebCore/ChangeLog	2015-06-26 00:57:25 UTC (rev 185973)
@@ -1,3 +1,21 @@
+2015-06-25  Alex Christensen  <achristen...@webkit.org>
+
+        [Content Extensions] Add a way to match a domain but not subdomains
+        https://bugs.webkit.org/show_bug.cgi?id=146241
+        rdar://problem/21557754
+
+        Reviewed by Darin Adler.
+
+        This patch makes it possible to have a trigger with an if-domain apply to sub2.sub1.webkit.org
+        but not sub1.webkit.org by making the domains default to only applying to the domain and not subdomains.
+        To make a domain apply to a domain and any subdomains, the domain must begin with a '*'.
+
+        * contentextensions/CombinedURLFilters.cpp:
+        (WebCore::ContentExtensions::CombinedURLFilters::addDomain):
+        (WebCore::ContentExtensions::CombinedURLFilters::addPattern):
+        Make domains apply only to the exact domain unless there is a * at the beginning,
+        in which case they apply to the domain and any subdomains.
+
 2015-06-25  Simon Fraser  <simon.fra...@apple.com>
 
         [iOS WK2] Swiping back just after scrolling can cause some tiles to disappear

Modified: trunk/Source/WebCore/contentextensions/CombinedURLFilters.cpp (185972 => 185973)


--- trunk/Source/WebCore/contentextensions/CombinedURLFilters.cpp	2015-06-26 00:29:58 UTC (rev 185972)
+++ trunk/Source/WebCore/contentextensions/CombinedURLFilters.cpp	2015-06-26 00:57:25 UTC (rev 185973)
@@ -122,31 +122,44 @@
 
 void CombinedURLFilters::addDomain(uint64_t actionId, const String& domain)
 {
-    // This is like adding (.|^)domain$ by adding two Vector<Term>'s,
-    // but interpreting domain as a series of characters, not a regular _expression_.
-    // This way a domain of "webkit.org" will match "bugs.webkit.org" and "webkit.org".
-    // FIXME: Add support for matching only subdomains or no subdomains.
-    Vector<Term> prependDot;
-    Vector<Term> prependBeginningOfLine;
-    prependDot.reserveInitialCapacity(domain.length() + 3);
-    prependBeginningOfLine.reserveInitialCapacity(domain.length() + 1); // This is just no .* at the beginning.
-    
-    Term canonicalDotStar(Term::UniversalTransition);
-    canonicalDotStar.quantify(AtomQuantifier::ZeroOrMore);
-    prependDot.uncheckedAppend(canonicalDotStar);
-    prependDot.uncheckedAppend(Term('.', true));
-    
-    for (unsigned i = 0; i < domain.length(); i++) {
-        ASSERT(isASCII(domain[i]));
-        ASSERT(!isASCIIUpper(domain[i]));
-        prependDot.uncheckedAppend(Term(domain[i], true));
-        prependBeginningOfLine.uncheckedAppend(Term(domain[i], true));
+    unsigned domainLength = domain.length();
+    if (domainLength && domain[0] == '*') {
+        // If domain starts with a '*' then it means match domain and its subdomains, like (^|.)domain$
+        // This way a domain of "*webkit.org" will match "bugs.webkit.org" and "webkit.org".
+        Vector<Term> prependDot;
+        Vector<Term> prependBeginningOfLine;
+        prependDot.reserveInitialCapacity(domainLength + 2);
+        prependBeginningOfLine.reserveInitialCapacity(domainLength); // This is just no .* at the beginning.
+        
+        Term canonicalDotStar(Term::UniversalTransition);
+        canonicalDotStar.quantify(AtomQuantifier::ZeroOrMore);
+        prependDot.uncheckedAppend(canonicalDotStar);
+        prependDot.uncheckedAppend(Term('.', true));
+        
+        for (unsigned i = 1; i < domainLength; i++) {
+            ASSERT(isASCII(domain[i]));
+            ASSERT(!isASCIIUpper(domain[i]));
+            prependDot.uncheckedAppend(Term(domain[i], true));
+            prependBeginningOfLine.uncheckedAppend(Term(domain[i], true));
+        }
+        prependDot.uncheckedAppend(Term::EndOfLineAssertionTerm);
+        prependBeginningOfLine.uncheckedAppend(Term::EndOfLineAssertionTerm);
+        
+        addPattern(actionId, prependDot);
+        addPattern(actionId, prependBeginningOfLine);
+    } else {
+        // This is like adding ^domain$, but interpreting domain as a series of characters, not a regular _expression_.
+        // "webkit.org" will match "webkit.org" but not "bugs.webkit.org".
+        Vector<Term> prependBeginningOfLine;
+        prependBeginningOfLine.reserveInitialCapacity(domainLength + 1); // This is just no .* at the beginning.
+        for (unsigned i = 0; i < domainLength; i++) {
+            ASSERT(isASCII(domain[i]));
+            ASSERT(!isASCIIUpper(domain[i]));
+            prependBeginningOfLine.uncheckedAppend(Term(domain[i], true));
+        }
+        prependBeginningOfLine.uncheckedAppend(Term::EndOfLineAssertionTerm);
+        addPattern(actionId, prependBeginningOfLine);
     }
-    prependDot.uncheckedAppend(Term::EndOfLineAssertionTerm);
-    prependBeginningOfLine.uncheckedAppend(Term::EndOfLineAssertionTerm);
-    
-    addPattern(actionId, prependDot);
-    addPattern(actionId, prependBeginningOfLine);
 }
 
 void CombinedURLFilters::addPattern(uint64_t actionId, const Vector<Term>& pattern)

Modified: trunk/Tools/ChangeLog (185972 => 185973)


--- trunk/Tools/ChangeLog	2015-06-26 00:29:58 UTC (rev 185972)
+++ trunk/Tools/ChangeLog	2015-06-26 00:57:25 UTC (rev 185973)
@@ -1,3 +1,15 @@
+2015-06-25  Alex Christensen  <achristen...@webkit.org>
+
+        [Content Extensions] Add a way to match a domain but not subdomains
+        https://bugs.webkit.org/show_bug.cgi?id=146241
+        rdar://problem/21557754
+
+        Reviewed by Darin Adler.
+
+        * TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp:
+        (TestWebKitAPI::TEST_F):
+        Update subdomain test because of changed behavior and add test for new '*' functionality.
+
 2015-06-25  Jaehun Lim  <ljaehun....@samsung.com>
 
         Cleanup ENABLE_CSS3_CONDITIONAL_RULES codes.

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp (185972 => 185973)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp	2015-06-26 00:29:58 UTC (rev 185972)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp	2015-06-26 00:57:25 UTC (rev 185973)
@@ -408,7 +408,8 @@
     testRequest(ifDomainBackend, mainDocumentRequest("http://webkit.org/test.htm"), { });
     testRequest(ifDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.htm"), { });
     testRequest(ifDomainBackend, mainDocumentRequest("http://webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
-    testRequest(ifDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { });
+    testRequest(ifDomainBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { });
     testRequest(ifDomainBackend, mainDocumentRequest("http://not_webkit.org/test.htm"), { });
     testRequest(ifDomainBackend, mainDocumentRequest("http://webkit.organization/test.htm"), { });
     testRequest(ifDomainBackend, mainDocumentRequest("http://not_webkit.org/test.html"), { });
@@ -418,12 +419,59 @@
     testRequest(unlessDomainBackend, mainDocumentRequest("http://webkit.org/test.htm"), { });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.htm"), { });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://webkit.org/test.html"), { });
-    testRequest(unlessDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { });
+    testRequest(unlessDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessDomainBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://not_webkit.org/test.htm"), { });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://webkit.organization/test.htm"), { });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://not_webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
     testRequest(unlessDomainBackend, mainDocumentRequest("http://webkit.organization/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    
+    auto ifDomainStarBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"if-domain\":[\"*webkit.org\"]}}]");
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://webkit.org/test.htm"), { });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.htm"), { });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://not_webkit.org/test.htm"), { });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://webkit.organization/test.htm"), { });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://not_webkit.org/test.html"), { });
+    testRequest(ifDomainStarBackend, mainDocumentRequest("http://webkit.organization/test.html"), { });
+    
+    auto unlessDomainStarBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"unless-domain\":[\"*webkit.org\"]}}]");
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://webkit.org/test.htm"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.htm"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://webkit.org/test.html"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://not_webkit.org/test.htm"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://webkit.organization/test.htm"), { });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://not_webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessDomainStarBackend, mainDocumentRequest("http://webkit.organization/test.html"), { ContentExtensions::ActionType::BlockLoad });
 
+    auto ifSubDomainBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"if-domain\":[\"sub1.webkit.org\"]}}]");
+    testRequest(ifSubDomainBackend, mainDocumentRequest("http://webkit.org/test.html"), { });
+    testRequest(ifSubDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { });
+    testRequest(ifSubDomainBackend, mainDocumentRequest("http://sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifSubDomainBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { });
+
+    auto ifSubDomainStarBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"if-domain\":[\"*sub1.webkit.org\"]}}]");
+    testRequest(ifSubDomainStarBackend, mainDocumentRequest("http://webkit.org/test.html"), { });
+    testRequest(ifSubDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { });
+    testRequest(ifSubDomainStarBackend, mainDocumentRequest("http://sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(ifSubDomainStarBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+
+    auto unlessSubDomainBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"unless-domain\":[\"sub1.webkit.org\"]}}]");
+    testRequest(unlessSubDomainBackend, mainDocumentRequest("http://webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessSubDomainBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessSubDomainBackend, mainDocumentRequest("http://sub1.webkit.org/test.html"), { });
+    testRequest(unlessSubDomainBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    
+    auto unlessSubDomainStarBackend = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test\\\\.html\", \"unless-domain\":[\"*sub1.webkit.org\"]}}]");
+    testRequest(unlessSubDomainStarBackend, mainDocumentRequest("http://webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessSubDomainStarBackend, mainDocumentRequest("http://bugs.webkit.org/test.html"), { ContentExtensions::ActionType::BlockLoad });
+    testRequest(unlessSubDomainStarBackend, mainDocumentRequest("http://sub1.webkit.org/test.html"), { });
+    testRequest(unlessSubDomainStarBackend, mainDocumentRequest("http://sub2.sub1.webkit.org/test.html"), { });
+
     auto combinedBackend1 = makeBackend("[{\"action\":{\"type\":\"block\"},\"trigger\":{\"url-filter\":\"test_block_load\", \"if-domain\":[\"webkit.org\"]}},"
         "{\"action\":{\"type\":\"block-cookies\"},\"trigger\":{\"url-filter\":\"test_block_cookies\", \"unless-domain\":[\"webkit.org\"]}}]");
     testRequest(combinedBackend1, mainDocumentRequest("http://webkit.org"), { });
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to