| OLD | NEW |
| 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 var vrShellUi = (function() { | 5 var vrShellUi = (function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 let scene = new ui.Scene(); | 8 let scene = new ui.Scene(); |
| 9 let sceneManager; | 9 let sceneManager; |
| 10 | 10 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 let pixelY = Math.floor(rect.top); | 70 let pixelY = Math.floor(rect.top); |
| 71 let pixelWidth = Math.ceil(rect.right) - pixelX; | 71 let pixelWidth = Math.ceil(rect.right) - pixelX; |
| 72 let pixelHeight = Math.ceil(rect.bottom) - pixelY; | 72 let pixelHeight = Math.ceil(rect.bottom) - pixelY; |
| 73 | 73 |
| 74 let element = new api.UiElement(pixelX, pixelY, pixelWidth, pixelHeight); | 74 let element = new api.UiElement(pixelX, pixelY, pixelWidth, pixelHeight); |
| 75 element.setSize(pixelWidth / 1000, pixelHeight / 1000); | 75 element.setSize(pixelWidth / 1000, pixelHeight / 1000); |
| 76 | 76 |
| 77 // Pull additional custom properties from CSS. | 77 // Pull additional custom properties from CSS. |
| 78 let style = window.getComputedStyle(domElement); | 78 let style = window.getComputedStyle(domElement); |
| 79 element.setTranslation( | 79 element.setTranslation( |
| 80 getStyleFloat(style, '--tranX'), | 80 getStyleFloat(style, '--tranX'), getStyleFloat(style, '--tranY'), |
| 81 getStyleFloat(style, '--tranY'), | |
| 82 getStyleFloat(style, '--tranZ')); | 81 getStyleFloat(style, '--tranZ')); |
| 83 | 82 |
| 84 this.uiElementId = scene.addElement(element); | 83 this.uiElementId = scene.addElement(element); |
| 85 this.uiAnimationId = -1; | 84 this.uiAnimationId = -1; |
| 86 this.domElement = domElement; | 85 this.domElement = domElement; |
| 87 } | 86 } |
| 88 }; | 87 }; |
| 89 | 88 |
| 90 class RoundButton extends DomUiElement { | 89 class RoundButton extends DomUiElement { |
| 91 constructor(domId, callback) { | 90 constructor(domId, callback) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 115 this.configure(1, 1, 0.015); | 114 this.configure(1, 1, 0.015); |
| 116 } | 115 } |
| 117 | 116 |
| 118 onMouseLeave() { | 117 onMouseLeave() { |
| 119 this.configure(0.8, 0, 0); | 118 this.configure(0.8, 0, 0); |
| 120 } | 119 } |
| 121 }; | 120 }; |
| 122 | 121 |
| 123 class Controls { | 122 class Controls { |
| 124 constructor(contentQuadId) { | 123 constructor(contentQuadId) { |
| 124 this.enabled = false; |
| 125 this.reloadUiEnabled = false; |
| 126 |
| 125 this.buttons = []; | 127 this.buttons = []; |
| 126 let descriptors = [ | 128 let descriptors = [ |
| 127 ['#back', function() { | 129 [ |
| 130 '#back', |
| 131 function() { |
| 128 api.doAction(api.Action.HISTORY_BACK); | 132 api.doAction(api.Action.HISTORY_BACK); |
| 129 }], | 133 } |
| 130 ['#reload', function() { | 134 ], |
| 135 [ |
| 136 '#reload', |
| 137 function() { |
| 131 api.doAction(api.Action.RELOAD); | 138 api.doAction(api.Action.RELOAD); |
| 132 }], | 139 } |
| 133 ['#forward', function() { | 140 ], |
| 141 [ |
| 142 '#forward', |
| 143 function() { |
| 134 api.doAction(api.Action.HISTORY_FORWARD); | 144 api.doAction(api.Action.HISTORY_FORWARD); |
| 135 }], | 145 } |
| 146 ], |
| 136 ]; | 147 ]; |
| 137 | 148 |
| 138 /** @const */ var BUTTON_SPACING = 0.136; | 149 /** @const */ var BUTTON_SPACING = 0.136; |
| 139 | 150 |
| 140 let startPosition = -BUTTON_SPACING * (descriptors.length / 2.0 - 0.5); | 151 let startPosition = -BUTTON_SPACING * (descriptors.length / 2.0 - 0.5); |
| 141 for (let i = 0; i < descriptors.length; i++) { | 152 for (let i = 0; i < descriptors.length; i++) { |
| 142 // Use an invisible parent to simplify Z-axis movement on hover. | 153 // Use an invisible parent to simplify Z-axis movement on hover. |
| 143 let position = new api.UiElement(0, 0, 0, 0); | 154 let position = new api.UiElement(0, 0, 0, 0); |
| 144 position.setVisible(false); | 155 position.setVisible(false); |
| 145 position.setTranslation(startPosition + i * BUTTON_SPACING, -0.68, -1); | 156 position.setTranslation(startPosition + i * BUTTON_SPACING, -0.68, -1); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 update.setVisible(this.enabled && this.reloadUiEnabled); | 202 update.setVisible(this.enabled && this.reloadUiEnabled); |
| 192 scene.updateElement(this.reloadUiButton.uiElementId, update); | 203 scene.updateElement(this.reloadUiButton.uiElementId, update); |
| 193 } | 204 } |
| 194 }; | 205 }; |
| 195 | 206 |
| 196 class SecureOriginWarnings { | 207 class SecureOriginWarnings { |
| 197 constructor() { | 208 constructor() { |
| 198 /** @const */ var DISTANCE = 0.7; | 209 /** @const */ var DISTANCE = 0.7; |
| 199 /** @const */ var ANGLE_UP = 16.3 * Math.PI / 180.0; | 210 /** @const */ var ANGLE_UP = 16.3 * Math.PI / 180.0; |
| 200 | 211 |
| 212 this.enabled = false; |
| 213 this.secure = false; |
| 214 this.secureOriginTimer = null; |
| 215 |
| 201 // Permanent WebVR security warning. This warning is shown near the top of | 216 // Permanent WebVR security warning. This warning is shown near the top of |
| 202 // the field of view. | 217 // the field of view. |
| 203 this.webVrSecureWarning = new DomUiElement('#webvr-not-secure-permanent'); | 218 this.webVrSecureWarning = new DomUiElement('#webvr-not-secure-permanent'); |
| 204 let update = new api.UiElementUpdate(); | 219 let update = new api.UiElementUpdate(); |
| 205 update.setScale(DISTANCE, DISTANCE, 1); | 220 update.setScale(DISTANCE, DISTANCE, 1); |
| 206 update.setTranslation(0, DISTANCE * Math.sin(ANGLE_UP), | 221 update.setTranslation( |
| 207 -DISTANCE * Math.cos(ANGLE_UP)); | 222 0, DISTANCE * Math.sin(ANGLE_UP), -DISTANCE * Math.cos(ANGLE_UP)); |
| 208 update.setRotation(1.0, 0.0, 0.0, ANGLE_UP); | 223 update.setRotation(1.0, 0.0, 0.0, ANGLE_UP); |
| 209 update.setHitTestable(false); | 224 update.setHitTestable(false); |
| 210 update.setVisible(false); | 225 update.setVisible(false); |
| 211 update.setLockToFieldOfView(true); | 226 update.setLockToFieldOfView(true); |
| 212 scene.updateElement(this.webVrSecureWarning.uiElementId, update); | 227 scene.updateElement(this.webVrSecureWarning.uiElementId, update); |
| 213 | 228 |
| 214 // Temporary WebVR security warning. This warning is shown in the center | 229 // Temporary WebVR security warning. This warning is shown in the center |
| 215 // of the field of view, for a limited period of time. | 230 // of the field of view, for a limited period of time. |
| 216 this.transientWarning = new DomUiElement( | 231 this.transientWarning = new DomUiElement('#webvr-not-secure-transient'); |
| 217 '#webvr-not-secure-transient'); | |
| 218 update = new api.UiElementUpdate(); | 232 update = new api.UiElementUpdate(); |
| 219 update.setScale(DISTANCE, DISTANCE, 1); | 233 update.setScale(DISTANCE, DISTANCE, 1); |
| 220 update.setTranslation(0, 0, -DISTANCE); | 234 update.setTranslation(0, 0, -DISTANCE); |
| 221 update.setHitTestable(false); | 235 update.setHitTestable(false); |
| 222 update.setVisible(false); | 236 update.setVisible(false); |
| 223 update.setLockToFieldOfView(true); | 237 update.setLockToFieldOfView(true); |
| 224 scene.updateElement(this.transientWarning.uiElementId, update); | 238 scene.updateElement(this.transientWarning.uiElementId, update); |
| 225 } | 239 } |
| 226 | 240 |
| 227 setEnabled(enabled) { | 241 setEnabled(enabled) { |
| 228 this.enabled = enabled; | 242 this.enabled = enabled; |
| 229 this.updateState(); | 243 this.updateState(); |
| 230 } | 244 } |
| 231 | 245 |
| 232 setSecure(secure) { | 246 setSecure(secure) { |
| 233 this.secure = secure; | 247 this.secure = secure; |
| 234 this.updateState(); | 248 this.updateState(); |
| 235 } | 249 } |
| 236 | 250 |
| 237 updateState() { | 251 updateState() { |
| 238 /** @const */ var TRANSIENT_TIMEOUT_MS = 30000; | 252 /** @const */ var TRANSIENT_TIMEOUT_MS = 30000; |
| 239 | 253 |
| 240 let visible = (this.enabled && !this.secure); | 254 let visible = (this.enabled && !this.secure); |
| 241 if (this.secureOriginTimer) { | 255 if (this.secureOriginTimer) { |
| 242 clearInterval(this.secureOriginTimer); | 256 clearInterval(this.secureOriginTimer); |
| 243 this.secureOriginTimer = null; | 257 this.secureOriginTimer = null; |
| 244 } | 258 } |
| 245 if (visible) { | 259 if (visible) { |
| 246 this.secureOriginTimer = setTimeout( | 260 this.secureOriginTimer = |
| 247 this.onTransientTimer.bind(this), TRANSIENT_TIMEOUT_MS); | 261 setTimeout(this.onTransientTimer.bind(this), TRANSIENT_TIMEOUT_MS); |
| 248 } | 262 } |
| 249 this.showOrHideWarnings(visible); | 263 this.showOrHideWarnings(visible); |
| 250 } | 264 } |
| 251 | 265 |
| 252 showOrHideWarnings(visible) { | 266 showOrHideWarnings(visible) { |
| 253 let update = new api.UiElementUpdate(); | 267 let update = new api.UiElementUpdate(); |
| 254 update.setVisible(visible); | 268 update.setVisible(visible); |
| 255 scene.updateElement(this.webVrSecureWarning.uiElementId, update); | 269 scene.updateElement(this.webVrSecureWarning.uiElementId, update); |
| 256 update = new api.UiElementUpdate(); | 270 update = new api.UiElementUpdate(); |
| 257 update.setVisible(visible); | 271 update.setVisible(visible); |
| 258 scene.updateElement(this.transientWarning.uiElementId, update); | 272 scene.updateElement(this.transientWarning.uiElementId, update); |
| 259 } | 273 } |
| 260 | 274 |
| 261 onTransientTimer() { | 275 onTransientTimer() { |
| 262 let update = new api.UiElementUpdate(); | 276 let update = new api.UiElementUpdate(); |
| 263 update.setVisible(false); | 277 update.setVisible(false); |
| 264 scene.updateElement(this.transientWarning.uiElementId, update); | 278 scene.updateElement(this.transientWarning.uiElementId, update); |
| 265 this.secureOriginTimer = null; | 279 this.secureOriginTimer = null; |
| 266 scene.flush(); | 280 scene.flush(); |
| 267 } | 281 } |
| 268 }; | 282 }; |
| 269 | 283 |
| 270 class Omnibox { | 284 class Omnibox { |
| 271 constructor(contentQuadId) { | 285 constructor(contentQuadId) { |
| 272 this.domUiElement = new DomUiElement('#omni-container'); | 286 this.domUiElement = new DomUiElement('#omni-container'); |
| 273 this.enabled = false; | 287 this.enabled = false; |
| 288 this.loading = false; |
| 274 this.level = 0; | 289 this.level = 0; |
| 275 this.visibilityTimeout = 0; | 290 this.visibilityTimeout = 0; |
| 276 this.visibilityTimer = null; | 291 this.visibilityTimer = null; |
| 292 this.visibleAfterTransition = false; |
| 277 this.nativeState = {}; | 293 this.nativeState = {}; |
| 278 | 294 |
| 279 // Initially invisible. | 295 // Initially invisible. |
| 280 let update = new api.UiElementUpdate(); | 296 let update = new api.UiElementUpdate(); |
| 281 update.setVisible(false); | 297 update.setVisible(false); |
| 282 scene.updateElement(this.domUiElement.uiElementId, update); | 298 scene.updateElement(this.domUiElement.uiElementId, update); |
| 283 this.nativeState.visible = false; | 299 this.nativeState.visible = false; |
| 284 | 300 |
| 285 // Listen to the end of transitions, so that the box can be natively | 301 // Listen to the end of transitions, so that the box can be natively |
| 286 // hidden after it finishes hiding itself. | 302 // hidden after it finishes hiding itself. |
| 287 document.querySelector('#omni').addEventListener('transitionend', | 303 document.querySelector('#omni').addEventListener( |
| 288 this.onAnimationDone.bind(this)); | 304 'transitionend', this.onAnimationDone.bind(this)); |
| 289 } | 305 } |
| 290 | 306 |
| 291 getSecurityIconElementId(level) { | 307 getSecurityIconElementId(level) { |
| 292 // See security_state.h and getSecurityIconResource() for this mapping. | 308 // See security_state.h and getSecurityIconResource() for this mapping. |
| 293 switch (level) { | 309 switch (level) { |
| 294 case 0: // NONE | 310 case 0: // NONE |
| 295 case 1: // HTTP_SHOW_WARNING | 311 case 1: // HTTP_SHOW_WARNING |
| 296 case 4: // SECURITY_WARNING | 312 case 4: // SECURITY_WARNING |
| 297 return '#omni-info-icon'; | 313 return '#omni-info-icon'; |
| 298 case 2: // SECURE: | 314 case 2: // SECURE: |
| 299 case 3: // EV_SECURE: | 315 case 3: // EV_SECURE: |
| 300 return '#omni-lock-icon'; | 316 return '#omni-lock-icon'; |
| 301 case 5: // SECURE_WITH_POLICY_INSTALLED_CERT (ChromeOS only) | 317 case 5: // SECURE_WITH_POLICY_INSTALLED_CERT (ChromeOS only) |
| 302 case 6: // DANGEROUS | 318 case 6: // DANGEROUS |
| 303 default: | 319 default: |
| 304 return '#omni-warning-icon'; | 320 return '#omni-warning-icon'; |
| 305 } | 321 } |
| 306 } | 322 } |
| 307 | 323 |
| 308 setEnabled(enabled) { | 324 setEnabled(enabled) { |
| 309 this.enabled = enabled; | 325 this.enabled = enabled; |
| 310 this.resetVisibilityTimer(); | 326 this.resetVisibilityTimer(); |
| 311 this.updateState(); | 327 this.updateState(); |
| 312 } | 328 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 337 this.updateState(); | 353 this.updateState(); |
| 338 } | 354 } |
| 339 | 355 |
| 340 resetVisibilityTimer() { | 356 resetVisibilityTimer() { |
| 341 if (this.visibilityTimer) { | 357 if (this.visibilityTimer) { |
| 342 clearInterval(this.visibilityTimer); | 358 clearInterval(this.visibilityTimer); |
| 343 this.visibilityTimer = null; | 359 this.visibilityTimer = null; |
| 344 } | 360 } |
| 345 if (this.enabled && this.visibilityTimeout > 0 && !this.loading) { | 361 if (this.enabled && this.visibilityTimeout > 0 && !this.loading) { |
| 346 this.visibilityTimer = setTimeout( | 362 this.visibilityTimer = setTimeout( |
| 347 this.onVisibilityTimer.bind(this), this.visibilityTimeout); | 363 this.onVisibilityTimer.bind(this), this.visibilityTimeout); |
| 348 } | 364 } |
| 349 } | 365 } |
| 350 | 366 |
| 351 onVisibilityTimer() { | 367 onVisibilityTimer() { |
| 352 this.visibilityTimer = null; | 368 this.visibilityTimer = null; |
| 353 this.updateState(); | 369 this.updateState(); |
| 354 } | 370 } |
| 355 | 371 |
| 356 onAnimationDone(e) { | 372 onAnimationDone(e) { |
| 357 if (e.propertyName == 'opacity' && !this.visibleAfterTransition) { | 373 if (e.propertyName == 'opacity' && !this.visibleAfterTransition) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 | 435 |
| 420 this.contentQuad.setEnabled(mode == api.Mode.STANDARD && !menuMode); | 436 this.contentQuad.setEnabled(mode == api.Mode.STANDARD && !menuMode); |
| 421 this.contentQuad.setFullscreen(fullscreen); | 437 this.contentQuad.setFullscreen(fullscreen); |
| 422 // TODO(crbug/643815): Set aspect ratio on content quad when available. | 438 // TODO(crbug/643815): Set aspect ratio on content quad when available. |
| 423 // TODO(amp): Don't show controls in fullscreen once MENU mode lands. | 439 // TODO(amp): Don't show controls in fullscreen once MENU mode lands. |
| 424 this.controls.setEnabled(mode == api.Mode.STANDARD && !menuMode); | 440 this.controls.setEnabled(mode == api.Mode.STANDARD && !menuMode); |
| 425 this.omnibox.setEnabled(mode == api.Mode.STANDARD && !menuMode); | 441 this.omnibox.setEnabled(mode == api.Mode.STANDARD && !menuMode); |
| 426 // TODO(amp): Don't show controls in CINEMA mode once MENU mode lands. | 442 // TODO(amp): Don't show controls in CINEMA mode once MENU mode lands. |
| 427 this.omnibox.setVisibilityTimeout( | 443 this.omnibox.setVisibilityTimeout( |
| 428 mode == api.Mode.STANDARD && !menuMode ? | 444 mode == api.Mode.STANDARD && !menuMode ? |
| 429 0 : OMNIBOX_VISIBILITY_TIMEOUT_MS); | 445 0 : |
| 446 OMNIBOX_VISIBILITY_TIMEOUT_MS); |
| 430 this.secureOriginWarnings.setEnabled(mode == api.Mode.WEB_VR); | 447 this.secureOriginWarnings.setEnabled(mode == api.Mode.WEB_VR); |
| 431 | 448 |
| 432 api.setUiCssSize(uiRootElement.clientWidth, uiRootElement.clientHeight, | 449 api.setUiCssSize( |
| 433 UI_DPR); | 450 uiRootElement.clientWidth, uiRootElement.clientHeight, UI_DPR); |
| 434 } | 451 } |
| 435 | 452 |
| 436 setSecurityLevel(level) { | 453 setSecurityLevel(level) { |
| 437 this.omnibox.setSecurityLevel(level); | 454 this.omnibox.setSecurityLevel(level); |
| 438 } | 455 } |
| 439 | 456 |
| 440 setWebVRSecureOrigin(secure) { | 457 setWebVRSecureOrigin(secure) { |
| 441 this.secureOriginWarnings.setSecure(secure); | 458 this.secureOriginWarnings.setSecure(secure); |
| 442 } | 459 } |
| 443 | 460 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 scene.flush(); | 493 scene.flush(); |
| 477 } | 494 } |
| 478 | 495 |
| 479 return { | 496 return { |
| 480 initialize: initialize, | 497 initialize: initialize, |
| 481 command: command, | 498 command: command, |
| 482 }; | 499 }; |
| 483 })(); | 500 })(); |
| 484 | 501 |
| 485 document.addEventListener('DOMContentLoaded', vrShellUi.initialize); | 502 document.addEventListener('DOMContentLoaded', vrShellUi.initialize); |
| OLD | NEW |