WebCore:
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Aug 2008 19:59:55 +0000 (19:59 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Aug 2008 19:59:55 +0000 (19:59 +0000)
2008-08-27  Brady Eidson  <beidson@apple.com>

        Reviewed by Anders

        <rdar://problem/6134133> - Crash when loading large movie as a standalone document

        We hand off these loads to Quicktime which manages and spools the data itself, but we also continued
        to load and buffer the data for the movie in WebCore.  With large media files, this results in blowing
        away the virtual address space and a crash.

        * loader/EmptyClients.h:
        (WebCore::EmptyFrameLoaderClient::pluginWillHandleLoadError):
        * loader/FrameLoaderClient.h:  Added client method to get platform specific error for
          "plugin will handle load"

        * loader/MediaDocument.cpp:
        (WebCore::MediaTokenizer::createDocumentStructure): Tell the MainResourceLoader to not buffer data,
          and cancel the WebCore-managed load
        (WebCore::MediaTokenizer::writeRawData):
        (WebCore::MediaTokenizer::finish):

WebKit/gtk:

2008-08-27  Brady Eidson  <beidson@apple.com>

        Reviewed by Anders

        <rdar://problem/6134133> - Crash when loading large movie as a standalone document

        * WebCoreSupport/FrameLoaderClientGtk.cpp:
        (WebKit::FrameLoaderClient::pluginWillHandleLoadError): Stubbed for now
        * WebCoreSupport/FrameLoaderClientGtk.h:

WebKit/mac:

2008-08-27  Brady Eidson  <beidson@apple.com>

        Reviewed by Anders

        <rdar://problem/6134133> - Crash when loading large movie as a standalone document

        * WebCoreSupport/WebFrameLoaderClient.h:
        * WebCoreSupport/WebFrameLoaderClient.mm:
        (WebFrameLoaderClient::pluginWillHandleLoadError):

WebKit/qt:

2008-08-27  Brady Eidson  <beidson@apple.com>

        Reviewed by Anders

        <rdar://problem/6134133> - Crash when loading large movie as a standalone document

        * WebCoreSupport/FrameLoaderClientQt.cpp:
        (WebCore::FrameLoaderClientQt::pluginWillHandleLoadError): Stubbed for now
        * WebCoreSupport/FrameLoaderClientQt.h:

WebKit/win:

2008-08-27  Brady Eidson  <beidson@apple.com>

        Reviewed by Anders

        <rdar://problem/6134133> - Crash when loading large movie as a standalone document

        * WebFrame.cpp:
        (WebFrame::pluginWillHandleLoadError):
        * WebFrame.h:

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

16 files changed:
WebCore/ChangeLog
WebCore/loader/EmptyClients.h
WebCore/loader/FrameLoaderClient.h
WebCore/loader/MediaDocument.cpp
WebKit/gtk/ChangeLog
WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp
WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h
WebKit/mac/ChangeLog
WebKit/mac/WebCoreSupport/WebFrameLoaderClient.h
WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm
WebKit/qt/ChangeLog
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
WebKit/win/ChangeLog
WebKit/win/WebFrame.cpp
WebKit/win/WebFrame.h

index 1ffc61ff7125f2cf626a9aaa65ae653644dade2b..1d7a4804a95b8da02b5d28ebd09bda5a9b419829 100644 (file)
@@ -1,3 +1,24 @@
+2008-08-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6134133> - Crash when loading large movie as a standalone document
+
+        We hand off these loads to Quicktime which manages and spools the data itself, but we also continued
+        to load and buffer the data for the movie in WebCore.  With large media files, this results in blowing
+        away the virtual address space and a crash.
+
+        * loader/EmptyClients.h:
+        (WebCore::EmptyFrameLoaderClient::pluginWillHandleLoadError):
+        * loader/FrameLoaderClient.h:  Added client method to get platform specific error for
+          "plugin will handle load"
+
+        * loader/MediaDocument.cpp:
+        (WebCore::MediaTokenizer::createDocumentStructure): Tell the MainResourceLoader to not buffer data,
+          and cancel the WebCore-managed load
+        (WebCore::MediaTokenizer::writeRawData):
+        (WebCore::MediaTokenizer::finish):
+
 2008-08-26  Simon Fraser  <simon.fraser@apple.com>
 
         Reviewed by Eric Seidel
index df3af1a558ab2542e66e219cbf751bac459189f5..f2a48ef8e43596006ddb82d28c8ee3e0d4dd4ecb 100644 (file)
@@ -216,6 +216,7 @@ public:
 
     virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&) { return ResourceError(); }
     virtual ResourceError fileDoesNotExistError(const ResourceResponse&) { return ResourceError(); }
+    virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&) { return ResourceError(); }
 
     virtual bool shouldFallBack(const ResourceError&) { return false; }
 
index 98b2f6ca9808c76bdf068e4253dd0990a1f46de8..557b65f71092b57297f952a920d9d6271bdc2039 100644 (file)
@@ -158,6 +158,7 @@ namespace WebCore {
 
         virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&) = 0;
         virtual ResourceError fileDoesNotExistError(const ResourceResponse&) = 0;
+        virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&) = 0;
 
         virtual bool shouldFallBack(const ResourceError&) = 0;
 
index cd4be2fcece0d0a85a0ff793be1486093f42a9f2..548e2e450bd8913f076ffd807f433975f91b8b23 100644 (file)
@@ -28,6 +28,7 @@
 #if ENABLE(VIDEO)
 #include "MediaDocument.h"
 
+#include "DocumentLoader.h"
 #include "Element.h"
 #include "Event.h"
 #include "EventNames.h"
@@ -37,6 +38,7 @@
 #include "HTMLEmbedElement.h"
 #include "HTMLNames.h"
 #include "HTMLVideoElement.h"
+#include "MainResourceLoader.h"
 #include "Page.h"
 #include "SegmentedString.h"
 #include "Settings.h"
@@ -94,12 +96,19 @@ void MediaTokenizer::createDocumentStructure()
     m_mediaElement->setSrc(m_doc->url());
     
     body->appendChild(mediaElement, ec);
+
+    Frame* frame = m_doc->frame();
+    if (!frame)
+        return;
+
+    frame->loader()->activeDocumentLoader()->mainResourceLoader()->setShouldBufferData(false);
+    frame->loader()->documentLoader()->cancelMainResourceLoad(frame->loader()->client()->pluginWillHandleLoadError(frame->loader()->documentLoader()->response()));
 }
     
 bool MediaTokenizer::writeRawData(const char* data, int len)
-{    
+{
     if (!m_mediaElement)
-        createDocumentStructure();    
+        createDocumentStructure();
     return false;
 }
     
@@ -111,7 +120,7 @@ void MediaTokenizer::stopParsing()
 void MediaTokenizer::finish()
 {
     if (!m_parserStopped) 
-        m_doc->finishedParsing();            
+        m_doc->finishedParsing();
 }
     
 bool MediaTokenizer::isWaitingForScripts() const
index 93432fef7a750d5fce9ec8a0998c3e163bc2d1ed..49b00bf3f66b0a35ddfea1dc67e75b522d3d0516 100644 (file)
@@ -1,3 +1,13 @@
+2008-08-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6134133> - Crash when loading large movie as a standalone document
+
+        * WebCoreSupport/FrameLoaderClientGtk.cpp:
+        (WebKit::FrameLoaderClient::pluginWillHandleLoadError): Stubbed for now
+        * WebCoreSupport/FrameLoaderClientGtk.h:
+
 2008-08-18  Alp Toker  <alp@nuanti.com>
 
         Reviewed by Holger Freyther.
index 8cf08867a52dd7a64d1b44f114cd587798af440e..eca285376feec24d2264d831eecf696485e75b4b 100644 (file)
@@ -715,6 +715,12 @@ ResourceError FrameLoaderClient::fileDoesNotExistError(const ResourceResponse&)
     return ResourceError();
 }
 
+ResourceError FrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse&)
+{
+    notImplemented();
+    return ResourceError();
+}
+
 bool FrameLoaderClient::shouldFallBack(const ResourceError&)
 {
     notImplemented();
index fa2ae59adf8e6b7dc3367f2a31ff3b66995f909e..a38fbd1707fe98c33d48f8eb8d4f5a7824f79a92 100644 (file)
@@ -142,6 +142,7 @@ namespace WebKit {
 
         virtual WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
         virtual WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
+        virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
 
         virtual bool shouldFallBack(const WebCore::ResourceError&);
 
index 4d8d69f3ef9357c1c40b1573e50d0563b8c2c317..1538d3a02b80dfa61b9453d55e63422261d18784 100644 (file)
@@ -1,3 +1,13 @@
+2008-08-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6134133> - Crash when loading large movie as a standalone document
+
+        * WebCoreSupport/WebFrameLoaderClient.h:
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (WebFrameLoaderClient::pluginWillHandleLoadError):
+
 2008-08-20  Dan Bernstein  <mitz@apple.com>
 
         Rubber-stamped by John Sullivan.
index 45fd17fc937858d8fa38fac31cb42ab6d4064a78..4f2aa57947e3beaf333fc99ee8b181f6414d1380 100644 (file)
@@ -148,6 +148,7 @@ private:
 
     virtual WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
     virtual WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
+    virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
 
     virtual bool shouldFallBack(const WebCore::ResourceError&);
 
index 49c44c6d919fd661bd5adb4034baddbc6a23465d..5d5a02b0b55209e21f0a0c984ac21132f9eab94a 100644 (file)
@@ -759,6 +759,16 @@ ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse
     return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist URL:response.url()];    
 }
 
+ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse& response)
+{
+    NSError *error = [[NSError alloc] _initWithPluginErrorCode:WebKitErrorPlugInWillHandleLoad
+                                                    contentURL:response.url()
+                                                 pluginPageURL:nil
+                                                    pluginName:nil
+                                                      MIMEType:response.mimeType()];
+    return [error autorelease];
+}
+
 bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error)
 {
     // FIXME: Needs to check domain.
index 8e87ec484c43d02c6a0b710867bfceac1d213137..33bb297ff3907cfec15c9bce8a612e0cd3d10ea1 100644 (file)
@@ -1,3 +1,13 @@
+2008-08-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6134133> - Crash when loading large movie as a standalone document
+
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::pluginWillHandleLoadError): Stubbed for now
+        * WebCoreSupport/FrameLoaderClientQt.h:
+
 2008-08-25  Holger Hans Peter Freyther  <zecke@selfish.org>
 
         Reviewed by Simon.
index 1d6d1b69e1264803e7c9f87809772ebb5c218fee..a9d8b63500a41d7dc79cd276c7e7c8bd3ce092be 100644 (file)
@@ -749,6 +749,12 @@ WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore:
             QCoreApplication::translate("QWebFrame", "File does not exist", 0, QCoreApplication::UnicodeUTF8));
 }
 
+WebCore::ResourceError FrameLoaderClientQt::pluginWillHandleLoadError(const WebCore::ResourceResponse& response)
+{
+    notImplemented();
+    return ResourceError();
+}
+
 bool FrameLoaderClientQt::shouldFallBack(const WebCore::ResourceError&)
 {
     notImplemented();
index 0126cf4eef5868553c42c62dc1857869672e85ae..46c7d8db1f42cfff65198fe89d64e02bfeca1963 100644 (file)
@@ -156,6 +156,7 @@ namespace WebCore {
 
         virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&);
         virtual ResourceError fileDoesNotExistError(const ResourceResponse&);
+        virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&);
 
         virtual bool shouldFallBack(const ResourceError&);
 
index 465c807988f4c373b4493f6928179762e61aeefa..7c54d7162ba2be002128f961fc2a1757778bd29f 100644 (file)
@@ -1,3 +1,13 @@
+2008-08-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6134133> - Crash when loading large movie as a standalone document
+
+        * WebFrame.cpp:
+        (WebFrame::pluginWillHandleLoadError):
+        * WebFrame.h:
+
 2008-08-26  Alice Liu  <alice.liu@apple.com>
 
         Implement COMPropertyBag::GetPropertyInfo
index 891d5346e34b8d2c850b937ce25ef23714bf70cc..3db49c7a0d213dc790604399dc172e31a0635b0e 100644 (file)
@@ -1372,6 +1372,11 @@ ResourceError WebFrame::fileDoesNotExistError(const ResourceResponse&)
     return ResourceError();
 }
 
+ResourceError WebFrame::pluginWillHandleLoadError(const ResourceResponse&)
+{
+    return ResourceError(String(WebKitErrorDomain), WebKitErrorPlugInWillHandleLoad, request.url().string(), String());
+}
+
 bool WebFrame::shouldFallBack(const ResourceError& error)
 {
     return error.errorCode() != WebURLErrorCancelled;
index d8d8a6c2b3bb655b3409fc9ba062cc74de92f57b..eed5afeca92fcb1996e4fa4257cb793ebf789b1a 100644 (file)
@@ -265,6 +265,7 @@ public:
     virtual WebCore::ResourceError interruptForPolicyChangeError(const WebCore::ResourceRequest&);
     virtual WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
     virtual WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
+    virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
     virtual bool shouldFallBack(const WebCore::ResourceError&);
     virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction, const WebCore::String& MIMEType, const WebCore::ResourceRequest&);
     virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction, const WebCore::NavigationAction&, const WebCore::ResourceRequest&, PassRefPtr<WebCore::FormState>, const WebCore::String& frameName);