Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Unified Diff: third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp

Issue 1703883002: Eagerly unregister PostMessageTimer as a context observer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: compile fix Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/frame/LocalDOMWindow.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index a5328c4c1f3c40a48f012e81b7bd3ded02ef1d1c..72bbf9c732205e5ad955cd4e7da23706161dcb77 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -114,14 +114,14 @@ void LocalDOMWindow::WindowFrameObserver::contextDestroyed()
class PostMessageTimer final : public NoBaseWillBeGarbageCollectedFinalized<PostMessageTimer>, public SuspendableTimer {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(PostMessageTimer);
public:
- PostMessageTimer(LocalDOMWindow& window, PassRefPtrWillBeRawPtr<MessageEvent> event, PassRefPtrWillBeRawPtr<LocalDOMWindow> source, SecurityOrigin* targetOrigin, PassRefPtr<ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
+ PostMessageTimer(LocalDOMWindow& window, PassRefPtrWillBeRawPtr<MessageEvent> event, SecurityOrigin* targetOrigin, PassRefPtr<ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
: SuspendableTimer(window.document())
, m_event(event)
, m_window(&window)
, m_targetOrigin(targetOrigin)
, m_stackTrace(stackTrace)
, m_userGestureToken(userGestureToken)
- , m_preventDestruction(false)
+ , m_disposalAllowed(true)
{
m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(executionContext(), "postMessage");
}
@@ -134,10 +134,8 @@ public:
{
SuspendableTimer::stop();
- if (!m_preventDestruction) {
- // Will destroy this object
- m_window->removePostMessageTimer(this);
- }
+ if (m_disposalAllowed)
+ dispose();
}
// Eager finalization is needed to promptly stop this timer object.
@@ -156,22 +154,28 @@ private:
void fired() override
{
InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(executionContext(), m_asyncOperationId);
- // Prevent calls to stop triggered from the event handler to
- // kill this object.
- m_preventDestruction = true;
+ m_disposalAllowed = false;
haraken 2016/02/17 13:52:37 How about moving this line into dispose()?
sof 2016/02/17 13:55:40 I don't see how that's possible given that we want
haraken 2016/02/17 13:57:19 Makes sense.
m_window->postMessageTimerFired(this);
- // Will destroy this object
- m_window->removePostMessageTimer(this);
+ dispose();
InspectorInstrumentation::traceAsyncCallbackCompleted(cookie);
}
+ void dispose()
+ {
+ // Oilpan optimization: unregister as an observer right away.
+ clearContext();
+ // Will destroy this object, now or after the next GC depending
+ // on whether Oilpan is disabled or not.
+ m_window->removePostMessageTimer(this);
+ }
+
RefPtrWillBeMember<MessageEvent> m_event;
RawPtrWillBeMember<LocalDOMWindow> m_window;
RefPtr<SecurityOrigin> m_targetOrigin;
RefPtr<ScriptCallStack> m_stackTrace;
RefPtr<UserGestureToken> m_userGestureToken;
int m_asyncOperationId;
- bool m_preventDestruction;
+ bool m_disposalAllowed;
};
static void updateSuddenTerminationStatus(LocalDOMWindow* domWindow, bool addedListener, FrameLoaderClient::SuddenTerminationDisablerType disablerType)
@@ -675,10 +679,14 @@ Navigator* LocalDOMWindow::navigator() const
return m_navigator.get();
}
-void LocalDOMWindow::schedulePostMessage(PassRefPtrWillBeRawPtr<MessageEvent> event, LocalDOMWindow* source, SecurityOrigin* target, PassRefPtr<ScriptCallStack> stackTrace)
+void LocalDOMWindow::schedulePostMessage(PassRefPtrWillBeRawPtr<MessageEvent> event, SecurityOrigin* target, PassRefPtr<ScriptCallStack> stackTrace)
{
+ // Allowing unbounded amounts of messages to build up for a suspended context
+ // is problematic; consider imposing a limit or other restriction if this
+ // surfaces often as a problem (see crbug.com/587012).
+
// Schedule the message.
- OwnPtrWillBeRawPtr<PostMessageTimer> timer = adoptPtrWillBeNoop(new PostMessageTimer(*this, event, source, target, stackTrace, UserGestureIndicator::currentToken()));
+ OwnPtrWillBeRawPtr<PostMessageTimer> timer = adoptPtrWillBeNoop(new PostMessageTimer(*this, event, target, stackTrace, UserGestureIndicator::currentToken()));
timer->startOneShot(0, BLINK_FROM_HERE);
timer->suspendIfNeeded();
m_postMessageTimers.add(timer.release());
@@ -686,9 +694,8 @@ void LocalDOMWindow::schedulePostMessage(PassRefPtrWillBeRawPtr<MessageEvent> ev
void LocalDOMWindow::postMessageTimerFired(PostMessageTimer* timer)
{
- if (!isCurrentlyDisplayedInFrame()) {
+ if (!isCurrentlyDisplayedInFrame())
return;
- }
RefPtrWillBeRawPtr<MessageEvent> event = timer->event();
« no previous file with comments | « third_party/WebKit/Source/core/frame/LocalDOMWindow.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698