Index: WebCore/loader/RedirectScheduler.cpp |
=================================================================== |
--- WebCore/loader/RedirectScheduler.cpp (revision 68304) |
+++ WebCore/loader/RedirectScheduler.cpp (working copy) |
@@ -33,6 +33,7 @@ |
#include "RedirectScheduler.h" |
#include "BackForwardList.h" |
+#include "DOMWindow.h" |
#include "DocumentLoader.h" |
#include "Event.h" |
#include "FormState.h" |
@@ -41,9 +42,9 @@ |
#include "FrameLoadRequest.h" |
#include "FrameLoader.h" |
#include "FrameLoaderStateMachine.h" |
-#include "HistoryItem.h" |
#include "HTMLFormElement.h" |
#include "HTMLFrameOwnerElement.h" |
+#include "HistoryItem.h" |
#include "Page.h" |
#include "UserGestureIndicator.h" |
#include <wtf/CurrentTime.h> |
@@ -52,12 +53,13 @@ |
class ScheduledNavigation : public Noncopyable { |
public: |
- ScheduledNavigation(double delay, bool lockHistory, bool lockBackForwardList, bool wasDuringLoad, bool isLocationChange) |
+ ScheduledNavigation(double delay, bool lockHistory, bool lockBackForwardList, bool wasDuringLoad, bool isLocationChange, bool wasUserGesture) |
: m_delay(delay) |
, m_lockHistory(lockHistory) |
, m_lockBackForwardList(lockBackForwardList) |
, m_wasDuringLoad(wasDuringLoad) |
, m_isLocationChange(isLocationChange) |
+ , m_wasUserGesture(wasUserGesture) |
{ |
} |
virtual ~ScheduledNavigation() { } |
@@ -73,6 +75,7 @@ |
bool lockBackForwardList() const { return m_lockBackForwardList; } |
bool wasDuringLoad() const { return m_wasDuringLoad; } |
bool isLocationChange() const { return m_isLocationChange; } |
+ bool wasUserGesture() const { return m_wasUserGesture; } |
private: |
double m_delay; |
@@ -80,22 +83,22 @@ |
bool m_lockBackForwardList; |
bool m_wasDuringLoad; |
bool m_isLocationChange; |
+ bool m_wasUserGesture; |
}; |
class ScheduledURLNavigation : public ScheduledNavigation { |
public: |
ScheduledURLNavigation(double delay, const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture, bool duringLoad, bool isLocationChange) |
- : ScheduledNavigation(delay, lockHistory, lockBackForwardList, duringLoad, isLocationChange) |
+ : ScheduledNavigation(delay, lockHistory, lockBackForwardList, duringLoad, isLocationChange, wasUserGesture) |
, m_url(url) |
, m_referrer(referrer) |
- , m_wasUserGesture(wasUserGesture) |
, m_haveToldClient(false) |
{ |
} |
virtual void fire(Frame* frame) |
{ |
- frame->loader()->changeLocation(KURL(ParsedURLString, m_url), m_referrer, lockHistory(), lockBackForwardList(), m_wasUserGesture, false); |
+ frame->loader()->changeLocation(KURL(ParsedURLString, m_url), m_referrer, lockHistory(), lockBackForwardList(), wasUserGesture(), false); |
} |
virtual void didStartTimer(Frame* frame, Timer<RedirectScheduler>* timer) |
@@ -115,12 +118,10 @@ |
String url() const { return m_url; } |
String referrer() const { return m_referrer; } |
- bool wasUserGesture() const { return m_wasUserGesture; } |
private: |
String m_url; |
String m_referrer; |
- bool m_wasUserGesture; |
bool m_haveToldClient; |
}; |
@@ -151,14 +152,17 @@ |
class ScheduledHistoryNavigation : public ScheduledNavigation { |
public: |
- explicit ScheduledHistoryNavigation(int historySteps) : ScheduledNavigation(0, false, false, false, true), m_historySteps(historySteps) { } |
+ explicit ScheduledHistoryNavigation(int historySteps, bool wasUserGesture) : ScheduledNavigation(0, false, false, false, true, wasUserGesture), m_historySteps(historySteps) { } |
virtual void fire(Frame* frame) |
{ |
+ UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture); |
+ |
FrameLoader* loader = frame->loader(); |
if (!m_historySteps) { |
// Special case for go(0) from a frame -> reload only the frame |
- loader->urlSelected(loader->url(), "", 0, lockHistory(), lockBackForwardList(), false, SendReferrer); |
+ // To follow Firefox and IE's behavior, history reload can only navigate the self frame. |
+ loader->urlSelected(loader->url(), "_self", 0, lockHistory(), lockBackForwardList(), wasUserGesture(), SendReferrer); |
return; |
} |
// go(i!=0) from a frame navigates into the history of the frame only, |
@@ -173,17 +177,16 @@ |
class ScheduledFormSubmission : public ScheduledNavigation { |
public: |
ScheduledFormSubmission(PassRefPtr<FormSubmission> submission, bool lockBackForwardList, bool duringLoad, bool wasUserGesture) |
- : ScheduledNavigation(0, submission->lockHistory(), lockBackForwardList, duringLoad, true) |
+ : ScheduledNavigation(0, submission->lockHistory(), lockBackForwardList, duringLoad, true, wasUserGesture) |
, m_submission(submission) |
, m_haveToldClient(false) |
- , m_wasUserGesture(wasUserGesture) |
{ |
ASSERT(m_submission->state()); |
} |
virtual void fire(Frame* frame) |
{ |
- UserGestureIndicator gestureIndicator(m_wasUserGesture ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture); |
+ UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture); |
// The submitForm function will find a target frame before using the redirection timer. |
// Now that the timer has fired, we need to repeat the security check which normally is done when |
@@ -214,7 +217,6 @@ |
private: |
RefPtr<FormSubmission> m_submission; |
bool m_haveToldClient; |
- bool m_wasUserGesture; |
}; |
RedirectScheduler::RedirectScheduler(Frame* frame) |
@@ -344,9 +346,9 @@ |
cancel(); |
return; |
} |
- |
+ |
// In all other cases, schedule the history traversal to occur asynchronously. |
- schedule(adoptPtr(new ScheduledHistoryNavigation(steps))); |
+ schedule(adoptPtr(new ScheduledHistoryNavigation(steps, m_frame->loader()->isProcessingUserGesture()))); |
} |
void RedirectScheduler::timerFired(Timer<RedirectScheduler>*) |