https://bugs.webkit.org/show_bug.cgi?id=169667
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Oct 2019 08:20:34 +0000 (08:20 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Oct 2019 08:20:34 +0000 (08:20 +0000)
URL: protocol setter needs to be more restrictive around file

Patch by Rob Buis <rbuis@igalia.com> on 2019-10-22
Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

Update test result.

* web-platform-tests/url/url-setters-expected.txt:

Source/WTF:

Restrict setting protocol to "file" as indictaed in the spec [1].

Test: imported/w3c/web-platform-tests/url/url-setters.html

[1] https://url.spec.whatwg.org/#scheme-state steps 2.1.3 and 2.1.4.

* wtf/URL.cpp:
(WTF::URL::setProtocol):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251422 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/url/url-setters-expected.txt
Source/WTF/ChangeLog
Source/WTF/wtf/URL.cpp

index 056a785..efaa963 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-22  Rob Buis  <rbuis@igalia.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=169667
+        URL: protocol setter needs to be more restrictive around file
+
+        Reviewed by Alex Christensen.
+
+        Update test result.
+
+        * web-platform-tests/url/url-setters-expected.txt:
+
 2019-10-21  Myles C. Maxfield  <mmaxfield@apple.com>
 
         Update Web Platform Test css/css-lists/content-property/marker-text-matches-armenian.html
index 5e0b699..eb8744f 100644 (file)
@@ -31,23 +31,23 @@ PASS URL: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected
 PASS <a>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected 
 PASS <area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected 
 PASS URL: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file 
-FAIL <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file assert_equals: expected "http://test@example.net/" but got "file://test@example.net/"
-FAIL <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file assert_equals: expected "http://test@example.net/" but got "file://test@example.net/"
-FAIL URL: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "file://example.net:1234/"
-FAIL <a>: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "file://example.net:1234/"
-FAIL <area>: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "file://example.net:1234/"
+PASS <a>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file 
+PASS <area>: Setting <http://test@example.net>.protocol = 'file' Can’t switch from URL containing username/password/port to file 
+FAIL URL: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "gopher://example.net:1234"
+FAIL <a>: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "gopher://example.net:1234"
+FAIL <area>: Setting <gopher://example.net:1234>.protocol = 'file' assert_equals: expected "gopher://example.net:1234/" but got "gopher://example.net:1234"
 PASS URL: Setting <wss://x:x@example.net:1234>.protocol = 'file' 
-FAIL <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file' assert_equals: expected "wss://x:x@example.net:1234/" but got "file://x:x@example.net:1234/"
-FAIL <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file' assert_equals: expected "wss://x:x@example.net:1234/" but got "file://x:x@example.net:1234/"
+PASS <a>: Setting <wss://x:x@example.net:1234>.protocol = 'file' 
+PASS <area>: Setting <wss://x:x@example.net:1234>.protocol = 'file' 
 PASS URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host 
-FAIL <a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http:///"
-FAIL <area>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http:///"
-FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
-FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
-FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+PASS <a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host 
+PASS <area>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host 
+PASS URL: Setting <file:///test>.protocol = 'gopher' 
+PASS <a>: Setting <file:///test>.protocol = 'gopher' 
+PASS <area>: Setting <file:///test>.protocol = 'gopher' 
 PASS URL: Setting <file:>.protocol = 'wss' 
-FAIL <a>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:///"
-FAIL <area>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:///"
+PASS <a>: Setting <file:>.protocol = 'wss' 
+PASS <area>: Setting <file:>.protocol = 'wss' 
 FAIL URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
 FAIL <a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
 FAIL <area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special assert_equals: expected "http://example.net/" but got "b://example.net/"
@@ -70,8 +70,8 @@ FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expe
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
 PASS URL: Setting <ssh://me@example.net>.protocol = 'file' 
-FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me@example.net"
-FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me@example.net"
+PASS <a>: Setting <ssh://me@example.net>.protocol = 'file' 
+PASS <area>: Setting <ssh://me@example.net>.protocol = 'file' 
 FAIL URL: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
 FAIL <a>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
 FAIL <area>: Setting <ssh://example.net>.protocol = 'file' assert_equals: expected "ssh://example.net" but got "file://example.net/"
index 10252f0..20dc622 100644 (file)
@@ -1,3 +1,19 @@
+2019-10-22  Rob Buis  <rbuis@igalia.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=169667
+        URL: protocol setter needs to be more restrictive around file
+
+        Reviewed by Alex Christensen.
+
+        Restrict setting protocol to "file" as indictaed in the spec [1].
+
+        Test: imported/w3c/web-platform-tests/url/url-setters.html
+
+        [1] https://url.spec.whatwg.org/#scheme-state steps 2.1.3 and 2.1.4.
+
+        * wtf/URL.cpp:
+        (WTF::URL::setProtocol):
+
 2019-10-21  Tim Horton  <timothy_horton@apple.com>
 
         macCatalyst: Swipe navigation gestures do not work
index ef23dcb..5f4f3f1 100644 (file)
@@ -378,6 +378,12 @@ bool URL::setProtocol(const String& s)
         return true;
     }
 
+    if ((m_passwordEnd != m_userStart || port()) && *canonicalized == "file")
+        return true;
+
+    if (isLocalFile() && host().isEmpty())
+        return true;
+
     URLParser parser(makeString(*canonicalized, m_string.substring(m_schemeEnd)));
     *this = parser.result();
     return true;