| Index: third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| diff --git a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| index 80399e512258e8865c4cf08385b08358d5c287e2..a266f43d9b194bc884955d27c1c2187d10041e79 100644
|
| --- a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| +++ b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "core/css/StylePropertySet.h"
|
| #include "core/dom/DOMException.h"
|
| +#include "core/dom/DocumentUserGestureToken.h"
|
| #include "core/dom/FrameRequestCallback.h"
|
| #include "core/dom/Fullscreen.h"
|
| #include "core/dom/ScriptedAnimationController.h"
|
| @@ -336,42 +337,6 @@ ScriptPromise VRDisplay::requestPresent(ScriptState* scriptState,
|
| return promise;
|
| }
|
|
|
| - if (!m_capabilities->hasExternalDisplay()) {
|
| - // TODO(klausw,crbug.com/655722): Need a proper VR compositor, but
|
| - // for the moment on mobile we'll just make the canvas fullscreen
|
| - // so that VrShell can pick it up through the standard (high
|
| - // latency) compositing path.
|
| - auto canvas = m_layer.source();
|
| - auto inlineStyle = canvas->inlineStyle();
|
| - if (inlineStyle) {
|
| - // THREE.js's VREffect sets explicit style.width/height on its rendering
|
| - // canvas based on the non-fullscreen window dimensions, and it keeps
|
| - // those unchanged when presenting. Unfortunately it appears that a
|
| - // fullscreened canvas just gets centered if it has explicitly set a
|
| - // size smaller than the fullscreen dimensions. Manually set size to
|
| - // 100% in this case and restore it when exiting fullscreen. This is a
|
| - // stopgap measure since THREE.js's usage appears legal according to the
|
| - // WebVR API spec. This will no longer be necessary once we can get rid
|
| - // of this fullscreen hack.
|
| - m_fullscreenOrigWidth = inlineStyle->getPropertyValue(CSSPropertyWidth);
|
| - if (!m_fullscreenOrigWidth.isNull()) {
|
| - canvas->setInlineStyleProperty(CSSPropertyWidth, "100%");
|
| - }
|
| - m_fullscreenOrigHeight = inlineStyle->getPropertyValue(CSSPropertyHeight);
|
| - if (!m_fullscreenOrigHeight.isNull()) {
|
| - canvas->setInlineStyleProperty(CSSPropertyHeight, "100%");
|
| - }
|
| - } else {
|
| - m_fullscreenOrigWidth = String();
|
| - m_fullscreenOrigHeight = String();
|
| - }
|
| - Fullscreen::requestFullscreen(*canvas, Fullscreen::UnprefixedRequest);
|
| -
|
| - // Check to see if the canvas is still the current fullscreen
|
| - // element once per second.
|
| - m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE);
|
| - }
|
| -
|
| if (firstPresent) {
|
| bool secureContext = scriptState->getExecutionContext()->isSecureContext();
|
| if (!m_display) {
|
| @@ -434,6 +399,8 @@ ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) {
|
| }
|
|
|
| void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) {
|
| + Document* doc = m_navigatorVR->document();
|
| + std::unique_ptr<UserGestureIndicator> gestureIndicator;
|
| if (m_capabilities->hasExternalDisplay()) {
|
| forceExitPresent();
|
| DOMException* exception = DOMException::create(
|
| @@ -443,9 +410,50 @@ void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) {
|
| ReportPresentationResult(
|
| PresentationResult::PresentationNotSupportedByDisplay);
|
| return;
|
| + } else {
|
| + // TODO(klausw,crbug.com/655722): Need a proper VR compositor, but
|
| + // for the moment on mobile we'll just make the canvas fullscreen
|
| + // so that VrShell can pick it up through the standard (high
|
| + // latency) compositing path.
|
| + auto canvas = m_layer.source();
|
| + auto inlineStyle = canvas->inlineStyle();
|
| + if (inlineStyle) {
|
| + // THREE.js's VREffect sets explicit style.width/height on its rendering
|
| + // canvas based on the non-fullscreen window dimensions, and it keeps
|
| + // those unchanged when presenting. Unfortunately it appears that a
|
| + // fullscreened canvas just gets centered if it has explicitly set a
|
| + // size smaller than the fullscreen dimensions. Manually set size to
|
| + // 100% in this case and restore it when exiting fullscreen. This is a
|
| + // stopgap measure since THREE.js's usage appears legal according to the
|
| + // WebVR API spec. This will no longer be necessary once we can get rid
|
| + // of this fullscreen hack.
|
| + m_fullscreenOrigWidth = inlineStyle->getPropertyValue(CSSPropertyWidth);
|
| + if (!m_fullscreenOrigWidth.isNull()) {
|
| + canvas->setInlineStyleProperty(CSSPropertyWidth, "100%");
|
| + }
|
| + m_fullscreenOrigHeight = inlineStyle->getPropertyValue(CSSPropertyHeight);
|
| + if (!m_fullscreenOrigHeight.isNull()) {
|
| + canvas->setInlineStyleProperty(CSSPropertyHeight, "100%");
|
| + }
|
| + } else {
|
| + m_fullscreenOrigWidth = String();
|
| + m_fullscreenOrigHeight = String();
|
| + }
|
| +
|
| + if (doc) {
|
| + // Since the callback for requestPresent is asynchronous, we've lost our
|
| + // UserGestureToken, and need to create a new one to enter fullscreen.
|
| + gestureIndicator =
|
| + wrapUnique(new UserGestureIndicator(DocumentUserGestureToken::create(
|
| + doc, UserGestureToken::Status::PossiblyExistingGesture)));
|
| + }
|
| + Fullscreen::requestFullscreen(*canvas, Fullscreen::UnprefixedRequest);
|
| +
|
| + // Check to see if the canvas is still the current fullscreen
|
| + // element once every 5 seconds.
|
| + m_fullscreenCheckTimer.startRepeating(5.0, BLINK_FROM_HERE);
|
| }
|
|
|
| - Document* doc = m_navigatorVR->document();
|
| if (doc) {
|
| Platform::current()->recordRapporURL("VR.WebVR.PresentSuccess",
|
| WebURL(doc->url()));
|
|
|