| Index: Source/core/frame/FrameView.cpp
|
| diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp
|
| index 14e5e026725681da324979d3a91dbc1854e4998e..1a801f46cf18f355496a7c60aa7603ee8f858497 100644
|
| --- a/Source/core/frame/FrameView.cpp
|
| +++ b/Source/core/frame/FrameView.cpp
|
| @@ -1408,7 +1408,7 @@ void FrameView::restoreScrollbar()
|
| setScrollbarsSuppressed(false);
|
| }
|
|
|
| -bool FrameView::scrollToFragment(const KURL& url)
|
| +bool FrameView::processUrlFragment(const KURL& url, UrlFragmentBehavior behavior)
|
| {
|
| // If our URL has no ref, then we have no place we need to jump to.
|
| // OTOH If CSS target was set previously, we want to set it to 0, recalc
|
| @@ -1420,21 +1420,21 @@ bool FrameView::scrollToFragment(const KURL& url)
|
| return false;
|
|
|
| String fragmentIdentifier = url.fragmentIdentifier();
|
| - if (scrollToAnchor(fragmentIdentifier))
|
| + if (processUrlFragmentHelper(fragmentIdentifier, behavior))
|
| return true;
|
|
|
| // Try again after decoding the ref, based on the document's encoding.
|
| if (m_frame->document()->encoding().isValid())
|
| - return scrollToAnchor(decodeURLEscapeSequences(fragmentIdentifier, m_frame->document()->encoding()));
|
| + return processUrlFragmentHelper(decodeURLEscapeSequences(fragmentIdentifier, m_frame->document()->encoding()), behavior);
|
|
|
| return false;
|
| }
|
|
|
| -bool FrameView::scrollToAnchor(const String& name)
|
| +bool FrameView::processUrlFragmentHelper(const String& name, UrlFragmentBehavior behavior)
|
| {
|
| ASSERT(m_frame->document());
|
|
|
| - if (!m_frame->document()->isRenderingReady()) {
|
| + if (behavior == UrlFragmentScroll && !m_frame->document()->isRenderingReady()) {
|
| m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
|
| return false;
|
| }
|
| @@ -1458,7 +1458,8 @@ bool FrameView::scrollToAnchor(const String& name)
|
| if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
|
| return false;
|
|
|
| - maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
|
| + if (behavior == UrlFragmentScroll)
|
| + maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
|
|
|
| // If the anchor accepts keyboard focus, move focus there to aid users relying on keyboard navigation.
|
| // If anchorNode is not focusable, setFocusedElement() will still clear focus, which matches the behavior of other browsers.
|
|
|