blob: 4bc40250e5b03d6cf75078ae36890b6d7ae4b2a1 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
module.exports = {
id: 'windows',
bootstrap:function() {
var cordova = require('cordova'),
exec = require('cordova/exec'),
channel = cordova.require('cordova/channel'),
platform = require('cordova/platform'),
modulemapper = require('cordova/modulemapper'),
utils = require('cordova/utils');
modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');
// we will make sure we get this channel
// TODO: remove this once other platforms catch up.
if(!channel.onActivated) {
channel.onActivated = cordova.addDocumentEventHandler('activated');
}
channel.onNativeReady.fire();
var onWinJSReady = function () {
var app = WinJS.Application,
splashscreen = require('cordova/splashscreen'),
configHelper = require('cordova/confighelper');
modulemapper.clobbers('cordova/splashscreen', 'navigator.splashscreen');
var checkpointHandler = function checkpointHandler() {
cordova.fireDocumentEvent('pause',null,true);
};
var resumingHandler = function resumingHandler() {
cordova.fireDocumentEvent('resume',null,true);
};
// activation args are available via the activated event
// OR cordova.require('cordova/platform').activationContext
// activationContext:{type: actType, args: args};
var activationHandler = function (e) {
// Making all the details available as activationContext
platform.activationContext = utils.clone(e.detail); /* CB-10653 to avoid losing detail properties for some activation kinds */
platform.activationContext.raw = e.detail; /* CB-11522 to preserve types */
platform.activationContext.args = e.detail.arguments; /* for backwards compatibility */
function makePromise(fn) {
return new WinJS.Promise(function init(completeDispatch, errorDispatch) {
fn(function successCb(results) {
completeDispatch(results);
}, function errorCb(error) {
errorDispatch(error);
});
});
}
if (e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.running
|| e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.suspended) {
cordova.fireDocumentEvent('activated', platform.activationContext, true);
return;
}
var manifest;
e.setPromise(makePromise(configHelper.readManifest).then(function (manifestTmp) {
manifest = manifestTmp;
return makePromise(configHelper.readConfig);
})
.then(function (config) {
splashscreen.firstShow(config, manifest, e);
}).then(function () {
// Avoids splashimage flicker on Windows Phone 8.1/10
return WinJS.Promise.timeout();
}).then(function () {
cordova.fireDocumentEvent('activated', platform.activationContext, true);
}));
};
// CB-12193 CoreWindow and some WinRT APIs are not available in webview
var isCoreWindowAvailable = false;
try {
Windows.UI.ViewManagement.ApplicationView.getForCurrentView();
isCoreWindowAvailable = true;
} catch (e) { }
if (isCoreWindowAvailable) {
app.addEventListener("checkpoint", checkpointHandler);
app.addEventListener("activated", activationHandler, false);
Windows.UI.WebUI.WebUIApplication.addEventListener("resuming", resumingHandler, false);
injectBackButtonHandler();
app.start();
}
};
function appendScript(scriptElem, loadedCb) {
scriptElem.addEventListener("load", loadedCb);
document.head.appendChild(scriptElem);
}
if (!window.WinJS) {
var scriptElem = document.createElement("script");
if (navigator.appVersion.indexOf('MSAppHost/3.0') !== -1) {
// Windows 10 UWP
scriptElem.src = '/www/WinJS/js/base.js';
} else if (navigator.appVersion.indexOf("Windows Phone 8.1;") !== -1) {
// windows phone 8.1 + Mobile IE 11
scriptElem.src = "//Microsoft.Phone.WinJS.2.1/js/base.js";
} else if (navigator.appVersion.indexOf("MSAppHost/2.0;") !== -1) {
// windows 8.1 + IE 11
scriptElem.src = "//Microsoft.WinJS.2.0/js/base.js";
}
scriptElem.addEventListener("load", onWinJSReady);
document.head.appendChild(scriptElem);
}
else {
onWinJSReady();
}
}
};
function injectBackButtonHandler() {
var app = WinJS.Application;
// create document event handler for backbutton
var backButtonChannel = cordova.addDocumentEventHandler('backbutton');
// preserve reference to original backclick implementation
// `false` as a result will trigger system default behaviour
var defaultBackButtonHandler = app.onbackclick || function () { return false; };
var backRequestedHandler = function backRequestedHandler(evt) {
// check if listeners are registered, if yes use custom backbutton event
// NOTE: On Windows Phone 8.1 backbutton handlers have to throw an exception in order to exit the app
if (backButtonChannel.numHandlers >= 1) {
try {
cordova.fireDocumentEvent('backbutton', evt, true);
evt.handled = true; // Windows Mobile requires handled to be set as well;
return true;
}
catch (e) {
return false;
}
}
// if not listeners are active, use default implementation (backwards compatibility)
else {
return defaultBackButtonHandler.apply(app, arguments);
}
};
// Only load this code if we're running on Win10 in a non-emulated app frame, otherwise crash \o/
if (navigator.appVersion.indexOf('MSAppHost/3.0') !== -1) { // Windows 10 UWP (PC/Tablet/Phone)
var navigationManager = Windows.UI.Core.SystemNavigationManager.getForCurrentView();
// Inject a listener for the backbutton on the document.
backButtonChannel.onHasSubscribersChange = function () {
// If we just attached the first handler or detached the last handler,
// let native know we need to override the back button.
navigationManager.appViewBackButtonVisibility = (this.numHandlers > 0) ?
Windows.UI.Core.AppViewBackButtonVisibility.visible :
Windows.UI.Core.AppViewBackButtonVisibility.collapsed;
};
navigationManager.addEventListener("backrequested", backRequestedHandler, false);
} else { // Windows 8.1 Phone
// inject new back button handler
app.onbackclick = backRequestedHandler;
}
}