Index: Source/core/loader/NavigationScheduler.cpp |
diff --git a/Source/core/loader/NavigationScheduler.cpp b/Source/core/loader/NavigationScheduler.cpp |
index bd53511740fcee6e5bf018f2131ed88ecaa9b92d..2ac74b8ed38c84b0d4aca49c8d1f9eb81f40c468 100644 |
--- a/Source/core/loader/NavigationScheduler.cpp |
+++ b/Source/core/loader/NavigationScheduler.cpp |
@@ -54,8 +54,8 @@ namespace blink { |
unsigned NavigationDisablerForBeforeUnload::s_navigationDisableCount = 0; |
-class ScheduledNavigation { |
- WTF_MAKE_NONCOPYABLE(ScheduledNavigation); WTF_MAKE_FAST_ALLOCATED(ScheduledNavigation); |
+class ScheduledNavigation : public NoBaseWillBeGarbageCollectedFinalized<ScheduledNavigation> { |
+ WTF_MAKE_NONCOPYABLE(ScheduledNavigation); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED(ScheduledNavigation); |
public: |
ScheduledNavigation(double delay, Document* originDocument, bool lockBackForwardList, bool isLocationChange) |
: m_delay(delay) |
@@ -84,12 +84,17 @@ public: |
return adoptPtr(new UserGestureIndicator(DefinitelyNotProcessingUserGesture)); |
} |
+ DEFINE_INLINE_VIRTUAL_TRACE() |
+ { |
+ visitor->trace(m_originDocument); |
+ } |
+ |
protected: |
void clearUserGesture() { m_wasUserGesture = false; } |
private: |
double m_delay; |
- RefPtrWillBePersistent<Document> m_originDocument; |
+ RefPtrWillBeMember<Document> m_originDocument; |
bool m_lockBackForwardList; |
bool m_isLocationChange; |
bool m_wasUserGesture; |
@@ -125,10 +130,9 @@ private: |
class ScheduledRedirect final : public ScheduledURLNavigation { |
public: |
- ScheduledRedirect(double delay, Document* originDocument, const String& url, bool lockBackForwardList) |
- : ScheduledURLNavigation(delay, originDocument, url, lockBackForwardList, false) |
+ static PassOwnPtrWillBeRawPtr<ScheduledRedirect> create(double delay, Document* originDocument, const String& url, bool lockBackForwardList) |
{ |
- clearUserGesture(); |
+ return adoptPtrWillBeNoop(new ScheduledRedirect(delay, originDocument, url, lockBackForwardList)); |
} |
virtual bool shouldStartTimer(LocalFrame* frame) override { return frame->document()->loadEventFinished(); } |
@@ -143,19 +147,31 @@ public: |
request.setClientRedirect(ClientRedirect); |
frame->loader().load(request); |
} |
+private: |
+ ScheduledRedirect(double delay, Document* originDocument, const String& url, bool lockBackForwardList) |
+ : ScheduledURLNavigation(delay, originDocument, url, lockBackForwardList, false) |
+ { |
+ clearUserGesture(); |
+ } |
}; |
class ScheduledLocationChange final : public ScheduledURLNavigation { |
public: |
+ static PassOwnPtrWillBeRawPtr<ScheduledLocationChange> create(Document* originDocument, const String& url, bool lockBackForwardList) |
+ { |
+ return adoptPtrWillBeNoop(new ScheduledLocationChange(originDocument, url, lockBackForwardList)); |
+ } |
+ |
+private: |
ScheduledLocationChange(Document* originDocument, const String& url, bool lockBackForwardList) |
: ScheduledURLNavigation(0.0, originDocument, url, lockBackForwardList, !protocolIsJavaScript(url)) { } |
}; |
class ScheduledReload final : public ScheduledNavigation { |
public: |
- ScheduledReload() |
- : ScheduledNavigation(0.0, nullptr, true, true) |
+ static PassOwnPtrWillBeRawPtr<ScheduledReload> create() |
{ |
+ return adoptPtrWillBeNoop(new ScheduledReload); |
} |
virtual void fire(LocalFrame* frame) override |
@@ -163,13 +179,19 @@ public: |
OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicator(); |
frame->loader().reload(NormalReload, KURL(), ClientRedirect); |
} |
+ |
+private: |
+ ScheduledReload() |
+ : ScheduledNavigation(0.0, nullptr, true, true) |
+ { |
+ } |
}; |
class ScheduledPageBlock final : public ScheduledURLNavigation { |
public: |
- ScheduledPageBlock(Document* originDocument, const String& url) |
- : ScheduledURLNavigation(0.0, originDocument, url, true, true) |
+ static PassOwnPtrWillBeRawPtr<ScheduledPageBlock> create(Document* originDocument, const String& url) |
{ |
+ return adoptPtrWillBeNoop(new ScheduledPageBlock(originDocument, url)); |
} |
virtual void fire(LocalFrame* frame) override |
@@ -181,15 +203,19 @@ public: |
request.setClientRedirect(ClientRedirect); |
frame->loader().load(request); |
} |
+private: |
+ ScheduledPageBlock(Document* originDocument, const String& url) |
+ : ScheduledURLNavigation(0.0, originDocument, url, true, true) |
+ { |
+ } |
+ |
}; |
class ScheduledFormSubmission final : public ScheduledNavigation { |
public: |
- ScheduledFormSubmission(Document* document, PassRefPtrWillBeRawPtr<FormSubmission> submission, bool lockBackForwardList) |
- : ScheduledNavigation(0, document, lockBackForwardList, true) |
- , m_submission(submission) |
+ static PassOwnPtrWillBeRawPtr<ScheduledFormSubmission> create(Document* document, PassRefPtrWillBeRawPtr<FormSubmission> submission, bool lockBackForwardList) |
{ |
- ASSERT(m_submission->form()); |
+ return adoptPtrWillBeNoop(new ScheduledFormSubmission(document, submission, lockBackForwardList)); |
} |
virtual void fire(LocalFrame* frame) override |
@@ -203,8 +229,21 @@ public: |
frame->loader().load(frameRequest); |
} |
+ DEFINE_INLINE_VIRTUAL_TRACE() |
+ { |
+ visitor->trace(m_submission); |
+ ScheduledNavigation::trace(visitor); |
+ } |
+ |
private: |
- RefPtrWillBePersistent<FormSubmission> m_submission; |
+ ScheduledFormSubmission(Document* document, PassRefPtrWillBeRawPtr<FormSubmission> submission, bool lockBackForwardList) |
+ : ScheduledNavigation(0, document, lockBackForwardList, true) |
+ , m_submission(submission) |
+ { |
+ ASSERT(m_submission->form()); |
+ } |
+ |
+ RefPtrWillBeMember<FormSubmission> m_submission; |
}; |
NavigationScheduler::NavigationScheduler(LocalFrame* frame) |
@@ -243,7 +282,7 @@ void NavigationScheduler::scheduleRedirect(double delay, const String& url) |
// We want a new back/forward list item if the refresh timeout is > 1 second. |
if (!m_redirect || delay <= m_redirect->delay()) |
- schedule(adoptPtr(new ScheduledRedirect(delay, m_frame->document(), url, delay <= 1))); |
+ schedule(ScheduledRedirect::create(delay, m_frame->document(), url, delay <= 1)); |
} |
bool NavigationScheduler::mustLockBackForwardList(LocalFrame* targetFrame) |
@@ -293,20 +332,20 @@ void NavigationScheduler::scheduleLocationChange(Document* originDocument, const |
} |
} |
- schedule(adoptPtr(new ScheduledLocationChange(originDocument, url, lockBackForwardList))); |
+ schedule(ScheduledLocationChange::create(originDocument, url, lockBackForwardList)); |
} |
void NavigationScheduler::schedulePageBlock(Document* originDocument) |
{ |
ASSERT(m_frame->page()); |
const KURL& url = m_frame->document()->url(); |
- schedule(adoptPtr(new ScheduledPageBlock(originDocument, url))); |
+ schedule(ScheduledPageBlock::create(originDocument, url)); |
} |
void NavigationScheduler::scheduleFormSubmission(Document* document, PassRefPtrWillBeRawPtr<FormSubmission> submission) |
{ |
ASSERT(m_frame->page()); |
- schedule(adoptPtr(new ScheduledFormSubmission(document, submission, mustLockBackForwardList(m_frame)))); |
+ schedule(ScheduledFormSubmission::create(document, submission, mustLockBackForwardList(m_frame))); |
} |
void NavigationScheduler::scheduleReload() |
@@ -315,7 +354,7 @@ void NavigationScheduler::scheduleReload() |
return; |
if (m_frame->document()->url().isEmpty()) |
return; |
- schedule(adoptPtr(new ScheduledReload)); |
+ schedule(ScheduledReload::create()); |
} |
void NavigationScheduler::timerFired(Timer<NavigationScheduler>*) |
@@ -329,12 +368,12 @@ void NavigationScheduler::timerFired(Timer<NavigationScheduler>*) |
RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
- OwnPtr<ScheduledNavigation> redirect(m_redirect.release()); |
+ OwnPtrWillBeRawPtr<ScheduledNavigation> redirect(m_redirect.release()); |
redirect->fire(m_frame); |
InspectorInstrumentation::frameClearedScheduledNavigation(m_frame); |
} |
-void NavigationScheduler::schedule(PassOwnPtr<ScheduledNavigation> redirect) |
+void NavigationScheduler::schedule(PassOwnPtrWillBeRawPtr<ScheduledNavigation> redirect) |
{ |
ASSERT(m_frame->page()); |
@@ -380,6 +419,7 @@ void NavigationScheduler::cancel() |
DEFINE_TRACE(NavigationScheduler) |
{ |
visitor->trace(m_frame); |
+ visitor->trace(m_redirect); |
} |
} // namespace blink |