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

Side by Side Diff: Source/core/page/CreateWindow.cpp

Issue 1163543002: Reland "Correctly set ScriptState in the image loader microtask" (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: git cl try Created 5 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/page/ChromeClient.h ('k') | Source/web/ChromeClientImpl.h » ('j') | 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 29 matching lines...) Expand all
40 #include "core/page/WindowFeatures.h" 40 #include "core/page/WindowFeatures.h"
41 #include "platform/UserGestureIndicator.h" 41 #include "platform/UserGestureIndicator.h"
42 #include "platform/network/ResourceRequest.h" 42 #include "platform/network/ResourceRequest.h"
43 #include "platform/weborigin/KURL.h" 43 #include "platform/weborigin/KURL.h"
44 #include "platform/weborigin/SecurityOrigin.h" 44 #include "platform/weborigin/SecurityOrigin.h"
45 #include "platform/weborigin/SecurityPolicy.h" 45 #include "platform/weborigin/SecurityPolicy.h"
46 #include "public/platform/WebURLRequest.h" 46 #include "public/platform/WebURLRequest.h"
47 47
48 namespace blink { 48 namespace blink {
49 49
50 static Frame* createWindow(LocalFrame& openerFrame, LocalFrame& lookupFrame, con st FrameLoadRequest& request, const WindowFeatures& features, NavigationPolicy p olicy, ShouldSendReferrer shouldSendReferrer) 50 static Frame* createWindow(LocalFrame& openerFrame, LocalFrame& lookupFrame, con st FrameLoadRequest& request, const WindowFeatures& features, NavigationPolicy p olicy, ShouldSendReferrer shouldSendReferrer, CreateWindowReason createWindowRea son)
51 { 51 {
52 ASSERT(!features.dialog || request.frameName().isEmpty()); 52 ASSERT(!features.dialog || request.frameName().isEmpty());
53 ASSERT(request.resourceRequest().requestorOrigin() || openerFrame.document() ->url().isEmpty()); 53 ASSERT(request.resourceRequest().requestorOrigin() || openerFrame.document() ->url().isEmpty());
54 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeAuxi liary); 54 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeAuxi liary);
55 55
56 if (!request.frameName().isEmpty() && request.frameName() != "_blank" && pol icy == NavigationPolicyIgnore) { 56 if (!request.frameName().isEmpty() && request.frameName() != "_blank" && pol icy == NavigationPolicyIgnore) {
57 if (Frame* frame = lookupFrame.findFrameForNavigation(request.frameName( ), openerFrame)) { 57 if (Frame* frame = lookupFrame.findFrameForNavigation(request.frameName( ), openerFrame)) {
58 if (request.frameName() != "_self") { 58 if (request.frameName() != "_self") {
59 if (FrameHost* host = frame->host()) { 59 if (FrameHost* host = frame->host()) {
60 if (host == openerFrame.host()) 60 if (host == openerFrame.host())
(...skipping 13 matching lines...) Expand all
74 return nullptr; 74 return nullptr;
75 } 75 }
76 76
77 if (openerFrame.settings() && !openerFrame.settings()->supportsMultipleWindo ws()) 77 if (openerFrame.settings() && !openerFrame.settings()->supportsMultipleWindo ws())
78 return openerFrame.tree().top(); 78 return openerFrame.tree().top();
79 79
80 FrameHost* oldHost = openerFrame.host(); 80 FrameHost* oldHost = openerFrame.host();
81 if (!oldHost) 81 if (!oldHost)
82 return nullptr; 82 return nullptr;
83 83
84 Page* page = oldHost->chromeClient().createWindow(&openerFrame, request, fea tures, policy, shouldSendReferrer); 84 Page* page = oldHost->chromeClient().createWindow(&openerFrame, request, fea tures, policy, shouldSendReferrer, createWindowReason);
85 if (!page) 85 if (!page)
86 return nullptr; 86 return nullptr;
87 FrameHost* host = &page->frameHost(); 87 FrameHost* host = &page->frameHost();
88 88
89 ASSERT(page->mainFrame()); 89 ASSERT(page->mainFrame());
90 Frame& frame = *page->mainFrame(); 90 Frame& frame = *page->mainFrame();
91 91
92 if (request.frameName() != "_blank") 92 if (request.frameName() != "_blank")
93 frame.tree().setName(request.frameName()); 93 frame.tree().setName(request.frameName());
94 94
95 host->chromeClient().setWindowFeatures(features); 95 host->chromeClient().setWindowFeatures(features);
96 96
97 // 'x' and 'y' specify the location of the window, while 'width' and 'height ' 97 // 'x' and 'y' specify the location of the window, while 'width' and 'height '
98 // specify the size of the viewport. We can only resize the window, so adjus t 98 // specify the size of the viewport. We can only resize the window, so adjus t
99 // for the difference between the window size and the viewport size. 99 // for the difference between the window size and the viewport size.
100 100
101 IntRect windowRect = host->chromeClient().windowRect(); 101 IntRect windowRect = host->chromeClient().windowRect();
102 IntSize viewportSize = host->chromeClient().pageRect().size(); 102 IntSize viewportSize = host->chromeClient().pageRect().size();
103 103
104 if (features.xSet) 104 if (features.xSet)
105 windowRect.setX(features.x); 105 windowRect.setX(features.x);
106 if (features.ySet) 106 if (features.ySet)
107 windowRect.setY(features.y); 107 windowRect.setY(features.y);
108 if (features.widthSet) 108 if (features.widthSet)
109 windowRect.setWidth(features.width + (windowRect.width() - viewportSize. width())); 109 windowRect.setWidth(features.width + (windowRect.width() - viewportSize. width()));
110 if (features.heightSet) 110 if (features.heightSet)
111 windowRect.setHeight(features.height + (windowRect.height() - viewportSi ze.height())); 111 windowRect.setHeight(features.height + (windowRect.height() - viewportSi ze.height()));
112 112
113 host->chromeClient().setWindowRectWithAdjustment(windowRect); 113 host->chromeClient().setWindowRectWithAdjustment(windowRect);
114 host->chromeClient().show(policy); 114 host->chromeClient().show(policy, createWindowReason);
115 115
116 // TODO(japhet): There's currently no way to set sandbox flags on a RemoteFr ame and have it propagate 116 // TODO(japhet): There's currently no way to set sandbox flags on a RemoteFr ame and have it propagate
117 // to the real frame in a different process. See crbug.com/483584. 117 // to the real frame in a different process. See crbug.com/483584.
118 if (frame.isLocalFrame() && openerFrame.document()->isSandboxed(SandboxPropa gatesToAuxiliaryBrowsingContexts)) 118 if (frame.isLocalFrame() && openerFrame.document()->isSandboxed(SandboxPropa gatesToAuxiliaryBrowsingContexts))
119 toLocalFrame(&frame)->loader().forceSandboxFlags(openerFrame.document()- >sandboxFlags()); 119 toLocalFrame(&frame)->loader().forceSandboxFlags(openerFrame.document()- >sandboxFlags());
120 120
121 return &frame; 121 return &frame;
122 } 122 }
123 123
124 DOMWindow* createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures& windowFeatures, 124 DOMWindow* createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures& windowFeatures,
(...skipping 19 matching lines...) Expand all
144 // assumes no responsibility for generating an embedder-initiated navigation 's referrer, 144 // assumes no responsibility for generating an embedder-initiated navigation 's referrer,
145 // so we need to ensure the proper referrer is set now. 145 // so we need to ensure the proper referrer is set now.
146 frameRequest.resourceRequest().setHTTPReferrer(SecurityPolicy::generateRefer rer(activeFrame->document()->referrerPolicy(), completedURL, activeFrame->docume nt()->outgoingReferrer())); 146 frameRequest.resourceRequest().setHTTPReferrer(SecurityPolicy::generateRefer rer(activeFrame->document()->referrerPolicy(), completedURL, activeFrame->docume nt()->outgoingReferrer()));
147 147
148 // Records HasUserGesture before the value is invalidated inside createWindo w(LocalFrame& openerFrame, ...). 148 // Records HasUserGesture before the value is invalidated inside createWindo w(LocalFrame& openerFrame, ...).
149 // This value will be set in ResourceRequest loaded in a new LocalFrame. 149 // This value will be set in ResourceRequest loaded in a new LocalFrame.
150 bool hasUserGesture = UserGestureIndicator::processingUserGesture(); 150 bool hasUserGesture = UserGestureIndicator::processingUserGesture();
151 151
152 // We pass the opener frame for the lookupFrame in case the active frame is different from 152 // We pass the opener frame for the lookupFrame in case the active frame is different from
153 // the opener frame, and the name references a frame relative to the opener frame. 153 // the opener frame, and the name references a frame relative to the opener frame.
154 Frame* newFrame = createWindow(*activeFrame, openerFrame, frameRequest, wind owFeatures, NavigationPolicyIgnore, MaybeSendReferrer); 154 Frame* newFrame = createWindow(*activeFrame, openerFrame, frameRequest, wind owFeatures, NavigationPolicyIgnore, MaybeSendReferrer, CreatedFromWindowOpen);
155 if (!newFrame) 155 if (!newFrame)
156 return nullptr; 156 return nullptr;
157 157
158 newFrame->client()->setOpener(&openerFrame); 158 newFrame->client()->setOpener(&openerFrame);
159 159
160 if (!newFrame->domWindow()->isInsecureScriptAccess(callingWindow, completedU RL)) 160 if (!newFrame->domWindow()->isInsecureScriptAccess(callingWindow, completedU RL))
161 newFrame->navigate(*callingWindow.document(), completedURL, false, hasUs erGesture ? UserGestureStatus::Active : UserGestureStatus::None); 161 newFrame->navigate(*callingWindow.document(), completedURL, false, hasUs erGesture ? UserGestureStatus::Active : UserGestureStatus::None);
162 return newFrame->domWindow(); 162 return newFrame->domWindow();
163 } 163 }
164 164
165 void createWindowForRequest(const FrameLoadRequest& request, LocalFrame& openerF rame, NavigationPolicy policy, ShouldSendReferrer shouldSendReferrer) 165 void createWindowForRequest(const FrameLoadRequest& request, LocalFrame& openerF rame, NavigationPolicy policy, ShouldSendReferrer shouldSendReferrer)
166 { 166 {
167 ASSERT(request.resourceRequest().requestorOrigin() || (openerFrame.document( ) && openerFrame.document()->url().isEmpty())); 167 ASSERT(request.resourceRequest().requestorOrigin() || (openerFrame.document( ) && openerFrame.document()->url().isEmpty()));
168 168
169 if (openerFrame.document()->pageDismissalEventBeingDispatched() != Document: :NoDismissal) 169 if (openerFrame.document()->pageDismissalEventBeingDispatched() != Document: :NoDismissal)
170 return; 170 return;
171 171
172 if (openerFrame.document() && openerFrame.document()->isSandboxed(SandboxPop ups)) 172 if (openerFrame.document() && openerFrame.document()->isSandboxed(SandboxPop ups))
173 return; 173 return;
174 174
175 if (!LocalDOMWindow::allowPopUp(openerFrame)) 175 if (!LocalDOMWindow::allowPopUp(openerFrame))
176 return; 176 return;
177 177
178 if (policy == NavigationPolicyCurrentTab) 178 if (policy == NavigationPolicyCurrentTab)
179 policy = NavigationPolicyNewForegroundTab; 179 policy = NavigationPolicyNewForegroundTab;
180 180
181 WindowFeatures features; 181 WindowFeatures features;
182 Frame* newFrame = createWindow(openerFrame, openerFrame, request, features, policy, shouldSendReferrer); 182 Frame* newFrame = createWindow(openerFrame, openerFrame, request, features, policy, shouldSendReferrer, CreatedFromLoadRequest);
183 if (!newFrame) 183 if (!newFrame)
184 return; 184 return;
185 if (shouldSendReferrer == MaybeSendReferrer) { 185 if (shouldSendReferrer == MaybeSendReferrer) {
186 newFrame->client()->setOpener(&openerFrame); 186 newFrame->client()->setOpener(&openerFrame);
187 // TODO(japhet): Does ReferrerPolicy need to be proagated for RemoteFram es? 187 // TODO(japhet): Does ReferrerPolicy need to be proagated for RemoteFram es?
188 if (newFrame->isLocalFrame()) 188 if (newFrame->isLocalFrame())
189 toLocalFrame(newFrame)->document()->setReferrerPolicy(openerFrame.do cument()->referrerPolicy()); 189 toLocalFrame(newFrame)->document()->setReferrerPolicy(openerFrame.do cument()->referrerPolicy());
190 } 190 }
191 191
192 // TODO(japhet): Form submissions on RemoteFrames don't work yet. 192 // TODO(japhet): Form submissions on RemoteFrames don't work yet.
193 FrameLoadRequest newRequest(0, request.resourceRequest()); 193 FrameLoadRequest newRequest(0, request.resourceRequest());
194 newRequest.setForm(request.form()); 194 newRequest.setForm(request.form());
195 if (newFrame->isLocalFrame()) 195 if (newFrame->isLocalFrame())
196 toLocalFrame(newFrame)->loader().load(newRequest); 196 toLocalFrame(newFrame)->loader().load(newRequest);
197 } 197 }
198 198
199 } // namespace blink 199 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/page/ChromeClient.h ('k') | Source/web/ChromeClientImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698