Reviewed by Hyatt.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jul 2007 00:04:32 +0000 (00:04 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jul 2007 00:04:32 +0000 (00:04 +0000)
        <rdar://problem/5242145> REGRESSION: Clicking on symbol in documentation often doesn't scroll to symbol

        A renderer for the anchor wasn't always available at the time parsing finished. So we need
        to bail out of gotoAnchor if stylesheets are pending and remember to call gotoAnchor later
        once all of the pending stylesheets load.

        * dom/Document.cpp:
        (WebCore::Document::Document): Initialize m_gotoAnchorNeededAfterStylesheetsLoad to false.
        (WebCore::Document::stylesheetLoaded): If we have no more pending stylesheets, call gotoAnchor if needed.
        * dom/Document.h:
        (WebCore::Document::gotoAnchorNeededAfterStylesheetsLoad): New method.
        (WebCore::Document::setGotoAnchorNeededAfterStylesheetsLoad): Ditto.
        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::gotoAnchor): Bail early if the document still has pending stylesheets.
        * loader/FrameLoader.h: Make gotoAnchor() public.

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

WebCore/ChangeLog
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/loader/FrameLoader.cpp
WebCore/loader/FrameLoader.h

index 134ce7bd415800e1f62dcfc77cd016e9183a2d69..3e5f21e127a7f93618b6256c216313ff96968a58 100644 (file)
@@ -1,3 +1,23 @@
+2007-07-23  Timothy Hatcher  <timothy@apple.com>
+
+        Reviewed by Hyatt.
+
+        <rdar://problem/5242145> REGRESSION: Clicking on symbol in documentation often doesn't scroll to symbol
+
+        A renderer for the anchor wasn't always available at the time parsing finished. So we need
+        to bail out of gotoAnchor if stylesheets are pending and remember to call gotoAnchor later
+        once all of the pending stylesheets load.
+
+        * dom/Document.cpp:
+        (WebCore::Document::Document): Initialize m_gotoAnchorNeededAfterStylesheetsLoad to false.
+        (WebCore::Document::stylesheetLoaded): If we have no more pending stylesheets, call gotoAnchor if needed.
+        * dom/Document.h:
+        (WebCore::Document::gotoAnchorNeededAfterStylesheetsLoad): New method.
+        (WebCore::Document::setGotoAnchorNeededAfterStylesheetsLoad): Ditto.
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::gotoAnchor): Bail early if the document still has pending stylesheets.
+        * loader/FrameLoader.h: Make gotoAnchor() public.
+
 2007-07-23  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Darin
index 3bf9dc7ae26908bcb7f77a4d3bfd4bf498b93e3a..930afb437f1f3df32a9f8e1c3eb360e6e37605d7 100644 (file)
@@ -308,6 +308,7 @@ Document::Document(DOMImplementation* impl, Frame* frame)
     m_usesSiblingRules = false;
     m_usesFirstLineRules = false;
     m_usesFirstLetterRules = false;
+    m_gotoAnchorNeededAfterStylesheetsLoad = false;
 
     m_styleSelector = new CSSStyleSelector(this, m_usersheet, m_styleSheets.get(), !inCompatMode());
     m_didCalculateStyleSelector = false;
@@ -1924,6 +1925,9 @@ void Document::stylesheetLoaded()
 #endif
 
     updateStyleSelector();
+
+    if (!m_pendingStylesheets && m_gotoAnchorNeededAfterStylesheetsLoad)
+        m_frame->loader()->gotoAnchor();
 }
 
 void Document::updateStyleSelector()
index af6690476d168054015c5d9226e1e5ea3b916ab9..a7f3c125d5944a3ea0707dd939fb5444060a6e9c 100644 (file)
@@ -271,6 +271,9 @@ public:
      */
     void addPendingSheet() { m_pendingStylesheets++; }
 
+    bool gotoAnchorNeededAfterStylesheetsLoad() { return m_gotoAnchorNeededAfterStylesheetsLoad; }
+    void setGotoAnchorNeededAfterStylesheetsLoad(bool b) { m_gotoAnchorNeededAfterStylesheetsLoad = b; }
+
     /**
      * Called when one or more stylesheets in the document may have been added, removed or changed.
      *
@@ -730,6 +733,7 @@ protected:
     bool m_usesSiblingRules;
     bool m_usesFirstLineRules;
     bool m_usesFirstLetterRules;
+    bool m_gotoAnchorNeededAfterStylesheetsLoad;
 
     String m_title;
     bool m_titleSetExplicitly;
index 0c237eb296c55253fc56ed6ed3959237737b2484..518f3820ad06a6eaf1a36afd6aa1a3324ae29101 100644 (file)
@@ -1412,6 +1412,13 @@ bool FrameLoader::gotoAnchor(const String& name)
 {
     ASSERT(m_frame->document());
 
+    if (!m_frame->document()->haveStylesheetsLoaded()) {
+        m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
+        return false;
+    }
+
+    m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
+
     Node* anchorNode = m_frame->document()->getElementById(AtomicString(name));
     if (!anchorNode)
         anchorNode = m_frame->document()->anchors()->namedItem(name, !m_frame->document()->inCompatMode());
index b422dac99e29478be07e3af0c4c592b9bb160749..e19c8d85c5270cc7f53dcf42817a4ef6b98f3655 100644 (file)
@@ -322,6 +322,7 @@ namespace WebCore {
         KJS::JSValue* executeScript(const String& URL, int baseLine, const String& script);
         KJS::JSValue* executeScript(const String& script, bool forceUserGesture = false);
 
+        void gotoAnchor();
         bool gotoAnchor(const String& name); // returns true if the anchor was found
         void scrollToAnchor(const KURL&);
 
@@ -472,8 +473,6 @@ namespace WebCore {
 
         void receivedFirstData();
 
-        void gotoAnchor();
-
         void updatePolicyBaseURL();
         void setPolicyBaseURL(const String&);