• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * @fileoverview
7 * Full-screen implementation for apps v1, using webkitRequestFullscreen.
8 */
9
10'use strict';
11
12/** @suppress {duplicate} */
13var remoting = remoting || {};
14
15/**
16 * @constructor
17 * @implements {remoting.Fullscreen}
18 */
19remoting.FullscreenAppsV1 = function() {
20  /**
21   * @type {string} Internal 'full-screen changed' event name
22   * @private
23   */
24  this.kEventName_ = '_fullscreenchanged';
25
26  /**
27   * @type {base.EventSource}
28   * @private
29   */
30  this.eventSource_ = new base.EventSource();
31  this.eventSource_.defineEvents([this.kEventName_]);
32
33  document.addEventListener(
34      'webkitfullscreenchange',
35      this.onFullscreenChanged_.bind(this),
36      false);
37};
38
39remoting.FullscreenAppsV1.prototype.activate = function(
40    fullscreen, opt_onDone) {
41  if (opt_onDone) {
42    if (this.isActive() == fullscreen) {
43      opt_onDone();
44    } else {
45      /** @type {remoting.Fullscreen} */
46      var that = this;
47      var callbackAndRemoveListener = function() {
48        that.removeListener(callbackAndRemoveListener);
49        opt_onDone();
50      };
51      this.addListener(callbackAndRemoveListener);
52    }
53  }
54
55  if (fullscreen) {
56    document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
57  } else {
58    document.webkitCancelFullScreen();
59  }
60};
61
62remoting.FullscreenAppsV1.prototype.toggle = function() {
63  this.activate(!this.isActive());
64};
65
66remoting.FullscreenAppsV1.prototype.isActive = function() {
67  return document.webkitIsFullScreen;
68};
69
70remoting.FullscreenAppsV1.prototype.addListener = function(callback) {
71  this.eventSource_.addEventListener(this.kEventName_, callback);
72};
73
74remoting.FullscreenAppsV1.prototype.removeListener = function(callback) {
75  this.eventSource_.removeEventListener(this.kEventName_, callback);
76};
77
78/**
79 * @private
80 */
81remoting.FullscreenAppsV1.prototype.onFullscreenChanged_ = function() {
82  // Querying full-screen immediately after the webkitfullscreenchange
83  // event fires sometimes gives the wrong answer on Mac, perhaps due to
84  // the time taken to animate presentation mode. Since I haven't been able
85  // to isolate the exact repro steps, and we're not planning on using this
86  // API for much longer, this hack will suffice for now.
87  window.setTimeout(
88      /** @this {remoting.FullscreenAppsV1} */
89      function() {
90        this.eventSource_.raiseEvent(this.kEventName_, this.isActive());
91      }.bind(this),
92      500);
93};
94