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

Side by Side Diff: third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp

Issue 2782663002: [Presentation API] Move sandbox check to PresentationRequest constructor. (Closed)
Patch Set: Respond to imcheng@ comments Created 3 years, 8 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 | « third_party/WebKit/LayoutTests/presentation/resources/iframe-sandbox.html ('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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/presentation/PresentationRequest.h" 5 #include "modules/presentation/PresentationRequest.h"
6 6
7 #include "bindings/core/v8/CallbackPromiseAdapter.h" 7 #include "bindings/core/v8/CallbackPromiseAdapter.h"
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptPromise.h" 9 #include "bindings/core/v8/ScriptPromise.h"
10 #include "bindings/core/v8/ScriptPromiseResolver.h" 10 #include "bindings/core/v8/ScriptPromiseResolver.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 return controller ? controller->client() : nullptr; 44 return controller ? controller->client() : nullptr;
45 } 45 }
46 46
47 Settings* settings(ExecutionContext* executionContext) { 47 Settings* settings(ExecutionContext* executionContext) {
48 DCHECK(executionContext); 48 DCHECK(executionContext);
49 49
50 Document* document = toDocument(executionContext); 50 Document* document = toDocument(executionContext);
51 return document->settings(); 51 return document->settings();
52 } 52 }
53 53
54 ScriptPromise rejectWithSandBoxException(ScriptState* scriptState) {
55 return ScriptPromise::rejectWithDOMException(
56 scriptState, DOMException::create(SecurityError,
57 "The document is sandboxed and lacks "
58 "the 'allow-presentation' flag."));
59 }
60
61 } // anonymous namespace 54 } // anonymous namespace
62 55
63 // static 56 // static
64 PresentationRequest* PresentationRequest::create( 57 PresentationRequest* PresentationRequest::create(
65 ExecutionContext* executionContext, 58 ExecutionContext* executionContext,
66 const String& url, 59 const String& url,
67 ExceptionState& exceptionState) { 60 ExceptionState& exceptionState) {
68 Vector<String> urls(1); 61 Vector<String> urls(1);
69 urls[0] = url; 62 urls[0] = url;
70 return create(executionContext, urls, exceptionState); 63 return create(executionContext, urls, exceptionState);
71 } 64 }
72 65
73 PresentationRequest* PresentationRequest::create( 66 PresentationRequest* PresentationRequest::create(
74 ExecutionContext* executionContext, 67 ExecutionContext* executionContext,
75 const Vector<String>& urls, 68 const Vector<String>& urls,
76 ExceptionState& exceptionState) { 69 ExceptionState& exceptionState) {
70 if (toDocument(executionContext)->isSandboxed(SandboxPresentation)) {
71 exceptionState.throwSecurityError(
72 "The document is sandboxed and lacks the 'allow-presentation' flag.");
73 return nullptr;
74 }
75
77 if (urls.isEmpty()) { 76 if (urls.isEmpty()) {
78 exceptionState.throwDOMException(NotSupportedError, 77 exceptionState.throwDOMException(NotSupportedError,
79 "Do not support empty sequence of URLs."); 78 "Do not support empty sequence of URLs.");
80 return nullptr; 79 return nullptr;
81 } 80 }
82 81
83 Vector<KURL> parsedUrls(urls.size()); 82 Vector<KURL> parsedUrls(urls.size());
84 for (size_t i = 0; i < urls.size(); ++i) { 83 for (size_t i = 0; i < urls.size(); ++i) {
85 const KURL& parsedUrl = KURL(executionContext->url(), urls[i]); 84 const KURL& parsedUrl = KURL(executionContext->url(), urls[i]);
86 85
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 bool isUserGestureRequired = 132 bool isUserGestureRequired =
134 !contextSettings || contextSettings->getPresentationRequiresUserGesture(); 133 !contextSettings || contextSettings->getPresentationRequiresUserGesture();
135 134
136 if (isUserGestureRequired && !UserGestureIndicator::utilizeUserGesture()) 135 if (isUserGestureRequired && !UserGestureIndicator::utilizeUserGesture())
137 return ScriptPromise::rejectWithDOMException( 136 return ScriptPromise::rejectWithDOMException(
138 scriptState, 137 scriptState,
139 DOMException::create( 138 DOMException::create(
140 InvalidAccessError, 139 InvalidAccessError,
141 "PresentationRequest::start() requires user gesture.")); 140 "PresentationRequest::start() requires user gesture."));
142 141
143 if (toDocument(getExecutionContext())->isSandboxed(SandboxPresentation))
144 return rejectWithSandBoxException(scriptState);
145 142
146 WebPresentationClient* client = presentationClient(getExecutionContext()); 143 WebPresentationClient* client = presentationClient(getExecutionContext());
147 if (!client) 144 if (!client)
148 return ScriptPromise::rejectWithDOMException( 145 return ScriptPromise::rejectWithDOMException(
149 scriptState, 146 scriptState,
150 DOMException::create( 147 DOMException::create(
151 InvalidStateError, 148 InvalidStateError,
152 "The PresentationRequest is no longer associated to a frame.")); 149 "The PresentationRequest is no longer associated to a frame."));
153 150
154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 151 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
155 client->startPresentation( 152 client->startPresentation(
156 m_urls, WTF::makeUnique<PresentationConnectionCallbacks>(resolver, this)); 153 m_urls, WTF::makeUnique<PresentationConnectionCallbacks>(resolver, this));
157 return resolver->promise(); 154 return resolver->promise();
158 } 155 }
159 156
160 ScriptPromise PresentationRequest::reconnect(ScriptState* scriptState, 157 ScriptPromise PresentationRequest::reconnect(ScriptState* scriptState,
161 const String& id) { 158 const String& id) {
162 if (toDocument(getExecutionContext())->isSandboxed(SandboxPresentation))
163 return rejectWithSandBoxException(scriptState);
164
165 WebPresentationClient* client = presentationClient(getExecutionContext()); 159 WebPresentationClient* client = presentationClient(getExecutionContext());
166 if (!client) 160 if (!client)
167 return ScriptPromise::rejectWithDOMException( 161 return ScriptPromise::rejectWithDOMException(
168 scriptState, 162 scriptState,
169 DOMException::create( 163 DOMException::create(
170 InvalidStateError, 164 InvalidStateError,
171 "The PresentationRequest is no longer associated to a frame.")); 165 "The PresentationRequest is no longer associated to a frame."));
172 166
173 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 167 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
174 168
(...skipping 10 matching lines...) Expand all
185 resolver, existingConnection)); 179 resolver, existingConnection));
186 } else { 180 } else {
187 client->reconnectPresentation( 181 client->reconnectPresentation(
188 m_urls, id, 182 m_urls, id,
189 WTF::makeUnique<PresentationConnectionCallbacks>(resolver, this)); 183 WTF::makeUnique<PresentationConnectionCallbacks>(resolver, this));
190 } 184 }
191 return resolver->promise(); 185 return resolver->promise();
192 } 186 }
193 187
194 ScriptPromise PresentationRequest::getAvailability(ScriptState* scriptState) { 188 ScriptPromise PresentationRequest::getAvailability(ScriptState* scriptState) {
195 if (toDocument(getExecutionContext())->isSandboxed(SandboxPresentation))
196 return rejectWithSandBoxException(scriptState);
197
198 WebPresentationClient* client = presentationClient(getExecutionContext()); 189 WebPresentationClient* client = presentationClient(getExecutionContext());
199 if (!client) 190 if (!client)
200 return ScriptPromise::rejectWithDOMException( 191 return ScriptPromise::rejectWithDOMException(
201 scriptState, 192 scriptState,
202 DOMException::create( 193 DOMException::create(
203 InvalidStateError, 194 InvalidStateError,
204 "The PresentationRequest is no longer associated to a frame.")); 195 "The PresentationRequest is no longer associated to a frame."));
205 196
206 if (!m_availabilityProperty) { 197 if (!m_availabilityProperty) {
207 m_availabilityProperty = new PresentationAvailabilityProperty( 198 m_availabilityProperty = new PresentationAvailabilityProperty(
(...skipping 29 matching lines...) Expand all
237 if (executionContext->isSecureContext()) { 228 if (executionContext->isSecureContext()) {
238 UseCounter::count(executionContext, 229 UseCounter::count(executionContext,
239 UseCounter::PresentationRequestSecureOrigin); 230 UseCounter::PresentationRequestSecureOrigin);
240 } else { 231 } else {
241 UseCounter::count(executionContext, 232 UseCounter::count(executionContext,
242 UseCounter::PresentationRequestInsecureOrigin); 233 UseCounter::PresentationRequestInsecureOrigin);
243 } 234 }
244 } 235 }
245 236
246 } // namespace blink 237 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/presentation/resources/iframe-sandbox.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698