Patch for landing
authorrwlbuis@webkit.org <rwlbuis@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Oct 2018 16:17:36 +0000 (16:17 +0000)
committerrwlbuis@webkit.org <rwlbuis@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Oct 2018 16:17:36 +0000 (16:17 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@236663 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/xhr/overridemimetype-invalid-mime-type-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/platform/network/ParsedContentType.cpp
Source/WebCore/xml/XMLHttpRequest.cpp

index 8ef9865..7ff8367 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-01  Rob Buis  <rbuis@igalia.com>
+
+        Align XMLHttpRequest's overrideMimeType() with the standard
+        https://bugs.webkit.org/show_bug.cgi?id=169276
+
+        Reviewed by Chris Dumez.
+
+        * web-platform-tests/xhr/overridemimetype-invalid-mime-type-expected.txt:
+
 2018-10-01  Chris Dumez  <cdumez@apple.com>
 
         Make crossOriginObject.then undefined for promises
index 5758656..b8d71d2 100644 (file)
@@ -1,5 +1,5 @@
 
 PASS Bogus MIME type does not override encoding 
-FAIL Bogus MIME type does not override encoding, 2 assert_equals: expected "ΓΏ" but got "\x1a"
+PASS Bogus MIME type does not override encoding, 2 
 PASS Bogus MIME type does override MIME type 
 
index c57ba63..05400da 100644 (file)
@@ -1,3 +1,29 @@
+2018-10-01  Rob Buis  <rbuis@igalia.com>
+
+        Align XMLHttpRequest's overrideMimeType() with the standard
+        https://bugs.webkit.org/show_bug.cgi?id=169276
+
+        Reviewed by Chris Dumez.
+
+        Implement the overrideMimeType() as specified in that standard, i.e.
+        add a check that the passed mime type is valid and if not fallback
+        to application/octet-stream.
+
+        In order for this patch to have any effect, I went ahead and
+        made an improvement to the ContentType parsing, parseContentType now
+        will reject mime types that do not match the type / subtype format, I
+        believe this is required by both RFC2045 and mimesniff specs.
+
+        This behavior matches Chrome and Firefox.
+
+        Test: web-platform-tests/xhr/overridemimetype-invalid-mime-type.htm
+
+        * platform/network/ParsedContentType.cpp:
+        (WebCore::parseContentType):
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::overrideMimeType):
+
+
 2018-10-01  Chris Dumez  <cdumez@apple.com>
 
         Make crossOriginObject.then undefined for promises
index 2d553f8..8b78297 100644 (file)
@@ -160,14 +160,32 @@ bool parseContentType(const String& contentType, ReceiverType& receiver)
         return false;
     }
 
+    unsigned contentTypeStart = index;
+    auto typeRange = parseToken(contentType, index);
+    if (!typeRange.second) {
+        LOG_ERROR("Invalid Content-Type, invalid type value.");
+        return false;
+    }
+
+    if (contentType[index++] != '/') {
+        LOG_ERROR("Invalid Content-Type, missing '/'.");
+        return false;
+    }
+
+    auto subTypeRange = parseToken(contentType, index);
+    if (!subTypeRange.second) {
+        LOG_ERROR("Invalid Content-Type, invalid subtype value.");
+        return false;
+    }
+
     // There should not be any quoted strings until we reach the parameters.
-    size_t semiColonIndex = contentType.find(';', index);
+    size_t semiColonIndex = contentType.find(';', contentTypeStart);
     if (semiColonIndex == notFound) {
-        receiver.setContentType(SubstringRange(index, contentTypeLength - index));
+        receiver.setContentType(SubstringRange(contentTypeStart, contentTypeLength - contentTypeStart));
         return true;
     }
 
-    receiver.setContentType(SubstringRange(index, semiColonIndex - index));
+    receiver.setContentType(SubstringRange(contentTypeStart, semiColonIndex - contentTypeStart));
     index = semiColonIndex + 1;
     while (true) {
         skipSpaces(contentType, index);
index 4510d21..900fa7d 100644 (file)
@@ -776,12 +776,15 @@ void XMLHttpRequest::dropProtection()
     unsetPendingActivity(this);
 }
 
-ExceptionOr<void> XMLHttpRequest::overrideMimeType(const String& override)
+ExceptionOr<void> XMLHttpRequest::overrideMimeType(const String& mimeType)
 {
     if (readyState() == LOADING || readyState() == DONE)
         return Exception { InvalidStateError };
 
-    m_mimeTypeOverride = override;
+    m_mimeTypeOverride = "application/octet-stream"_s;
+    if (isValidContentType(mimeType))
+        m_mimeTypeOverride = mimeType;
+
     return { };
 }