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

Side by Side Diff: Source/core/frame/DOMWindow.cpp

Issue 209363002: Keep the user gesture when postMessage() across frames. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 6 years, 9 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 unified diff | Download patch
« no previous file with comments | « LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 #include "wtf/text/WTFString.h" 104 #include "wtf/text/WTFString.h"
105 #include <algorithm> 105 #include <algorithm>
106 106
107 using std::min; 107 using std::min;
108 using std::max; 108 using std::max;
109 109
110 namespace WebCore { 110 namespace WebCore {
111 111
112 class PostMessageTimer FINAL : public SuspendableTimer { 112 class PostMessageTimer FINAL : public SuspendableTimer {
113 public: 113 public:
114 PostMessageTimer(DOMWindow& window, PassRefPtr<SerializedScriptValue> messag e, const String& sourceOrigin, PassRefPtrWillBeRawPtr<DOMWindow> source, PassOwn Ptr<MessagePortChannelArray> channels, SecurityOrigin* targetOrigin, PassRefPtr< ScriptCallStack> stackTrace) 114 PostMessageTimer(DOMWindow& window, PassRefPtr<SerializedScriptValue> messag e, const String& sourceOrigin, PassRefPtrWillBeRawPtr<DOMWindow> source, PassOwn Ptr<MessagePortChannelArray> channels, SecurityOrigin* targetOrigin, PassRefPtr< ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
115 : SuspendableTimer(window.document()) 115 : SuspendableTimer(window.document())
116 , m_window(&window) 116 , m_window(&window)
117 , m_message(message) 117 , m_message(message)
118 , m_origin(sourceOrigin) 118 , m_origin(sourceOrigin)
119 , m_source(source) 119 , m_source(source)
120 , m_channels(channels) 120 , m_channels(channels)
121 , m_targetOrigin(targetOrigin) 121 , m_targetOrigin(targetOrigin)
122 , m_stackTrace(stackTrace) 122 , m_stackTrace(stackTrace)
123 , m_userGestureToken(userGestureToken)
123 { 124 {
124 } 125 }
125 126
126 PassRefPtr<MessageEvent> event() 127 PassRefPtr<MessageEvent> event()
127 { 128 {
128 return MessageEvent::create(m_channels.release(), m_message, m_origin, S tring(), m_source.get()); 129 return MessageEvent::create(m_channels.release(), m_message, m_origin, S tring(), m_source.get());
129 130
130 } 131 }
131 SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); } 132 SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); }
132 ScriptCallStack* stackTrace() const { return m_stackTrace.get(); } 133 ScriptCallStack* stackTrace() const { return m_stackTrace.get(); }
134 UserGestureToken* userGestureToken() const { return m_userGestureToken.get() ; }
133 135
134 private: 136 private:
135 virtual void fired() OVERRIDE 137 virtual void fired() OVERRIDE
136 { 138 {
137 m_window->postMessageTimerFired(adoptPtr(this)); 139 m_window->postMessageTimerFired(adoptPtr(this));
138 // This object is deleted now. 140 // This object is deleted now.
139 } 141 }
140 142
141 RefPtrWillBePersistent<DOMWindow> m_window; 143 RefPtrWillBePersistent<DOMWindow> m_window;
142 RefPtr<SerializedScriptValue> m_message; 144 RefPtr<SerializedScriptValue> m_message;
143 String m_origin; 145 String m_origin;
144 RefPtrWillBePersistent<DOMWindow> m_source; 146 RefPtrWillBePersistent<DOMWindow> m_source;
145 OwnPtr<MessagePortChannelArray> m_channels; 147 OwnPtr<MessagePortChannelArray> m_channels;
146 RefPtr<SecurityOrigin> m_targetOrigin; 148 RefPtr<SecurityOrigin> m_targetOrigin;
147 RefPtr<ScriptCallStack> m_stackTrace; 149 RefPtr<ScriptCallStack> m_stackTrace;
150 RefPtr<UserGestureToken> m_userGestureToken;
148 }; 151 };
149 152
150 static void disableSuddenTermination() 153 static void disableSuddenTermination()
151 { 154 {
152 blink::Platform::current()->suddenTerminationChanged(false); 155 blink::Platform::current()->suddenTerminationChanged(false);
153 } 156 }
154 157
155 static void enableSuddenTermination() 158 static void enableSuddenTermination()
156 { 159 {
157 blink::Platform::current()->suddenTerminationChanged(true); 160 blink::Platform::current()->suddenTerminationChanged(true);
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 if (!sourceDocument) 847 if (!sourceDocument)
845 return; 848 return;
846 String sourceOrigin = sourceDocument->securityOrigin()->toString(); 849 String sourceOrigin = sourceDocument->securityOrigin()->toString();
847 850
848 // Capture stack trace only when inspector front-end is loaded as it may be time consuming. 851 // Capture stack trace only when inspector front-end is loaded as it may be time consuming.
849 RefPtr<ScriptCallStack> stackTrace; 852 RefPtr<ScriptCallStack> stackTrace;
850 if (InspectorInstrumentation::consoleAgentEnabled(sourceDocument)) 853 if (InspectorInstrumentation::consoleAgentEnabled(sourceDocument))
851 stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCa pture, true); 854 stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCa pture, true);
852 855
853 // Schedule the message. 856 // Schedule the message.
854 PostMessageTimer* timer = new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release()); 857 PostMessageTimer* timer = new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release(), UserGestureIndi cator::currentToken());
855 timer->startOneShot(0, FROM_HERE); 858 timer->startOneShot(0, FROM_HERE);
856 timer->suspendIfNeeded(); 859 timer->suspendIfNeeded();
857 } 860 }
858 861
859 void DOMWindow::postMessageTimerFired(PassOwnPtr<PostMessageTimer> t) 862 void DOMWindow::postMessageTimerFired(PassOwnPtr<PostMessageTimer> t)
860 { 863 {
861 OwnPtr<PostMessageTimer> timer(t); 864 OwnPtr<PostMessageTimer> timer(t);
862 865
863 if (!isCurrentlyDisplayedInFrame()) 866 if (!isCurrentlyDisplayedInFrame())
864 return; 867 return;
865 868
866 RefPtr<MessageEvent> event = timer->event(); 869 RefPtr<MessageEvent> event = timer->event();
867 870
868 // Give the embedder a chance to intercept this postMessage because this 871 // Give the embedder a chance to intercept this postMessage because this
869 // DOMWindow might be a proxy for another in browsers that support 872 // DOMWindow might be a proxy for another in browsers that support
870 // postMessage calls across WebKit instances. 873 // postMessage calls across WebKit instances.
871 if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targ etOrigin(), event.get())) 874 if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targ etOrigin(), event.get()))
Charlie Reis 2014/03/28 16:22:38 What about cross-process postMessage? Seems like
872 return; 875 return;
873 876
877 UserGestureIndicator gestureIndicator(timer->userGestureToken());
878
874 event->entangleMessagePorts(document()); 879 event->entangleMessagePorts(document());
875 dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->sta ckTrace()); 880 dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->sta ckTrace());
876 } 881 }
877 882
878 void DOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTarg etOrigin, PassRefPtr<Event> event, PassRefPtr<ScriptCallStack> stackTrace) 883 void DOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTarg etOrigin, PassRefPtr<Event> event, PassRefPtr<ScriptCallStack> stackTrace)
879 { 884 {
880 if (intendedTargetOrigin) { 885 if (intendedTargetOrigin) {
881 // Check target origin now since the target document may have changed si nce the timer was scheduled. 886 // Check target origin now since the target document may have changed si nce the timer was scheduled.
882 if (!intendedTargetOrigin->isSameSchemeHostPort(document()->securityOrig in())) { 887 if (!intendedTargetOrigin->isSameSchemeHostPort(document()->securityOrig in())) {
883 String message = ExceptionMessages::failedToExecute("postMessage", " DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() + "') does not match the recipient window's origin ('" + document()->securityOrig in()->toString() + "')."); 888 String message = ExceptionMessages::failedToExecute("postMessage", " DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() + "') does not match the recipient window's origin ('" + document()->securityOrig in()->toString() + "').");
(...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after
1878 visitor->trace(m_console); 1883 visitor->trace(m_console);
1879 visitor->trace(m_navigator); 1884 visitor->trace(m_navigator);
1880 visitor->trace(m_location); 1885 visitor->trace(m_location);
1881 visitor->trace(m_sessionStorage); 1886 visitor->trace(m_sessionStorage);
1882 visitor->trace(m_localStorage); 1887 visitor->trace(m_localStorage);
1883 visitor->trace(m_applicationCache); 1888 visitor->trace(m_applicationCache);
1884 visitor->trace(m_performance); 1889 visitor->trace(m_performance);
1885 } 1890 }
1886 1891
1887 } // namespace WebCore 1892 } // namespace WebCore
OLDNEW
« no previous file with comments | « LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698