summaryrefslogtreecommitdiffstats
path: root/b2g/components/GlobalSimulatorScreen.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/GlobalSimulatorScreen.jsm')
-rw-r--r--b2g/components/GlobalSimulatorScreen.jsm90
1 files changed, 90 insertions, 0 deletions
diff --git a/b2g/components/GlobalSimulatorScreen.jsm b/b2g/components/GlobalSimulatorScreen.jsm
new file mode 100644
index 000000000..2895aef96
--- /dev/null
+++ b/b2g/components/GlobalSimulatorScreen.jsm
@@ -0,0 +1,90 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+this.EXPORTED_SYMBOLS = [ 'GlobalSimulatorScreen' ];
+
+const Cu = Components.utils;
+
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import('resource://gre/modules/Services.jsm');
+
+this.GlobalSimulatorScreen = {
+ mozOrientationLocked: false,
+
+ // Actual orientation of apps
+ mozOrientation: 'portrait',
+
+ // The restricted list of actual orientation that can be used
+ // if mozOrientationLocked is true
+ lockedOrientation: [],
+
+ // The faked screen orientation
+ // if screenOrientation doesn't match mozOrientation due
+ // to lockedOrientation restriction, the app will be displayed
+ // on the side on desktop
+ screenOrientation: 'portrait',
+
+ // Updated by screen.js
+ width: 0, height: 0,
+
+ lock: function(orientation) {
+ this.mozOrientationLocked = true;
+
+ // Normalize to portrait or landscape,
+ // i.e. the possible values of screenOrientation
+ function normalize(str) {
+ if (str.match(/^portrait/)) {
+ return 'portrait';
+ } else if (str.match(/^landscape/)) {
+ return 'landscape';
+ } else {
+ return 'portrait';
+ }
+ }
+ this.lockedOrientation = orientation.map(normalize);
+
+ this.updateOrientation();
+ },
+
+ unlock: function() {
+ this.mozOrientationLocked = false;
+ this.updateOrientation();
+ },
+
+ updateOrientation: function () {
+ let orientation = this.screenOrientation;
+
+ // If the orientation is locked, we have to ensure ending up with a value
+ // of lockedOrientation. If none of lockedOrientation values matches
+ // the screen orientation we just choose the first locked orientation.
+ // This will be the precise scenario where the app is displayed on the
+ // side on desktop!
+ if (this.mozOrientationLocked &&
+ this.lockedOrientation.indexOf(this.screenOrientation) == -1) {
+ orientation = this.lockedOrientation[0];
+ }
+
+ // If the actual orientation changed,
+ // we have to fire mozorientation DOM events
+ if (this.mozOrientation != orientation) {
+ this.mozOrientation = orientation;
+
+ // Notify each app screen object to fire the event
+ Services.obs.notifyObservers(null, 'simulator-orientation-change', null);
+ }
+
+ // Finally, in any case, we update the window size and orientation
+ // (Use wrappedJSObject trick to be able to pass a raw JS object)
+ Services.obs.notifyObservers({wrappedJSObject:this}, 'simulator-adjust-window-size', null);
+ },
+
+ flipScreen: function() {
+ if (this.screenOrientation == 'portrait') {
+ this.screenOrientation = 'landscape';
+ } else if (this.screenOrientation == 'landscape') {
+ this.screenOrientation = 'portrait';
+ }
+ this.updateOrientation();
+ }
+}