mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 06:35:42 +00:00
91 lines
2.8 KiB
JavaScript
91 lines
2.8 KiB
JavaScript
|
/* 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();
|
||
|
}
|
||
|
}
|