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

Side by Side Diff: third_party/WebKit/Source/modules/vr/VRDisplay.cpp

Issue 2689563008: Fix WebVR does not properly stop presenting if requestPresent rejects. (Closed)
Patch Set: Created 3 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 unified diff | Download patch
« no previous file with comments | « no previous file | 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/vr/VRDisplay.h" 5 #include "modules/vr/VRDisplay.h"
6 6
7 #include "core/css/StylePropertySet.h" 7 #include "core/css/StylePropertySet.h"
8 #include "core/dom/DOMException.h" 8 #include "core/dom/DOMException.h"
9 #include "core/dom/DocumentUserGestureToken.h" 9 #include "core/dom/DocumentUserGestureToken.h"
10 #include "core/dom/FrameRequestCallback.h" 10 #include "core/dom/FrameRequestCallback.h"
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 if (!doc || !Fullscreen::fullscreenEnabled(*doc)) { 244 if (!doc || !Fullscreen::fullscreenEnabled(*doc)) {
245 DOMException* exception = 245 DOMException* exception =
246 DOMException::create(InvalidStateError, "Fullscreen is not enabled."); 246 DOMException::create(InvalidStateError, "Fullscreen is not enabled.");
247 resolver->reject(exception); 247 resolver->reject(exception);
248 ReportPresentationResult(PresentationResult::FullscreenNotEnabled); 248 ReportPresentationResult(PresentationResult::FullscreenNotEnabled);
249 return promise; 249 return promise;
250 } 250 }
251 251
252 // A valid number of layers must be provided in order to present. 252 // A valid number of layers must be provided in order to present.
253 if (layers.size() == 0 || layers.size() > m_capabilities->maxLayers()) { 253 if (layers.size() == 0 || layers.size() > m_capabilities->maxLayers()) {
254 forceExitPresent(); 254 if (m_isPresenting) {
mthiesse 2017/02/13 15:33:34 You should fix VRDisplay::forceExitPresent(), rath
shaobo.yan 2017/02/14 06:12:35 Done.
255 if (m_display) {
256 m_display->ExitPresent();
257 } else {
258 forceExitPresent();
259 }
260 }
255 DOMException* exception = 261 DOMException* exception =
256 DOMException::create(InvalidStateError, "Invalid number of layers."); 262 DOMException::create(InvalidStateError, "Invalid number of layers.");
257 resolver->reject(exception); 263 resolver->reject(exception);
258 ReportPresentationResult(PresentationResult::InvalidNumberOfLayers); 264 ReportPresentationResult(PresentationResult::InvalidNumberOfLayers);
259 return promise; 265 return promise;
260 } 266 }
261 267
262 // If what we were given has an invalid source, need to exit fullscreen with 268 // If what we were given has an invalid source, need to exit fullscreen with
263 // previous, valid source, so delay m_layer reassignment 269 // previous, valid source, so delay m_layer reassignment
264 if (!layers[0].source()) { 270 if (!layers[0].source()) {
265 forceExitPresent(); 271 if (m_isPresenting) {
272 if (m_display) {
273 m_display->ExitPresent();
274 } else {
275 forceExitPresent();
276 }
277 }
266 DOMException* exception = 278 DOMException* exception =
267 DOMException::create(InvalidStateError, "Invalid layer source."); 279 DOMException::create(InvalidStateError, "Invalid layer source.");
268 resolver->reject(exception); 280 resolver->reject(exception);
269 ReportPresentationResult(PresentationResult::InvalidLayerSource); 281 ReportPresentationResult(PresentationResult::InvalidLayerSource);
270 return promise; 282 return promise;
271 } 283 }
272 m_layer = layers[0]; 284 m_layer = layers[0];
273 285
274 CanvasRenderingContext* renderingContext = 286 CanvasRenderingContext* renderingContext =
275 m_layer.source()->renderingContext(); 287 m_layer.source()->renderingContext();
276 288
277 if (!renderingContext || !renderingContext->is3d()) { 289 if (!renderingContext || !renderingContext->is3d()) {
278 forceExitPresent(); 290 if (m_isPresenting) {
291 if (m_display) {
292 m_display->ExitPresent();
293 } else {
294 forceExitPresent();
295 }
296 }
279 DOMException* exception = DOMException::create( 297 DOMException* exception = DOMException::create(
280 InvalidStateError, "Layer source must have a WebGLRenderingContext"); 298 InvalidStateError, "Layer source must have a WebGLRenderingContext");
281 resolver->reject(exception); 299 resolver->reject(exception);
282 ReportPresentationResult( 300 ReportPresentationResult(
283 PresentationResult::LayerSourceMissingWebGLContext); 301 PresentationResult::LayerSourceMissingWebGLContext);
284 return promise; 302 return promise;
285 } 303 }
286 304
287 // Save the WebGL script and underlying GL contexts for use by submitFrame(). 305 // Save the WebGL script and underlying GL contexts for use by submitFrame().
288 m_renderingContext = toWebGLRenderingContextBase(renderingContext); 306 m_renderingContext = toWebGLRenderingContextBase(renderingContext);
289 m_contextGL = m_renderingContext->contextGL(); 307 m_contextGL = m_renderingContext->contextGL();
290 308
291 if ((m_layer.leftBounds().size() != 0 && m_layer.leftBounds().size() != 4) || 309 if ((m_layer.leftBounds().size() != 0 && m_layer.leftBounds().size() != 4) ||
292 (m_layer.rightBounds().size() != 0 && 310 (m_layer.rightBounds().size() != 0 &&
293 m_layer.rightBounds().size() != 4)) { 311 m_layer.rightBounds().size() != 4)) {
294 forceExitPresent(); 312 if (m_isPresenting) {
313 if (m_display) {
314 m_display->ExitPresent();
315 } else {
316 forceExitPresent();
317 }
318 }
295 DOMException* exception = DOMException::create( 319 DOMException* exception = DOMException::create(
296 InvalidStateError, 320 InvalidStateError,
297 "Layer bounds must either be an empty array or have 4 values"); 321 "Layer bounds must either be an empty array or have 4 values");
298 resolver->reject(exception); 322 resolver->reject(exception);
299 ReportPresentationResult(PresentationResult::InvalidLayerBounds); 323 ReportPresentationResult(PresentationResult::InvalidLayerBounds);
300 return promise; 324 return promise;
301 } 325 }
302 326
303 if (!m_pendingPresentResolvers.isEmpty()) { 327 if (!m_pendingPresentResolvers.isEmpty()) {
304 // If we are waiting on the results of a previous requestPresent call don't 328 // If we are waiting on the results of a previous requestPresent call don't
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 visitor->trace(m_stageParameters); 789 visitor->trace(m_stageParameters);
766 visitor->trace(m_eyeParametersLeft); 790 visitor->trace(m_eyeParametersLeft);
767 visitor->trace(m_eyeParametersRight); 791 visitor->trace(m_eyeParametersRight);
768 visitor->trace(m_layer); 792 visitor->trace(m_layer);
769 visitor->trace(m_renderingContext); 793 visitor->trace(m_renderingContext);
770 visitor->trace(m_scriptedAnimationController); 794 visitor->trace(m_scriptedAnimationController);
771 visitor->trace(m_pendingPresentResolvers); 795 visitor->trace(m_pendingPresentResolvers);
772 } 796 }
773 797
774 } // namespace blink 798 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698