Reviewed by Dave.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Jul 2004 20:45:22 +0000 (20:45 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Jul 2004 20:45:22 +0000 (20:45 +0000)
<rdar://problem/3720111> REGRESSION(125-152): map fails to load depending on banner ad; weather.com (works in IE and Firefox)

        * khtml/html/htmltokenizer.cpp:
        (khtml::HTMLTokenizer::begin): Initialize currentPrependingSrc.
        (khtml::HTMLTokenizer::scriptHandler): Store a pointer to the currently
active prependingSrc variable on the stack, the better to handle weird cases
of scripts writing out additional script tags and so forth.
        (khtml::HTMLTokenizer::write): Deal with the above.
        * khtml/html/htmltokenizer.h: Declare new member field.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/html/htmltokenizer.cpp
WebCore/khtml/html/htmltokenizer.h

index 114520d..8bcdfaa 100644 (file)
@@ -1,3 +1,17 @@
+2004-07-20  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Dave.
+
+       <rdar://problem/3720111> REGRESSION(125-152): map fails to load depending on banner ad; weather.com (works in IE and Firefox)
+       
+        * khtml/html/htmltokenizer.cpp:
+        (khtml::HTMLTokenizer::begin): Initialize currentPrependingSrc.
+        (khtml::HTMLTokenizer::scriptHandler): Store a pointer to the currently
+       active prependingSrc variable on the stack, the better to handle weird cases
+       of scripts writing out additional script tags and so forth.
+        (khtml::HTMLTokenizer::write): Deal with the above.
+        * khtml/html/htmltokenizer.h: Declare new member field.
+
 2004-07-20  David Hyatt  <hyatt@apple.com>
 
        Fix for layer positioning error that occurs when absolute positioned blocks are inside static positioned overflow:auto
index 3c280f0..6b49573 100644 (file)
@@ -315,6 +315,7 @@ void HTMLTokenizer::begin()
     loadingExtScript = false;
     scriptSrc = QString::null;
     pendingSrc.clear();
+    currentPrependingSrc = 0;
     noMoreData = false;
     brokenComments = false;
     brokenServer = false;
@@ -500,13 +501,19 @@ void HTMLTokenizer::scriptHandler()
     currToken.id = ID_SCRIPT + ID_CLOSE_TAG;
     processToken();
 
+    TokenizerString *savedPrependingSrc = currentPrependingSrc;
     TokenizerString prependingSrc;
+    currentPrependingSrc = &prependingSrc;
     if ( !parser->skipMode() ) {
         if (cs) {
              //kdDebug( 6036 ) << "cachedscript extern!" << endl;
              //kdDebug( 6036 ) << "src: *" << QString( src.current(), src.length() ).latin1() << "*" << endl;
              //kdDebug( 6036 ) << "pending: *" << pendingSrc.latin1() << "*" << endl;
-            pendingSrc.prepend(src);
+           if (savedPrependingSrc) {
+               savedPrependingSrc->append(src);
+           } else {
+               pendingSrc.prepend(src);
+           }
             setSrc(TokenizerString());
             scriptCodeSize = scriptCodeResync = 0;
             cs->ref(this);
@@ -535,8 +542,26 @@ void HTMLTokenizer::scriptHandler()
        // kdDebug( 6036 ) << "adding pending Output to parsed string" << endl;
        src.append(pendingSrc);
        pendingSrc.clear();
-    } else if (!prependingSrc.isEmpty())
-        write(prependingSrc, false);
+    } else if (!prependingSrc.isEmpty()) {
+       // restore first so that the write appends in the right place
+       // (does not hurt to do it again below)
+       currentPrependingSrc = savedPrependingSrc;
+
+       // we need to do this slightly modified bit of one of the write() cases
+       // because we want to prepend to pendingSrc rather than appending
+       // if there's no previous prependingSrc
+       if (loadingExtScript) {
+           if (currentPrependingSrc) {
+               currentPrependingSrc->append(prependingSrc);
+           } else {
+               pendingSrc.prepend(prependingSrc);
+           }
+       } else {
+           write(prependingSrc, false);
+       }
+    }
+
+    currentPrependingSrc = savedPrependingSrc;
 }
 
 void HTMLTokenizer::scriptExecution( const QString& str, QString scriptURL,
@@ -1403,10 +1428,14 @@ void HTMLTokenizer::write(const TokenizerString &str, bool appendData)
     if ( !buffer )
         return;
 
-    if ( ( m_executingScript && appendData ) ||
-         ( !m_executingScript && loadingExtScript ) ) {
+    if ( ( m_executingScript && appendData ) || 
+        loadingExtScript) {
         // don't parse; we will do this later
-        pendingSrc.append(str);
+       if (currentPrependingSrc) {
+           currentPrependingSrc->append(str);
+       } else {
+           pendingSrc.append(str);
+       }
         return;
     }
 
index 625d5c5..c68479a 100644 (file)
@@ -322,6 +322,11 @@ protected:
     bool javascript;
     // the HTML code we will parse after the external script we are waiting for has loaded
     TokenizerString pendingSrc;
+
+    // the HTML code we will parse after this particular script has
+    // loaded, but before all pending HTML
+    TokenizerString *currentPrependingSrc;
+
     // true if we are executing a script while parsing a document. This causes the parsing of
     // the output of the script to be postponed until after the script has finished executing
     int m_executingScript;