Title: [110361] trunk/Source/WebCore
Revision
110361
Author
[email protected]
Date
2012-03-09 18:55:55 -0800 (Fri, 09 Mar 2012)

Log Message

BlackBerry PlayBook doesn't sniff mime types
https://bugs.webkit.org/show_bug.cgi?id=73869

Patch by Tyler Abbott <[email protected]> on 2012-03-09
Reviewed by Rob Buis.

Hook up MIMESniffing for BlackBerry. Override Content-Types will
not be overriden. File extensions will be trusted when content
is loaded from disk.

No tests, BlackBerry tests are not yet present in webkit.org codebase.

* PlatformBlackBerry.cmake:
* platform/network/blackberry/NetworkJob.cpp:
(WebCore::NetworkJob::NetworkJob):
(WebCore::NetworkJob::initialize):
(WebCore::NetworkJob::handleNotifyDataReceived):
(WebCore::NetworkJob::sendResponseIfNeeded):
* platform/network/blackberry/NetworkJob.h:
(NetworkJob):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (110360 => 110361)


--- trunk/Source/WebCore/ChangeLog	2012-03-10 02:53:43 UTC (rev 110360)
+++ trunk/Source/WebCore/ChangeLog	2012-03-10 02:55:55 UTC (rev 110361)
@@ -1,3 +1,25 @@
+2012-03-09  Tyler Abbott  <[email protected]>
+
+        BlackBerry PlayBook doesn't sniff mime types
+        https://bugs.webkit.org/show_bug.cgi?id=73869
+
+        Reviewed by Rob Buis.
+
+        Hook up MIMESniffing for BlackBerry. Override Content-Types will
+        not be overriden. File extensions will be trusted when content
+        is loaded from disk.
+
+        No tests, BlackBerry tests are not yet present in webkit.org codebase.
+
+        * PlatformBlackBerry.cmake:
+        * platform/network/blackberry/NetworkJob.cpp:
+        (WebCore::NetworkJob::NetworkJob):
+        (WebCore::NetworkJob::initialize):
+        (WebCore::NetworkJob::handleNotifyDataReceived):
+        (WebCore::NetworkJob::sendResponseIfNeeded):
+        * platform/network/blackberry/NetworkJob.h:
+        (NetworkJob):
+
 2012-03-09  Enrica Casucci  <[email protected]>
 
         Move WebNSURLExtras code down to WebCore.

Modified: trunk/Source/WebCore/PlatformBlackBerry.cmake (110360 => 110361)


--- trunk/Source/WebCore/PlatformBlackBerry.cmake	2012-03-10 02:53:43 UTC (rev 110360)
+++ trunk/Source/WebCore/PlatformBlackBerry.cmake	2012-03-10 02:55:55 UTC (rev 110361)
@@ -87,6 +87,7 @@
 
 # Networking sources
 LIST(APPEND WebCore_SOURCES
+    platform/network/MIMESniffing.cpp
     platform/network/ProxyServer.cpp
     platform/network/blackberry/DeferredData.cpp
     platform/network/blackberry/NetworkJob.cpp

Modified: trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp (110360 => 110361)


--- trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp	2012-03-10 02:53:43 UTC (rev 110360)
+++ trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp	2012-03-10 02:55:55 UTC (rev 110361)
@@ -27,6 +27,7 @@
 #include "FrameLoaderClientBlackBerry.h"
 #include "HTTPParsers.h"
 #include "KURL.h"
+#include "MIMESniffing.h"
 #include "MIMETypeRegistry.h"
 #include "NetworkManager.h"
 #include "ResourceHandleClient.h"
@@ -107,6 +108,7 @@
     , m_callingClient(false)
     , m_isXHR(false)
     , m_needsRetryAsFTPDirectory(false)
+    , m_isOverrideContentType(false)
     , m_extendedStatusCode(0)
     , m_redirectCount(0)
     , m_deferredData(*this)
@@ -151,8 +153,10 @@
 
     // We don't need to explicitly call notifyHeaderReceived, as the Content-Type
     // will ultimately get parsed when sendResponseIfNeeded gets called.
-    if (!request.getOverrideContentType().empty())
+    if (!request.getOverrideContentType().empty()) {
         m_contentType = String(request.getOverrideContentType().c_str());
+        m_isOverrideContentType = true;
+    }
 
     // No need to create the streams for data and about.
     if (m_isData || m_isAbout)
@@ -382,6 +386,32 @@
     if (!buf || !len)
         return;
 
+    // The loadFile API sets the override content type,
+    // this will always be used as the content type and should not be overridden.
+    if (!m_dataReceived && !m_isOverrideContentType) {
+        bool shouldSniff = true;
+
+        // Don't bother sniffing the content type of a file that
+        // is on a file system if it has a MIME mappable file extension.
+        // The file extension is likely to be correct.
+        if (m_isFile) {
+            String urlFilename = m_response.url().lastPathComponent();
+            size_t pos = urlFilename.reverseFind('.');
+            if (pos != WTF::notFound) {
+                String extension = urlFilename.substring(pos + 1);
+                String mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension);
+                if (!mimeType.isEmpty())
+                    shouldSniff = false;
+            }
+        }
+
+        if (shouldSniff) {
+            MIMESniffer sniffer = MIMESniffer(m_contentType.latin1().data(), MIMETypeRegistry::isSupportedImageResourceMIMEType(m_contentType));
+            if (const char* type = sniffer.sniff(buf, std::min(len, sniffer.dataSize())))
+                m_sniffedMimeType = String(type);
+        }
+    }
+
     m_dataReceived = true;
 
     // Protect against reentrancy.
@@ -583,11 +613,9 @@
     // Get the MIME type that was set by the content sniffer
     // if there's no custom sniffer header, try to set it from the Content-Type header
     // if this fails, guess it from extension.
-    String mimeType;
+    String mimeType = m_sniffedMimeType;
     if (m_isFTP && m_isFTPDir)
         mimeType = "application/x-ftp-directory";
-    else
-        mimeType = m_response.httpHeaderField(BlackBerry::Platform::NetworkRequest::HEADER_RIM_SNIFFED_MIME_TYPE);
     if (mimeType.isNull())
         mimeType = extractMIMETypeFromMediaType(m_contentType);
     if (mimeType.isNull())

Modified: trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h (110360 => 110361)


--- trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h	2012-03-10 02:53:43 UTC (rev 110360)
+++ trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h	2012-03-10 02:55:55 UTC (rev 110361)
@@ -158,6 +158,7 @@
     OwnPtr<ResourceResponse> m_multipartResponse;
     Timer<NetworkJob> m_deleteJobTimer;
     String m_contentType;
+    String m_sniffedMimeType;
     String m_contentDisposition;
     BlackBerry::Platform::NetworkStreamFactory* m_streamFactory;
     bool m_isFile;
@@ -175,6 +176,7 @@
     bool m_callingClient;
     bool m_isXHR; // FIXME - After 7.0, remove this. Only the Qt port reports HTTP error statuses as didFails, so we probably shouldn't.
     bool m_needsRetryAsFTPDirectory;
+    bool m_isOverrideContentType;
 
     // If an HTTP status code is received, m_extendedStatusCode and m_response.httpStatusCode will both be set to it.
     // If a platform error code is received, m_extendedStatusCode will be set to it and m_response.httpStatusCode will be set to 404.
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to