LayoutTests:
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 19 Aug 2007 21:40:39 +0000 (21:40 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 19 Aug 2007 21:40:39 +0000 (21:40 +0000)
        Reviewed by Darin.

        - update for fix to <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)

        No longer expect windowScriptObject delegate method in frames that never
        use script.

        * http/tests/loading/bad-scheme-subframe-expected.txt:
        * http/tests/loading/bad-server-subframe-expected.txt:
        * http/tests/loading/empty-subframe-expected.txt:
        * http/tests/loading/slow-parsing-subframe-expected.txt:

WebCore:

        Reviewed by Darin.

        - fixed <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)

        There were three main cuases of extra time due to creating the initial empty document:

        1) Creating an extra WebHTMLView and swapping it for a new one for each frame created.
        2) Parsing the minimal markup for the initial document's contents.
        3) Clearing the Window object an extra time and dispatching the corresponding delegate method.

        The WebCore part of the fixes addresses 2 and 3.

        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::init): Don't parse "<html><body>" for the initial
        empty document; it turns out not to be needed.
        (WebCore::FrameLoader::dispatchWindowObjectAvailable): Don't
        dispatch the delegate if we haven't created a ScriptInterpreter yet.
        * bindings/js/kjs_proxy.cpp:
        (WebCore::KJSProxy::initScriptIfNeeded): Dispatch the window object
        delegate when we first create the interpreter, since that is now done
        lazily.
        * loader/FrameLoader.h:
        (WebCore::FrameLoader::committingFirstRealLoad): Helper for WebKit
        to know when to reuse a WebHTMLView.

WebKit:

        Reviewed by Darin.

        - fixed <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)

        There were three main cuases of extra time due to creating the initial empty document:

        1) Creating an extra WebHTMLView and swapping it for a new one for each frame created.
        2) Parsing the minimal markup for the initial document's contents.
        3) Clearing the Window object an extra time and dispatching the corresponding delegate method.

        The WebKit part of the fixes addresses 1.

        * WebCoreSupport/WebFrameLoaderClient.mm:
        (WebFrameLoaderClient::makeDocumentView): When switching from the initial
        empty document to the first real document, reuse the WebHTMLView.

        It might actually be a significant performance improvement to always
        reuse the WebHTMLView, but that is a much riskier change and not
        needed to fix the regression right now.

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

LayoutTests/ChangeLog
LayoutTests/http/tests/loading/bad-scheme-subframe-expected.txt
LayoutTests/http/tests/loading/bad-server-subframe-expected.txt
LayoutTests/http/tests/loading/empty-subframe-expected.txt
LayoutTests/http/tests/loading/slow-parsing-subframe-expected.txt
WebCore/ChangeLog
WebCore/bindings/js/kjs_proxy.cpp
WebCore/loader/FrameLoader.cpp
WebCore/loader/FrameLoader.h
WebKit/ChangeLog
WebKit/WebCoreSupport/WebFrameLoaderClient.mm

index 70199fcd12f2486e0d04f32666bcfb38edaa5e25..33150f52b132296bb904bc9ab885e93abd21747f 100644 (file)
@@ -1,3 +1,17 @@
+2007-08-18  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+        - update for fix to <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)
+        
+        No longer expect windowScriptObject delegate method in frames that never
+        use script.
+
+        * http/tests/loading/bad-scheme-subframe-expected.txt:
+        * http/tests/loading/bad-server-subframe-expected.txt:
+        * http/tests/loading/empty-subframe-expected.txt:
+        * http/tests/loading/slow-parsing-subframe-expected.txt:
+
 2007-08-19  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Adam Roben.
index 0ec12f55f07a82c679dbde83872ceb25b2b49d32..fe9e12e5fbadacda6099182797b71170dfc41a9d 100644 (file)
@@ -2,7 +2,6 @@ main frame - didStartProvisionalLoadForFrame
 main frame - willCloseFrame
 main frame - didCommitLoadForFrame
 main frame - didClearWindowObjectForFrame
-frame "f1" - didClearWindowObjectForFrame
 main frame - didFinishDocumentLoadForFrame
 main frame - didFinishLoadForFrame
 This is a test of load callbacks. It is only useful inside the regression test tool.
index 81ce813da63be43192cee8c26b7c3f5f38436ad2..d9fd8e0c9ad882764471c22ce9e3081d42ea2732 100644 (file)
@@ -3,7 +3,6 @@ frame "f1" - willCloseFrame
 main frame - willCloseFrame
 main frame - didCommitLoadForFrame
 main frame - didClearWindowObjectForFrame
-frame "f1" - didClearWindowObjectForFrame
 frame "f1" - didStartProvisionalLoadForFrame
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
index 8a5c4f3930b108b98f06f6861827a77c16cc685f..70166eba84e5a9b1661d91026ff9e3a8d02fb180 100644 (file)
@@ -2,11 +2,9 @@ main frame - didStartProvisionalLoadForFrame
 main frame - willCloseFrame
 main frame - didCommitLoadForFrame
 main frame - didClearWindowObjectForFrame
-frame "f1" - didClearWindowObjectForFrame
 frame "f1" - didStartProvisionalLoadForFrame
 frame "f1" - willCloseFrame
 frame "f1" - didCommitLoadForFrame
-frame "f1" - didClearWindowObjectForFrame
 frame "f1" - didHandleOnloadEventsForFrame
 frame "f1" - didFinishDocumentLoadForFrame
 frame "f1" - didFinishLoadForFrame
index bf440e8483bad986dd66c2fbfaae63c6f45c4a95..c6bf81d35694075a44d23f3ab02d1a571db3ec1d 100644 (file)
@@ -3,7 +3,6 @@ frame "f1" - willCloseFrame
 main frame - willCloseFrame
 main frame - didCommitLoadForFrame
 main frame - didClearWindowObjectForFrame
-frame "f1" - didClearWindowObjectForFrame
 frame "f1" - didStartProvisionalLoadForFrame
 main frame - didFinishDocumentLoadForFrame
 frame "f1" - willCloseFrame
index 24635f14d85d51b6b9c089313420bec38d324df5..fc3b32d7fc3fc5a35247ef89acf69ffd1bf0af97 100644 (file)
@@ -1,3 +1,30 @@
+2007-08-18  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+        - fixed <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)
+        
+        There were three main cuases of extra time due to creating the initial empty document:
+        
+        1) Creating an extra WebHTMLView and swapping it for a new one for each frame created.
+        2) Parsing the minimal markup for the initial document's contents.
+        3) Clearing the Window object an extra time and dispatching the corresponding delegate method.
+        
+        The WebCore part of the fixes addresses 2 and 3.
+        
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::init): Don't parse "<html><body>" for the initial
+        empty document; it turns out not to be needed.
+        (WebCore::FrameLoader::dispatchWindowObjectAvailable): Don't 
+        dispatch the delegate if we haven't created a ScriptInterpreter yet.
+        * bindings/js/kjs_proxy.cpp:
+        (WebCore::KJSProxy::initScriptIfNeeded): Dispatch the window object
+        delegate when we first create the interpreter, since that is now done
+        lazily.
+        * loader/FrameLoader.h:
+        (WebCore::FrameLoader::committingFirstRealLoad): Helper for WebKit
+        to know when to reuse a WebHTMLView.
+
 2007-08-19  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Adam Roben.
index 9be8c9eddde2063bdd577a727dc61cfc629fbf16..858d834ab4e620d17e8dbab2c71be240df9bd570 100644 (file)
@@ -161,6 +161,8 @@ void KJSProxy::initScriptIfNeeded()
     // If we find "Mozilla" but not "(compatible, ...)" we are a real Netscape
     if (userAgent.find("Mozilla") >= 0 && userAgent.find("compatible") == -1)
       m_script->setCompatMode(Interpreter::NetscapeCompat);
+
+  m_frame->loader()->dispatchWindowObjectAvailable();
 }
 
 }
index 3934acc4507fc09e4b614223846a289ab0df145b..b61cd78f921c1b6153f32cff9edc9fff77f6e277 100644 (file)
@@ -265,8 +265,7 @@ void FrameLoader::init()
     setState(FrameStateProvisional);
     m_provisionalDocumentLoader->setResponse(ResourceResponse(KURL(), "text/html", 0, String(), String()));
     m_provisionalDocumentLoader->finishedLoading();
-    begin();
-    write("<html><body>");
+    begin(KURL(), false);
     end();
     m_frame->document()->cancelParsing();
     m_creatingInitialEmptyDocument = false;
@@ -4413,7 +4412,7 @@ String FrameLoader::referrer() const
 void FrameLoader::dispatchWindowObjectAvailable()
 {
     if (Settings* settings = m_frame->settings())
-        if (settings->isJavaScriptEnabled()) {
+        if (settings->isJavaScriptEnabled() && m_frame->scriptProxy()->haveInterpreter()) {
             m_client->windowObjectCleared();
             if (Page* page = m_frame->page())
                 if (InspectorController* inspector = page->parentInspectorController())
index b9c23e613639fac5bce316922656f0bcc2ec745a..8a1c04dcd97f6541c1caa1ca72a624978cb76d06 100644 (file)
@@ -434,7 +434,9 @@ namespace WebCore {
         bool useLowBandwidthDisplay() const { return m_useLowBandwidthDisplay; }
 #endif
 
-    private:        
+        bool committingFirstRealLoad() const { return !m_creatingInitialEmptyDocument && !m_committedFirstRealDocumentLoad; }
+
+    private:
         PassRefPtr<HistoryItem> createHistoryItem(bool useOriginal);
         PassRefPtr<HistoryItem> createHistoryItemTree(Frame* targetFrame, bool clipAtTarget);
 
index a06a69e6f12e61ba094dd61f03653a19ab75638e..c84937e78ee8a121525338650a1a0a6e92899a28 100644 (file)
@@ -1,3 +1,25 @@
+2007-08-18  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+        
+        - fixed <rdar://problem/5198272> REGRESSION: PLT 1.5% slower due to r21367 (change to start frames with empty documents)
+
+        There were three main cuases of extra time due to creating the initial empty document:
+        
+        1) Creating an extra WebHTMLView and swapping it for a new one for each frame created.
+        2) Parsing the minimal markup for the initial document's contents.
+        3) Clearing the Window object an extra time and dispatching the corresponding delegate method.
+        
+        The WebKit part of the fixes addresses 1.
+
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (WebFrameLoaderClient::makeDocumentView): When switching from the initial
+        empty document to the first real document, reuse the WebHTMLView.
+        
+        It might actually be a significant performance improvement to always
+        reuse the WebHTMLView, but that is a much riskier change and not
+        needed to fix the regression right now.
+
 2007-08-17  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.
index c345f8588b5527551fd9f80335d9a7ec0336298e..757c06d8e91938f2ce917fba864e9c23d6017857 100644 (file)
@@ -155,6 +155,12 @@ void WebFrameLoaderClient::makeDocumentView()
     WebFrameView *v = m_webFrame->_private->webFrameView;
     WebDataSource *ds = [m_webFrame.get() _dataSource];
 
+    bool canSkipCreation = [m_webFrame.get() _frameLoader]->committingFirstRealLoad() && [[WebFrameView class] _viewClassForMIMEType:[[ds response] MIMEType]] == [WebHTMLView class];
+    if (canSkipCreation) {
+        [[v documentView] setDataSource:ds];
+        return;
+    }
+
     NSView <WebDocumentView> *documentView = [v _makeDocumentViewForDataSource:ds];
     if (!documentView)
         return;