X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2FWebKit%2FSource%2Fcore%2Fframe%2FLocalDOMWindow.cpp;h=135263cd6d446b5d6c5ef1c82057d7c0fb2285fb;hb=490a4587e7e356282cb1453efaf36de4acc9762f;hp=d314335a227d6229cd9c647778e1db78e734d151;hpb=3a51af92707b9c600d06a404c9db8f07fcd50959;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/src/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp index d314335..135263c 100644 --- a/src/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp +++ b/src/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp @@ -117,7 +117,7 @@ class PostMessageTimer FINAL : public SuspendableTimer { public: PostMessageTimer(LocalDOMWindow& window, PassRefPtr message, const String& sourceOrigin, PassRefPtrWillBeRawPtr source, PassOwnPtr channels, SecurityOrigin* targetOrigin, PassRefPtrWillBeRawPtr stackTrace, UserGestureToken* userGestureToken) : SuspendableTimer(window.document()) - , m_window(window) + , m_window(&window) , m_message(message) , m_origin(sourceOrigin) , m_source(source) @@ -140,11 +140,14 @@ public: private: virtual void fired() OVERRIDE { - m_window->postMessageTimerFired(adoptPtr(this)); + m_window->postMessageTimerFired(this); // This object is deleted now. } - RefPtrWillBePersistent m_window; + // FIXME: Oilpan: This raw pointer is safe because the PostMessageTimer is + // owned by the LocalDOMWindow. Ideally PostMessageTimer should be moved to + // the heap and use Member. + LocalDOMWindow* m_window; RefPtr m_message; String m_origin; RefPtrWillBePersistent m_source; @@ -864,30 +867,34 @@ void LocalDOMWindow::postMessage(PassRefPtr message, cons stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true); // Schedule the message. - PostMessageTimer* timer = new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release(), UserGestureIndicator::currentToken()); + OwnPtr timer = adoptPtr(new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release(), UserGestureIndicator::currentToken())); timer->startOneShot(0, FROM_HERE); timer->suspendIfNeeded(); + m_postMessageTimers.add(timer.release()); } -void LocalDOMWindow::postMessageTimerFired(PassOwnPtr t) +void LocalDOMWindow::postMessageTimerFired(PostMessageTimer* timer) { - OwnPtr timer(t); - - if (!isCurrentlyDisplayedInFrame()) + if (!isCurrentlyDisplayedInFrame()) { + m_postMessageTimers.remove(timer); return; + } RefPtrWillBeRawPtr event = timer->event(); // Give the embedder a chance to intercept this postMessage because this // LocalDOMWindow might be a proxy for another in browsers that support // postMessage calls across WebKit instances. - if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), event.get())) + if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), event.get())) { + m_postMessageTimers.remove(timer); return; + } UserGestureIndicator gestureIndicator(timer->userGestureToken()); event->entangleMessagePorts(document()); dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->stackTrace()); + m_postMessageTimers.remove(timer); } void LocalDOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr event, PassRefPtrWillBeRawPtr stackTrace)