CB-12895 : added eslint and removed jshint

This commit is contained in:
Audrey So 2017-06-12 10:34:08 -07:00
parent 7611645469
commit 902427525f
12 changed files with 350 additions and 362 deletions

10
.eslintrc.yml Normal file
View File

@ -0,0 +1,10 @@
root: true
extends: semistandard
rules:
indent:
- error
- 4
camelcase: off
padded-blocks: off
operator-linebreak: off
no-throw-literal: off

View File

@ -1,16 +0,0 @@
{
"browser": true
, "devel": true
, "bitwise": true
, "undef": true
, "trailing": true
, "quotmark": false
, "indent": 4
, "unused": "vars"
, "latedef": "nofunc"
, "globals": {
"module": false,
"exports": false,
"require": false
}
}

View File

@ -44,8 +44,8 @@
"cordova-firefoxos" "cordova-firefoxos"
], ],
"scripts": { "scripts": {
"test": "npm run jshint", "test": "npm run eslint",
"jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" "eslint": "node node_modules/eslint/bin/eslint www && node node_modules/eslint/bin/eslint src && node node_modules/eslint/bin/eslint tests"
}, },
"engines": { "engines": {
"cordovaDependencies": { "cordovaDependencies": {
@ -60,6 +60,12 @@
"author": "Apache Software Foundation", "author": "Apache Software Foundation",
"license": "Apache-2.0", "license": "Apache-2.0",
"devDependencies": { "devDependencies": {
"jshint": "^2.6.0" "eslint": "^4.0.0",
"eslint-config-semistandard": "^11.0.0",
"eslint-config-standard": "^10.2.1",
"eslint-plugin-import": "^2.3.0",
"eslint-plugin-node": "^5.0.0",
"eslint-plugin-promise": "^3.5.0",
"eslint-plugin-standard": "^3.0.1"
} }
} }

View File

@ -29,43 +29,43 @@ var browserWrap,
forwardButton, forwardButton,
closeButton; closeButton;
function attachNavigationEvents(element, callback) { function attachNavigationEvents (element, callback) {
var onError = function () { var onError = function () {
try { try {
callback({ type: "loaderror", url: this.contentWindow.location.href}, {keepCallback: true}); callback({ type: 'loaderror', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} catch (err) { } catch (err) {
// blocked by CORS :\ // blocked by CORS :\
callback({ type: "loaderror", url: null}, {keepCallback: true}); callback({ type: 'loaderror', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} }
}; };
element.addEventListener("pageshow", function () { element.addEventListener('pageshow', function () {
try { try {
callback({ type: "loadstart", url: this.contentWindow.location.href}, {keepCallback: true}); callback({ type: 'loadstart', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} catch (err) { } catch (err) {
// blocked by CORS :\ // blocked by CORS :\
callback({ type: "loadstart", url: null}, {keepCallback: true}); callback({ type: 'loadstart', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} }
}); });
element.addEventListener("load", function () { element.addEventListener('load', function () {
try { try {
callback({ type: "loadstop", url: this.contentWindow.location.href}, {keepCallback: true}); callback({ type: 'loadstop', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} catch (err) { } catch (err) {
// blocked by CORS :\ // blocked by CORS :\
callback({ type: "loadstop", url: null}, {keepCallback: true}); callback({ type: 'loadstop', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal
} }
}); });
element.addEventListener("error", onError); element.addEventListener('error', onError);
element.addEventListener("abort", onError); element.addEventListener('abort', onError);
} }
var IAB = { var IAB = {
close: function (win, lose) { close: function (win, lose) {
if (browserWrap) { if (browserWrap) {
// use the "open" function callback so that the exit event is fired properly // use the "open" function callback so that the exit event is fired properly
if (IAB._win) IAB._win({ type: "exit" }); if (IAB._win) IAB._win({ type: 'exit' });
browserWrap.parentNode.removeChild(browserWrap); browserWrap.parentNode.removeChild(browserWrap);
browserWrap = null; browserWrap = null;
@ -75,34 +75,34 @@ var IAB = {
show: function (win, lose) { show: function (win, lose) {
if (browserWrap) { if (browserWrap) {
browserWrap.style.display = "block"; browserWrap.style.display = 'block';
} }
}, },
open: function (win, lose, args) { open: function (win, lose, args) {
var strUrl = args[0], var strUrl = args[0];
target = args[1], var target = args[1];
features = args[2]; var features = args[2];
IAB._win = win; IAB._win = win;
if (target === "_self" || !target) { if (target === '_self' || !target) {
window.location = strUrl; window.location = strUrl;
} else if (target === "_system") { } else if (target === '_system') {
modulemapper.getOriginalSymbol(window, 'window.open').call(window, strUrl, "_blank"); modulemapper.getOriginalSymbol(window, 'window.open').call(window, strUrl, '_blank');
} else { } else {
// "_blank" or anything else // "_blank" or anything else
if (!browserWrap) { if (!browserWrap) {
browserWrap = document.createElement("div"); browserWrap = document.createElement('div');
browserWrap.style.position = "absolute"; browserWrap.style.position = 'absolute';
browserWrap.style.top = "0"; browserWrap.style.top = '0';
browserWrap.style.left = "0"; browserWrap.style.left = '0';
browserWrap.style.boxSizing = "border-box"; browserWrap.style.boxSizing = 'border-box';
browserWrap.style.borderWidth = "40px"; browserWrap.style.borderWidth = '40px';
browserWrap.style.width = "100vw"; browserWrap.style.width = '100vw';
browserWrap.style.height = "100vh"; browserWrap.style.height = '100vh';
browserWrap.style.borderStyle = "solid"; browserWrap.style.borderStyle = 'solid';
browserWrap.style.borderColor = "rgba(0,0,0,0.25)"; browserWrap.style.borderColor = 'rgba(0,0,0,0.25)';
browserWrap.onclick = function () { browserWrap.onclick = function () {
setTimeout(function () { setTimeout(function () {
@ -113,71 +113,68 @@ var IAB = {
document.body.appendChild(browserWrap); document.body.appendChild(browserWrap);
} }
if (features.indexOf("hidden=yes") !== -1) { if (features.indexOf('hidden=yes') !== -1) {
browserWrap.style.display = "none"; browserWrap.style.display = 'none';
} }
popup = document.createElement("iframe"); popup = document.createElement('iframe');
popup.style.borderWidth = "0px"; popup.style.borderWidth = '0px';
popup.style.width = "100%"; popup.style.width = '100%';
browserWrap.appendChild(popup); browserWrap.appendChild(popup);
if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) { if (features.indexOf('location=yes') !== -1 || features.indexOf('location') === -1) {
popup.style.height = "calc(100% - 60px)"; popup.style.height = 'calc(100% - 60px)';
popup.style.marginBottom = "-4px"; popup.style.marginBottom = '-4px';
navigationButtonsDiv = document.createElement("div"); navigationButtonsDiv = document.createElement('div');
navigationButtonsDiv.style.height = "60px"; navigationButtonsDiv.style.height = '60px';
navigationButtonsDiv.style.backgroundColor = "#404040"; navigationButtonsDiv.style.backgroundColor = '#404040';
navigationButtonsDiv.style.zIndex = "999"; navigationButtonsDiv.style.zIndex = '999';
navigationButtonsDiv.onclick = function (e) { navigationButtonsDiv.onclick = function (e) {
e.cancelBubble = true; e.cancelBubble = true;
}; };
navigationButtonsDivInner = document.createElement("div"); navigationButtonsDivInner = document.createElement('div');
navigationButtonsDivInner.style.paddingTop = "10px"; navigationButtonsDivInner.style.paddingTop = '10px';
navigationButtonsDivInner.style.height = "50px"; navigationButtonsDivInner.style.height = '50px';
navigationButtonsDivInner.style.width = "160px"; navigationButtonsDivInner.style.width = '160px';
navigationButtonsDivInner.style.margin = "0 auto"; navigationButtonsDivInner.style.margin = '0 auto';
navigationButtonsDivInner.style.backgroundColor = "#404040"; navigationButtonsDivInner.style.backgroundColor = '#404040';
navigationButtonsDivInner.style.zIndex = "999"; navigationButtonsDivInner.style.zIndex = '999';
navigationButtonsDivInner.onclick = function (e) { navigationButtonsDivInner.onclick = function (e) {
e.cancelBubble = true; e.cancelBubble = true;
}; };
backButton = document.createElement('button');
backButton.style.width = '40px';
backButton.style.height = '40px';
backButton.style.borderRadius = '40px';
backButton = document.createElement("button"); backButton.innerHTML = '←';
backButton.style.width = "40px"; backButton.addEventListener('click', function (e) {
backButton.style.height = "40px"; if (popup.canGoBack) { popup.goBack(); }
backButton.style.borderRadius = "40px";
backButton.innerHTML = "←";
backButton.addEventListener("click", function (e) {
if (popup.canGoBack)
popup.goBack();
}); });
forwardButton = document.createElement("button"); forwardButton = document.createElement('button');
forwardButton.style.marginLeft = "20px"; forwardButton.style.marginLeft = '20px';
forwardButton.style.width = "40px"; forwardButton.style.width = '40px';
forwardButton.style.height = "40px"; forwardButton.style.height = '40px';
forwardButton.style.borderRadius = "40px"; forwardButton.style.borderRadius = '40px';
forwardButton.innerHTML = "→"; forwardButton.innerHTML = '→';
forwardButton.addEventListener("click", function (e) { forwardButton.addEventListener('click', function (e) {
if (popup.canGoForward) if (popup.canGoForward) { popup.goForward(); }
popup.goForward();
}); });
closeButton = document.createElement("button"); closeButton = document.createElement('button');
closeButton.style.marginLeft = "20px"; closeButton.style.marginLeft = '20px';
closeButton.style.width = "40px"; closeButton.style.width = '40px';
closeButton.style.height = "40px"; closeButton.style.height = '40px';
closeButton.style.borderRadius = "40px"; closeButton.style.borderRadius = '40px';
closeButton.innerHTML = "✖"; closeButton.innerHTML = '✖';
closeButton.addEventListener("click", function (e) { closeButton.addEventListener('click', function (e) {
setTimeout(function () { setTimeout(function () {
IAB.close(); IAB.close();
}, 0); }, 0);
@ -194,7 +191,7 @@ var IAB = {
browserWrap.appendChild(navigationButtonsDiv); browserWrap.appendChild(navigationButtonsDiv);
} else { } else {
popup.style.height = "100%"; popup.style.height = '100%';
} }
// start listening for navigation events // start listening for navigation events
@ -205,8 +202,8 @@ var IAB = {
}, },
injectScriptCode: function (win, fail, args) { injectScriptCode: function (win, fail, args) {
var code = args[0], var code = args[0];
hasCallback = args[1]; var hasCallback = args[1];
if (browserWrap && popup) { if (browserWrap && popup) {
try { try {
@ -214,7 +211,7 @@ var IAB = {
if (hasCallback) { if (hasCallback) {
win([]); win([]);
} }
} catch(e) { } catch (e) {
console.error('Error occured while trying to injectScriptCode: ' + JSON.stringify(e)); console.error('Error occured while trying to injectScriptCode: ' + JSON.stringify(e));
} }
} }
@ -226,7 +223,7 @@ var IAB = {
if (fail) { if (fail) {
fail(msg); fail(msg);
} }
}, },
injectStyleCode: function (win, fail, args) { injectStyleCode: function (win, fail, args) {
var msg = 'Browser cordova-plugin-inappbrowser injectStyleCode is not yet implemented'; var msg = 'Browser cordova-plugin-inappbrowser injectStyleCode is not yet implemented';
@ -247,4 +244,4 @@ var IAB = {
module.exports = IAB; module.exports = IAB;
require("cordova/exec/proxy").add("InAppBrowser", module.exports); require('cordova/exec/proxy').add('InAppBrowser', module.exports);

View File

@ -32,7 +32,7 @@ var IABExecs = {
if (browserWrap) { if (browserWrap) {
browserWrap.parentNode.removeChild(browserWrap); browserWrap.parentNode.removeChild(browserWrap);
browserWrap = null; browserWrap = null;
if (typeof(win) == "function") win({type:'exit'}); if (typeof (win) === 'function') win({type: 'exit'});
} }
}, },
@ -48,17 +48,17 @@ var IABExecs = {
}, },
open: function (win, lose, args) { open: function (win, lose, args) {
var strUrl = args[0], var strUrl = args[0];
target = args[1], var target = args[1];
features_string = args[2] || "location=yes", //location=yes is default var features_string = args[2] || 'location=yes'; // location=yes is default
features = {}; var features = {};
var features_list = features_string.split(','); var features_list = features_string.split(',');
features_list.forEach(function(feature) { features_list.forEach(function (feature) {
var tup = feature.split('='); var tup = feature.split('=');
if (tup[1] == 'yes') { if (tup[1] === 'yes') {
tup[1] = true; tup[1] = true;
} else if (tup[1] == 'no') { } else if (tup[1] === 'no') {
tup[1] = false; tup[1] = false;
} else { } else {
var number = parseInt(tup[1]); var number = parseInt(tup[1]);
@ -68,8 +68,7 @@ var IABExecs = {
} }
features[tup[0]] = tup[1]; features[tup[0]] = tup[1];
}); });
function updateIframeSizeNoLocation () {
function updateIframeSizeNoLocation() {
browserWrap.style.width = window.innerWidth + 'px'; browserWrap.style.width = window.innerWidth + 'px';
browserWrap.style.height = window.innerHeight + 'px'; browserWrap.style.height = window.innerHeight + 'px';
browserWrap.style.zIndex = '999999999'; browserWrap.style.zIndex = '999999999';
@ -117,7 +116,7 @@ var IABExecs = {
var checkForwardBackward = function () { var checkForwardBackward = function () {
var backReq = browserElem.getCanGoBack(); var backReq = browserElem.getCanGoBack();
backReq.onsuccess = function() { backReq.onsuccess = function () {
if (this.result) { if (this.result) {
back.classList.remove('disabled'); back.classList.remove('disabled');
} else { } else {
@ -125,7 +124,7 @@ var IABExecs = {
} }
}; };
var forwardReq = browserElem.getCanGoForward(); var forwardReq = browserElem.getCanGoForward();
forwardReq.onsuccess = function() { forwardReq.onsuccess = function () {
if (this.result) { if (this.result) {
forward.classList.remove('disabled'); forward.classList.remove('disabled');
} else { } else {
@ -158,21 +157,21 @@ var IABExecs = {
browserWrap.appendChild(browserElem); browserWrap.appendChild(browserElem);
document.body.appendChild(browserWrap); document.body.appendChild(browserWrap);
//we use mozbrowserlocationchange instead of mozbrowserloadstart to get the url // we use mozbrowserlocationchange instead of mozbrowserloadstart to get the url
browserElem.addEventListener('mozbrowserlocationchange', function(e){ browserElem.addEventListener('mozbrowserlocationchange', function (e) {
win({ win({
type:'loadstart', type: 'loadstart',
url : e.detail url: e.detail
}); });
}, false); }, false);
browserElem.addEventListener('mozbrowserloadend', function(e){ browserElem.addEventListener('mozbrowserloadend', function (e) {
win({type:'loadstop'}); win({type: 'loadstop'});
}, false); }, false);
browserElem.addEventListener('mozbrowsererror', function(e){ browserElem.addEventListener('mozbrowsererror', function (e) {
win({type:'loaderror'}); win({type: 'loaderror'});
}, false); }, false);
browserElem.addEventListener('mozbrowserclose', function(e){ browserElem.addEventListener('mozbrowserclose', function (e) {
win({type:'exit'}); win({type: 'exit'});
}, false); }, false);
} else { } else {
window.location = strUrl; window.location = strUrl;

View File

@ -19,14 +19,13 @@
* *
*/ */
/* jshint -W061 */
/* global oxide */ /* global oxide */
oxide.addMessageHandler("EXECUTE", function(msg) { oxide.addMessageHandler('EXECUTE', function (msg) {
var code = msg.args.code; var code = msg.args.code;
try { try {
msg.reply({result: eval(code)}); msg.reply({result: eval(code)}); // eslint-disable-line no-eval
} catch(e) { } catch (e) {
msg.error("Code threw exception: \"" + e + "\""); msg.error('Code threw exception: "' + e + '"');
} }
}); });

View File

@ -1,4 +1,4 @@
/* /*
* *
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -21,9 +21,10 @@
/* jslint sloppy:true */ /* jslint sloppy:true */
/* global Windows:true, setImmediate */ /* global Windows:true, setImmediate */
/* eslint standard/no-callback-literal : 0 */
var cordova = require('cordova'), var cordova = require('cordova');
urlutil = require('cordova/urlutil'); var urlutil = require('cordova/urlutil');
var browserWrap, var browserWrap,
popup, popup,
@ -40,56 +41,56 @@ var browserWrap,
// http://msdn.microsoft.com/en-us/library/windows/apps/dn301831.aspx // http://msdn.microsoft.com/en-us/library/windows/apps/dn301831.aspx
var isWebViewAvailable = cordova.platformId === 'windows'; var isWebViewAvailable = cordova.platformId === 'windows';
function attachNavigationEvents(element, callback) { function attachNavigationEvents (element, callback) {
if (isWebViewAvailable) { if (isWebViewAvailable) {
element.addEventListener("MSWebViewNavigationStarting", function (e) { element.addEventListener('MSWebViewNavigationStarting', function (e) {
callback({ type: "loadstart", url: e.uri}, {keepCallback: true} ); callback({ type: 'loadstart', url: e.uri }, {keepCallback: true});
}); });
element.addEventListener("MSWebViewNavigationCompleted", function (e) { element.addEventListener('MSWebViewNavigationCompleted', function (e) {
if (e.isSuccess) { if (e.isSuccess) {
callback({ type: "loadstop", url: e.uri }, { keepCallback: true }); callback({ type: 'loadstop', url: e.uri }, { keepCallback: true });
} else { } else {
callback({ type: "loaderror", url: e.uri, code: e.webErrorStatus, message: "Navigation failed with error code " + e.webErrorStatus}, { keepCallback: true }); callback({ type: 'loaderror', url: e.uri, code: e.webErrorStatus, message: 'Navigation failed with error code ' + e.webErrorStatus }, { keepCallback: true });
} }
}); });
element.addEventListener("MSWebViewUnviewableContentIdentified", function (e) { element.addEventListener('MSWebViewUnviewableContentIdentified', function (e) {
// WebView found the content to be not HTML. // WebView found the content to be not HTML.
// http://msdn.microsoft.com/en-us/library/windows/apps/dn609716.aspx // http://msdn.microsoft.com/en-us/library/windows/apps/dn609716.aspx
callback({ type: "loaderror", url: e.uri, code: e.webErrorStatus, message: "Navigation failed with error code " + e.webErrorStatus}, { keepCallback: true }); callback({ type: 'loaderror', url: e.uri, code: e.webErrorStatus, message: 'Navigation failed with error code ' + e.webErrorStatus }, { keepCallback: true });
}); });
element.addEventListener("MSWebViewContentLoading", function (e) { element.addEventListener('MSWebViewContentLoading', function (e) {
if (navigationButtonsDiv && popup) { if (navigationButtonsDiv && popup) {
if (popup.canGoBack) { if (popup.canGoBack) {
backButton.removeAttribute("disabled"); backButton.removeAttribute('disabled');
} else { } else {
backButton.setAttribute("disabled", "true"); backButton.setAttribute('disabled', 'true');
} }
if (popup.canGoForward) { if (popup.canGoForward) {
forwardButton.removeAttribute("disabled"); forwardButton.removeAttribute('disabled');
} else { } else {
forwardButton.setAttribute("disabled", "true"); forwardButton.setAttribute('disabled', 'true');
} }
} }
}); });
} else { } else {
var onError = function () { var onError = function () {
callback({ type: "loaderror", url: this.contentWindow.location}, {keepCallback: true}); callback({ type: 'loaderror', url: this.contentWindow.location }, {keepCallback: true});
}; };
element.addEventListener("unload", function () { element.addEventListener('unload', function () {
callback({ type: "loadstart", url: this.contentWindow.location}, {keepCallback: true}); callback({ type: 'loadstart', url: this.contentWindow.location }, {keepCallback: true});
}); });
element.addEventListener("load", function () { element.addEventListener('load', function () {
callback({ type: "loadstop", url: this.contentWindow.location}, {keepCallback: true}); callback({ type: 'loadstop', url: this.contentWindow.location }, {keepCallback: true});
}); });
element.addEventListener("error", onError); element.addEventListener('error', onError);
element.addEventListener("abort", onError); element.addEventListener('abort', onError);
} }
} }
@ -98,7 +99,7 @@ var IAB = {
setImmediate(function () { setImmediate(function () {
if (browserWrap) { if (browserWrap) {
if (navigationEventsCallback) { if (navigationEventsCallback) {
navigationEventsCallback({ type: "exit" }); navigationEventsCallback({ type: 'exit' });
} }
browserWrap.parentNode.removeChild(browserWrap); browserWrap.parentNode.removeChild(browserWrap);
@ -107,52 +108,52 @@ var IAB = {
browserWrap = null; browserWrap = null;
popup = null; popup = null;
document.removeEventListener("backbutton", hardwareBackCallback, false); document.removeEventListener('backbutton', hardwareBackCallback, false);
} }
}); });
}, },
show: function (win, lose) { show: function (win, lose) {
setImmediate(function () { setImmediate(function () {
if (browserWrap) { if (browserWrap) {
browserWrap.style.display = "block"; browserWrap.style.display = 'block';
} }
}); });
}, },
hide: function (win, lose) { hide: function (win, lose) {
if (browserWrap) { if (browserWrap) {
browserWrap.style.display = "none"; browserWrap.style.display = 'none';
} }
}, },
open: function (win, lose, args) { open: function (win, lose, args) {
// make function async so that we can add navigation events handlers before view is loaded and navigation occured // make function async so that we can add navigation events handlers before view is loaded and navigation occured
setImmediate(function () { setImmediate(function () {
var strUrl = args[0], var strUrl = args[0];
target = args[1], var target = args[1];
features = args[2], var features = args[2];
url; var url;
navigationEventsCallback = win; navigationEventsCallback = win;
if (target === "_system") { if (target === '_system') {
url = new Windows.Foundation.Uri(strUrl); url = new Windows.Foundation.Uri(strUrl);
Windows.System.Launcher.launchUriAsync(url); Windows.System.Launcher.launchUriAsync(url);
} else if (target === "_self" || !target) { } else if (target === '_self' || !target) {
window.location = strUrl; window.location = strUrl;
} else { } else {
// "_blank" or anything else // "_blank" or anything else
if (!browserWrap) { if (!browserWrap) {
var browserWrapStyle = document.createElement('link'); var browserWrapStyle = document.createElement('link');
browserWrapStyle.rel = "stylesheet"; browserWrapStyle.rel = 'stylesheet';
browserWrapStyle.type = "text/css"; browserWrapStyle.type = 'text/css';
browserWrapStyle.href = urlutil.makeAbsolute("/www/css/inappbrowser.css"); browserWrapStyle.href = urlutil.makeAbsolute('/www/css/inappbrowser.css');
document.head.appendChild(browserWrapStyle); document.head.appendChild(browserWrapStyle);
browserWrap = document.createElement("div"); browserWrap = document.createElement('div');
browserWrap.className = "inAppBrowserWrap"; browserWrap.className = 'inAppBrowserWrap';
if (features.indexOf("fullscreen=yes") > -1) { if (features.indexOf('fullscreen=yes') > -1) {
browserWrap.classList.add("inAppBrowserWrapFullscreen"); browserWrap.classList.add('inAppBrowserWrapFullscreen');
} }
// Save body overflow style to be able to reset it back later // Save body overflow style to be able to reset it back later
@ -166,22 +167,22 @@ var IAB = {
document.body.appendChild(browserWrap); document.body.appendChild(browserWrap);
// Hide scrollbars for the whole body while inappbrowser's window is open // Hide scrollbars for the whole body while inappbrowser's window is open
document.body.style.msOverflowStyle = "none"; document.body.style.msOverflowStyle = 'none';
} }
if (features.indexOf("hidden=yes") !== -1) { if (features.indexOf('hidden=yes') !== -1) {
browserWrap.style.display = "none"; browserWrap.style.display = 'none';
} }
popup = document.createElement(isWebViewAvailable ? "x-ms-webview" : "iframe"); popup = document.createElement(isWebViewAvailable ? 'x-ms-webview' : 'iframe');
if (popup instanceof HTMLIFrameElement) { if (popup instanceof HTMLIFrameElement) { // eslint-disable-line no-undef
// For iframe we need to override bacground color of parent element here // For iframe we need to override bacground color of parent element here
// otherwise pages without background color set will have transparent background // otherwise pages without background color set will have transparent background
popup.style.backgroundColor = "white"; popup.style.backgroundColor = 'white';
} }
popup.style.borderWidth = "0px"; popup.style.borderWidth = '0px';
popup.style.width = "100%"; popup.style.width = '100%';
popup.style.marginBottom = "-5px"; popup.style.marginBottom = '-5px';
browserWrap.appendChild(popup); browserWrap.appendChild(popup);
@ -191,14 +192,14 @@ var IAB = {
}, 0); }, 0);
}; };
if (features.indexOf("hardwareback=yes") > -1 || features.indexOf("hardwareback") === -1) { if (features.indexOf('hardwareback=yes') > -1 || features.indexOf('hardwareback') === -1) {
hardwareBackCallback = function () { hardwareBackCallback = function () {
if (browserWrap.style.display === 'none') { if (browserWrap.style.display === 'none') {
// NOTE: backbutton handlers have to throw an exception in order to prevent // NOTE: backbutton handlers have to throw an exception in order to prevent
// returning 'true' inside cordova-js, which would mean that the event is handled by user. // returning 'true' inside cordova-js, which would mean that the event is handled by user.
// Throwing an exception means that the default/system navigation behavior will take place, // Throwing an exception means that the default/system navigation behavior will take place,
// which is to exit the app if the navigation stack is empty. // which is to exit the app if the navigation stack is empty.
throw 'Exit the app'; throw 'Exit the app'; // eslint-disable-line no-throw-literal
} }
if (popup.canGoBack) { if (popup.canGoBack) {
@ -207,59 +208,57 @@ var IAB = {
closeHandler(); closeHandler();
} }
}; };
} else if (features.indexOf("hardwareback=no") > -1) { } else if (features.indexOf('hardwareback=no') > -1) {
hardwareBackCallback = function () { hardwareBackCallback = function () {
if (browserWrap.style.display === 'none') { if (browserWrap.style.display === 'none') {
// See comment above // See comment above
throw 'Exit the app'; throw 'Exit the app'; // eslint-disable-line no-throw-literal
} }
closeHandler(); closeHandler();
}; };
} }
document.addEventListener("backbutton", hardwareBackCallback, false); document.addEventListener('backbutton', hardwareBackCallback, false);
if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) { if (features.indexOf('location=yes') !== -1 || features.indexOf('location') === -1) {
popup.style.height = "calc(100% - 70px)"; popup.style.height = 'calc(100% - 70px)';
navigationButtonsDiv = document.createElement("div"); navigationButtonsDiv = document.createElement('div');
navigationButtonsDiv.className = "inappbrowser-app-bar"; navigationButtonsDiv.className = 'inappbrowser-app-bar';
navigationButtonsDiv.onclick = function (e) { navigationButtonsDiv.onclick = function (e) {
e.cancelBubble = true; e.cancelBubble = true;
}; };
navigationButtonsDivInner = document.createElement("div"); navigationButtonsDivInner = document.createElement('div');
navigationButtonsDivInner.className = "inappbrowser-app-bar-inner"; navigationButtonsDivInner.className = 'inappbrowser-app-bar-inner';
navigationButtonsDivInner.onclick = function (e) { navigationButtonsDivInner.onclick = function (e) {
e.cancelBubble = true; e.cancelBubble = true;
}; };
backButton = document.createElement("div"); backButton = document.createElement('div');
backButton.innerText = "back"; backButton.innerText = 'back';
backButton.className = "app-bar-action action-back"; backButton.className = 'app-bar-action action-back';
backButton.addEventListener("click", function (e) { backButton.addEventListener('click', function (e) {
if (popup.canGoBack) if (popup.canGoBack) { popup.goBack(); }
popup.goBack();
}); });
forwardButton = document.createElement("div"); forwardButton = document.createElement('div');
forwardButton.innerText = "forward"; forwardButton.innerText = 'forward';
forwardButton.className = "app-bar-action action-forward"; forwardButton.className = 'app-bar-action action-forward';
forwardButton.addEventListener("click", function (e) { forwardButton.addEventListener('click', function (e) {
if (popup.canGoForward) if (popup.canGoForward) { popup.goForward(); }
popup.goForward();
}); });
closeButton = document.createElement("div"); closeButton = document.createElement('div');
closeButton.innerText = "close"; closeButton.innerText = 'close';
closeButton.className = "app-bar-action action-close"; closeButton.className = 'app-bar-action action-close';
closeButton.addEventListener("click", closeHandler); closeButton.addEventListener('click', closeHandler);
if (!isWebViewAvailable) { if (!isWebViewAvailable) {
// iframe navigation is not yet supported // iframe navigation is not yet supported
backButton.setAttribute("disabled", "true"); backButton.setAttribute('disabled', 'true');
forwardButton.setAttribute("disabled", "true"); forwardButton.setAttribute('disabled', 'true');
} }
navigationButtonsDivInner.appendChild(backButton); navigationButtonsDivInner.appendChild(backButton);
@ -269,14 +268,14 @@ var IAB = {
browserWrap.appendChild(navigationButtonsDiv); browserWrap.appendChild(navigationButtonsDiv);
} else { } else {
popup.style.height = "100%"; popup.style.height = '100%';
} }
// start listening for navigation events // start listening for navigation events
attachNavigationEvents(popup, navigationEventsCallback); attachNavigationEvents(popup, navigationEventsCallback);
if (isWebViewAvailable) { if (isWebViewAvailable) {
strUrl = strUrl.replace("ms-appx://", "ms-appx-web://"); strUrl = strUrl.replace('ms-appx://', 'ms-appx-web://');
} }
popup.src = strUrl; popup.src = strUrl;
} }
@ -285,11 +284,11 @@ var IAB = {
injectScriptCode: function (win, fail, args) { injectScriptCode: function (win, fail, args) {
setImmediate(function () { setImmediate(function () {
var code = args[0], var code = args[0];
hasCallback = args[1]; var hasCallback = args[1];
if (isWebViewAvailable && browserWrap && popup) { if (isWebViewAvailable && browserWrap && popup) {
var op = popup.invokeScriptAsync("eval", code); var op = popup.invokeScriptAsync('eval', code);
op.oncomplete = function (e) { op.oncomplete = function (e) {
if (hasCallback) { if (hasCallback) {
// return null if event target is unavailable by some reason // return null if event target is unavailable by some reason
@ -305,10 +304,10 @@ var IAB = {
injectScriptFile: function (win, fail, args) { injectScriptFile: function (win, fail, args) {
setImmediate(function () { setImmediate(function () {
var filePath = args[0], var filePath = args[0];
hasCallback = args[1]; var hasCallback = args[1];
if (!!filePath) { if (filePath) {
filePath = urlutil.makeAbsolute(filePath); filePath = urlutil.makeAbsolute(filePath);
} }
@ -317,8 +316,8 @@ var IAB = {
var uri = new Windows.Foundation.Uri(filePath.replace('ms-appx-web:', 'ms-appx:')); var uri = new Windows.Foundation.Uri(filePath.replace('ms-appx-web:', 'ms-appx:'));
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) { Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) {
Windows.Storage.FileIO.readTextAsync(file).done(function (code) { Windows.Storage.FileIO.readTextAsync(file).done(function (code) {
var op = popup.invokeScriptAsync("eval", code); var op = popup.invokeScriptAsync('eval', code);
op.oncomplete = function(e) { op.oncomplete = function (e) {
if (hasCallback) { if (hasCallback) {
var result = [e.target.result]; var result = [e.target.result];
win(result); win(result);
@ -334,8 +333,8 @@ var IAB = {
injectStyleCode: function (win, fail, args) { injectStyleCode: function (win, fail, args) {
setImmediate(function () { setImmediate(function () {
var code = args[0], var code = args[0];
hasCallback = args[1]; var hasCallback = args[1];
if (isWebViewAvailable && browserWrap && popup) { if (isWebViewAvailable && browserWrap && popup) {
injectCSS(popup, code, hasCallback && win); injectCSS(popup, code, hasCallback && win);
@ -345,8 +344,8 @@ var IAB = {
injectStyleFile: function (win, fail, args) { injectStyleFile: function (win, fail, args) {
setImmediate(function () { setImmediate(function () {
var filePath = args[0], var filePath = args[0];
hasCallback = args[1]; var hasCallback = args[1];
filePath = filePath && urlutil.makeAbsolute(filePath); filePath = filePath && urlutil.makeAbsolute(filePath);
@ -368,11 +367,11 @@ var IAB = {
function injectCSS (webView, cssCode, callback) { function injectCSS (webView, cssCode, callback) {
// This will automatically escape all thing that we need (quotes, slashes, etc.) // This will automatically escape all thing that we need (quotes, slashes, etc.)
var escapedCode = JSON.stringify(cssCode); var escapedCode = JSON.stringify(cssCode);
var evalWrapper = "(function(d){var c=d.createElement('style');c.innerHTML=%s;d.head.appendChild(c);})(document)" var evalWrapper = '(function(d){var c=d.createElement(\'style\');c.innerHTML=%s;d.head.appendChild(c);})(document)'
.replace('%s', escapedCode); .replace('%s', escapedCode);
var op = webView.invokeScriptAsync("eval", evalWrapper); var op = webView.invokeScriptAsync('eval', evalWrapper);
op.oncomplete = function() { op.oncomplete = function () {
if (callback) { if (callback) {
callback([]); callback([]);
} }
@ -383,4 +382,4 @@ function injectCSS (webView, cssCode, callback) {
module.exports = IAB; module.exports = IAB;
require("cordova/exec/proxy").add("InAppBrowser", module.exports); require('cordova/exec/proxy').add('InAppBrowser', module.exports);

2
tests/.eslintrc.yml Normal file
View File

@ -0,0 +1,2 @@
env:
jasmine: true

View File

@ -16,5 +16,5 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
var d = document.getElementById("header"); var d = document.getElementById('header');
d.innerHTML = "Script file successfully injected"; d.innerHTML = 'Script file successfully injected';

View File

@ -19,7 +19,6 @@
* *
*/ */
/* jshint jasmine: true */
/* global MSApp */ /* global MSApp */
var cordova = require('cordova'); var cordova = require('cordova');
@ -36,11 +35,11 @@ exports.defineAutoTests = function () {
describe('cordova.InAppBrowser', function () { describe('cordova.InAppBrowser', function () {
it("inappbrowser.spec.1 should exist", function () { it('inappbrowser.spec.1 should exist', function () {
expect(cordova.InAppBrowser).toBeDefined(); expect(cordova.InAppBrowser).toBeDefined();
}); });
it("inappbrowser.spec.2 should contain open function", function () { it('inappbrowser.spec.2 should contain open function', function () {
expect(cordova.InAppBrowser.open).toBeDefined(); expect(cordova.InAppBrowser.open).toBeDefined();
expect(cordova.InAppBrowser.open).toEqual(jasmine.any(Function)); expect(cordova.InAppBrowser.open).toEqual(jasmine.any(Function));
}); });
@ -48,7 +47,7 @@ exports.defineAutoTests = function () {
describe('open method', function () { describe('open method', function () {
if (cordova.platformId == 'osx') { if (cordova.platformId === 'osx') {
pending('Open method not fully supported on OSX.'); pending('Open method not fully supported on OSX.');
return; return;
} }
@ -78,7 +77,7 @@ exports.defineAutoTests = function () {
setTimeout(done, 2000); setTimeout(done, 2000);
}); });
function verifyEvent(evt, type) { function verifyEvent (evt, type) {
expect(evt).toBeDefined(); expect(evt).toBeDefined();
expect(evt.type).toEqual(type); expect(evt.type).toEqual(type);
// `exit` event does not have url field, browser returns null url for CORS requests // `exit` event does not have url field, browser returns null url for CORS requests
@ -87,7 +86,7 @@ exports.defineAutoTests = function () {
} }
} }
function verifyLoadErrorEvent(evt) { function verifyLoadErrorEvent (evt) {
expect(evt).toBeDefined(); expect(evt).toBeDefined();
expect(evt.type).toEqual('loaderror'); expect(evt.type).toEqual('loaderror');
expect(evt.url).toEqual(badUrl); expect(evt.url).toEqual(badUrl);
@ -95,7 +94,7 @@ exports.defineAutoTests = function () {
expect(evt.message).toEqual(jasmine.any(String)); expect(evt.message).toEqual(jasmine.any(String));
} }
it("inappbrowser.spec.3 should return InAppBrowser instance with required methods", function () { it('inappbrowser.spec.3 should return InAppBrowser instance with required methods', function () {
iabInstance = cordova.InAppBrowser.open(url, '_blank'); iabInstance = cordova.InAppBrowser.open(url, '_blank');
expect(iabInstance).toBeDefined(); expect(iabInstance).toBeDefined();
@ -109,7 +108,7 @@ exports.defineAutoTests = function () {
expect(iabInstance.insertCSS).toEqual(jasmine.any(Function)); expect(iabInstance.insertCSS).toEqual(jasmine.any(Function));
}); });
it("inappbrowser.spec.4 should support loadstart and loadstop events", function (done) { it('inappbrowser.spec.4 should support loadstart and loadstop events', function (done) {
var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) { var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) {
verifyEvent(evt, 'loadstart'); verifyEvent(evt, 'loadstart');
}); });
@ -127,7 +126,7 @@ exports.defineAutoTests = function () {
}); });
}); });
it("inappbrowser.spec.5 should support exit event", function (done) { it('inappbrowser.spec.5 should support exit event', function (done) {
iabInstance = cordova.InAppBrowser.open(url, '_blank'); iabInstance = cordova.InAppBrowser.open(url, '_blank');
iabInstance.addEventListener('exit', function (evt) { iabInstance.addEventListener('exit', function (evt) {
verifyEvent(evt, 'exit'); verifyEvent(evt, 'exit');
@ -137,7 +136,7 @@ exports.defineAutoTests = function () {
iabInstance = null; iabInstance = null;
}); });
it("inappbrowser.spec.6 should support loaderror event", function (done) { it('inappbrowser.spec.6 should support loaderror event', function (done) {
if (isBrowser) { if (isBrowser) {
// according to documentation, "loaderror" event is not supported on browser // according to documentation, "loaderror" event is not supported on browser
// https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1 // https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1
@ -154,15 +153,15 @@ exports.defineAutoTests = function () {
exports.defineManualTests = function (contentEl, createActionButton) { exports.defineManualTests = function (contentEl, createActionButton) {
function doOpen(url, target, params, numExpectedRedirects, useWindowOpen) { function doOpen (url, target, params, numExpectedRedirects, useWindowOpen) {
numExpectedRedirects = numExpectedRedirects || 0; numExpectedRedirects = numExpectedRedirects || 0;
useWindowOpen = useWindowOpen || false; useWindowOpen = useWindowOpen || false;
console.log("Opening " + url); console.log('Opening ' + url);
var counts; var counts;
var lastLoadStartURL; var lastLoadStartURL;
var wasReset = false; var wasReset = false;
function reset() { function reset () {
counts = { counts = {
'loaderror': 0, 'loaderror': 0,
'loadstart': 0, 'loadstart': 0,
@ -183,49 +182,48 @@ exports.defineManualTests = function (contentEl, createActionButton) {
if (useWindowOpen) { if (useWindowOpen) {
console.log('Use window.open() for url'); console.log('Use window.open() for url');
iab = window.open(url, target, params, callbacks); iab = window.open(url, target, params, callbacks);
} } else {
else {
iab = cordova.InAppBrowser.open(url, target, params, callbacks); iab = cordova.InAppBrowser.open(url, target, params, callbacks);
} }
if (!iab) { if (!iab) {
alert('open returned ' + iab); alert('open returned ' + iab); // eslint-disable-line no-undef
return; return;
} }
function logEvent(e) { function logEvent (e) {
console.log('IAB event=' + JSON.stringify(e)); console.log('IAB event=' + JSON.stringify(e));
counts[e.type]++; counts[e.type]++;
// Verify that event.url gets updated on redirects. // Verify that event.url gets updated on redirects.
if (e.type == 'loadstart') { if (e.type === 'loadstart') {
if (e.url == lastLoadStartURL) { if (e.url === lastLoadStartURL) {
alert('Unexpected: loadstart fired multiple times for the same URL.'); alert('Unexpected: loadstart fired multiple times for the same URL.'); // eslint-disable-line no-undef
} }
lastLoadStartURL = e.url; lastLoadStartURL = e.url;
} }
// Verify the right number of loadstart events were fired. // Verify the right number of loadstart events were fired.
if (e.type == 'loadstop' || e.type == 'loaderror') { if (e.type === 'loadstop' || e.type === 'loaderror') {
if (e.url != lastLoadStartURL) { if (e.url !== lastLoadStartURL) {
alert('Unexpected: ' + e.type + ' event.url != loadstart\'s event.url'); alert('Unexpected: ' + e.type + ' event.url != loadstart\'s event.url'); // eslint-disable-line no-undef
} }
if (numExpectedRedirects === 0 && counts.loadstart !== 1) { if (numExpectedRedirects === 0 && counts.loadstart !== 1) {
// Do allow a loaderror without a loadstart (e.g. in the case of an invalid URL). // Do allow a loaderror without a loadstart (e.g. in the case of an invalid URL).
if (!(e.type == 'loaderror' && counts.loadstart === 0)) { if (!(e.type === 'loaderror' && counts.loadstart === 0)) {
alert('Unexpected: got multiple loadstart events. (' + counts.loadstart + ')'); alert('Unexpected: got multiple loadstart events. (' + counts.loadstart + ')'); // eslint-disable-line no-undef
} }
} else if (numExpectedRedirects > 0 && counts.loadstart < (numExpectedRedirects + 1)) { } else if (numExpectedRedirects > 0 && counts.loadstart < (numExpectedRedirects + 1)) {
alert('Unexpected: should have got at least ' + (numExpectedRedirects + 1) + ' loadstart events, but got ' + counts.loadstart); alert('Unexpected: should have got at least ' + (numExpectedRedirects + 1) + ' loadstart events, but got ' + counts.loadstart); // eslint-disable-line no-undef
} }
wasReset = true; wasReset = true;
numExpectedRedirects = 0; numExpectedRedirects = 0;
reset(); reset();
} }
// Verify that loadend / loaderror was called. // Verify that loadend / loaderror was called.
if (e.type == 'exit') { if (e.type === 'exit') {
var numStopEvents = counts.loadstop + counts.loaderror; var numStopEvents = counts.loadstop + counts.loaderror;
if (numStopEvents === 0 && !wasReset) { if (numStopEvents === 0 && !wasReset) {
alert('Unexpected: browser closed without a loadstop or loaderror.'); alert('Unexpected: browser closed without a loadstop or loaderror.'); // eslint-disable-line no-undef
} else if (numStopEvents > 1) { } else if (numStopEvents > 1) {
alert('Unexpected: got multiple loadstop/loaderror events.'); alert('Unexpected: got multiple loadstop/loaderror events.'); // eslint-disable-line no-undef
} }
} }
} }
@ -233,33 +231,31 @@ exports.defineManualTests = function (contentEl, createActionButton) {
return iab; return iab;
} }
function doHookOpen(url, target, params, numExpectedRedirects) { function doHookOpen (url, target, params, numExpectedRedirects) {
var originalFunc = window.open; var originalFunc = window.open;
var wasClobbered = window.hasOwnProperty('open'); var wasClobbered = window.hasOwnProperty('open');
window.open = cordova.InAppBrowser.open; window.open = cordova.InAppBrowser.open;
try { try {
doOpen(url, target, params, numExpectedRedirects, true); doOpen(url, target, params, numExpectedRedirects, true);
} } finally {
finally {
if (wasClobbered) { if (wasClobbered) {
window.open = originalFunc; window.open = originalFunc;
} } else {
else { console.log('just delete, to restore open from prototype');
console.log('just delete, to restore open from prototype');
delete window.open; delete window.open;
} }
} }
} }
function openWithStyle(url, cssUrl, useCallback) { function openWithStyle (url, cssUrl, useCallback) {
var iab = doOpen(url, '_blank', 'location=yes'); var iab = doOpen(url, '_blank', 'location=yes');
var callback = function (results) { var callback = function (results) {
if (results && results.length === 0) { if (results && results.length === 0) {
alert('Results verified'); alert('Results verified'); // eslint-disable-line no-undef
} else { } else {
console.log(results); console.log(results);
alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef
} }
}; };
if (cssUrl) { if (cssUrl) {
@ -269,21 +265,21 @@ exports.defineManualTests = function (contentEl, createActionButton) {
} else { } else {
iab.addEventListener('loadstop', function (event) { iab.addEventListener('loadstop', function (event) {
iab.insertCSS({ code: '#style-update-literal { \ndisplay: block !important; \n}' }, iab.insertCSS({ code: '#style-update-literal { \ndisplay: block !important; \n}' },
useCallback && callback); useCallback && callback);
}); });
} }
} }
function openWithScript(url, jsUrl, useCallback) { function openWithScript (url, jsUrl, useCallback) {
var iab = doOpen(url, '_blank', 'location=yes'); var iab = doOpen(url, '_blank', 'location=yes');
if (jsUrl) { if (jsUrl) {
iab.addEventListener('loadstop', function (event) { iab.addEventListener('loadstop', function (event) {
iab.executeScript({ file: jsUrl }, useCallback && function (results) { iab.executeScript({ file: jsUrl }, useCallback && function (results) {
if (results && results.length === 0) { if (results && results.length === 0) {
alert('Results verified'); alert('Results verified'); // eslint-disable-line no-undef
} else { } else {
console.log(results); console.log(results);
alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef
} }
}); });
}); });
@ -296,33 +292,33 @@ exports.defineManualTests = function (contentEl, createActionButton) {
'})()'; '})()';
iab.executeScript({ code: code }, useCallback && function (results) { iab.executeScript({ code: code }, useCallback && function (results) {
if (results && results.length === 1 && results[0] === 'abc') { if (results && results.length === 1 && results[0] === 'abc') {
alert('Results verified'); alert('Results verified'); // eslint-disable-line no-undef
} else { } else {
console.log(results); console.log(results);
alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef
} }
}); });
}); });
} }
} }
var hiddenwnd = null; var hiddenwnd = null;
var loadlistener = function (event) { alert('background window loaded '); }; var loadlistener = function (event) { alert('background window loaded '); }; // eslint-disable-line no-undef
function openHidden(url, startHidden) { function openHidden (url, startHidden) {
var shopt = (startHidden) ? 'hidden=yes' : ''; var shopt = (startHidden) ? 'hidden=yes' : '';
hiddenwnd = cordova.InAppBrowser.open(url, 'random_string', shopt); hiddenwnd = cordova.InAppBrowser.open(url, 'random_string', shopt);
if (!hiddenwnd) { if (!hiddenwnd) {
alert('cordova.InAppBrowser.open returned ' + hiddenwnd); alert('cordova.InAppBrowser.open returned ' + hiddenwnd); // eslint-disable-line no-undef
return; return;
} }
if (startHidden) hiddenwnd.addEventListener('loadstop', loadlistener); if (startHidden) hiddenwnd.addEventListener('loadstop', loadlistener);
} }
function showHidden() { function showHidden () {
if (!!hiddenwnd) { if (hiddenwnd) {
hiddenwnd.show(); hiddenwnd.show();
} }
} }
function closeHidden() { function closeHidden () {
if (!!hiddenwnd) { if (hiddenwnd) {
hiddenwnd.removeEventListener('loadstop', loadlistener); hiddenwnd.removeEventListener('loadstop', loadlistener);
hiddenwnd.close(); hiddenwnd.close();
hiddenwnd = null; hiddenwnd = null;
@ -467,14 +463,14 @@ exports.defineManualTests = function (contentEl, createActionButton) {
'<p/> <div id="openHardwareBackYes"></div>' + '<p/> <div id="openHardwareBackYes"></div>' +
'Expected result: hardwareback=yes pressing back button should navigate backwards in history then close InAppBrowser' + 'Expected result: hardwareback=yes pressing back button should navigate backwards in history then close InAppBrowser' +
'<p/> <div id="openHardwareBackNo"></div>' + '<p/> <div id="openHardwareBackNo"></div>' +
'Expected result: hardwareback=no pressing back button should close InAppBrowser regardless history' + 'Expected result: hardwareback=no pressing back button should close InAppBrowser regardless history' +
'<p/> <div id="openHardwareBackDefaultAfterNo"></div>' + '<p/> <div id="openHardwareBackDefaultAfterNo"></div>' +
'Expected result: consistently open browsers with with the appropriate option: hardwareback=defaults to yes then hardwareback=no then hardwareback=defaults to yes. By default hardwareback is yes so pressing back button should navigate backwards in history then close InAppBrowser'; 'Expected result: consistently open browsers with with the appropriate option: hardwareback=defaults to yes then hardwareback=no then hardwareback=defaults to yes. By default hardwareback is yes so pressing back button should navigate backwards in history then close InAppBrowser';
// CB-7490 We need to wrap this code due to Windows security restrictions // CB-7490 We need to wrap this code due to Windows security restrictions
// see http://msdn.microsoft.com/en-us/library/windows/apps/hh465380.aspx#differences for details // see http://msdn.microsoft.com/en-us/library/windows/apps/hh465380.aspx#differences for details
if (window.MSApp && window.MSApp.execUnsafeLocalFunction) { if (window.MSApp && window.MSApp.execUnsafeLocalFunction) {
MSApp.execUnsafeLocalFunction(function() { MSApp.execUnsafeLocalFunction(function () {
contentEl.innerHTML = info_div + local_tests + white_listed_tests + non_white_listed_tests + page_with_redirects_tests + pdf_url_tests + invalid_url_tests + contentEl.innerHTML = info_div + local_tests + white_listed_tests + non_white_listed_tests + page_with_redirects_tests + pdf_url_tests + invalid_url_tests +
css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests; css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests;
}); });
@ -483,18 +479,18 @@ exports.defineManualTests = function (contentEl, createActionButton) {
css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests; css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests;
} }
document.getElementById("user-agent").textContent = navigator.userAgent; document.getElementById('user-agent').textContent = navigator.userAgent;
// we are already in cdvtests directory // we are already in cdvtests directory
var basePath = 'iab-resources/'; var basePath = 'iab-resources/';
var localhtml = basePath + 'local.html', var localhtml = basePath + 'local.html';
localpdf = basePath + 'local.pdf', var localpdf = basePath + 'local.pdf';
injecthtml = basePath + 'inject.html', var injecthtml = basePath + 'inject.html';
injectjs = isWindows ? basePath + 'inject.js' : 'inject.js', var injectjs = isWindows ? basePath + 'inject.js' : 'inject.js';
injectcss = isWindows ? basePath + 'inject.css' : 'inject.css', var injectcss = isWindows ? basePath + 'inject.css' : 'inject.css';
videohtml = basePath + 'video.html'; var videohtml = basePath + 'video.html';
//Local // Local
createActionButton('target=Default', function () { createActionButton('target=Default', function () {
doOpen(localhtml); doOpen(localhtml);
}, 'openLocal'); }, 'openLocal');
@ -523,7 +519,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen(localhtml, 'random_string', 'toolbarposition=top,location=no'); doOpen(localhtml, 'random_string', 'toolbarposition=top,location=no');
}, 'openLocalRandomToolBarTopNoLocation'); }, 'openLocalRandomToolBarTopNoLocation');
//White Listed // White Listed
createActionButton('* target=Default', function () { createActionButton('* target=Default', function () {
doOpen('http://cordova.apache.org'); doOpen('http://cordova.apache.org');
}, 'openWhiteListed'); }, 'openWhiteListed');
@ -546,7 +542,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen('http://cordova.apache.org', 'random_string', 'location=no'); doOpen('http://cordova.apache.org', 'random_string', 'location=no');
}, 'openWhiteListedRandomNoLocation'); }, 'openWhiteListedRandomNoLocation');
//Non White Listed // Non White Listed
createActionButton('target=Default', function () { createActionButton('target=Default', function () {
doOpen('http://www.apple.com'); doOpen('http://www.apple.com');
}, 'openNonWhiteListed'); }, 'openNonWhiteListed');
@ -569,7 +565,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen('http://www.apple.com', 'random_string', 'location=no'); doOpen('http://www.apple.com', 'random_string', 'location=no');
}, 'openNonWhiteListedRandomNoLocation'); }, 'openNonWhiteListedRandomNoLocation');
//Page with redirect // Page with redirect
createActionButton('http://google.co.uk', function () { createActionButton('http://google.co.uk', function () {
doOpen('http://google.co.uk', 'random_string', '', 1); doOpen('http://google.co.uk', 'random_string', '', 1);
}, 'openRedirect301'); }, 'openRedirect301');
@ -577,7 +573,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen('http://goo.gl/pUFqg', 'random_string', '', 2); doOpen('http://goo.gl/pUFqg', 'random_string', '', 2);
}, 'openRedirect302'); }, 'openRedirect302');
//PDF URL // PDF URL
createActionButton('Remote URL', function () { createActionButton('Remote URL', function () {
doOpen('http://www.stluciadance.com/prospectus_file/sample.pdf'); doOpen('http://www.stluciadance.com/prospectus_file/sample.pdf');
}, 'openPDF'); }, 'openPDF');
@ -585,7 +581,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen(localpdf, '_blank'); doOpen(localpdf, '_blank');
}, 'openPDFBlank'); }, 'openPDFBlank');
//Invalid URL // Invalid URL
createActionButton('Invalid Scheme', function () { createActionButton('Invalid Scheme', function () {
doOpen('x-ttp://www.invalid.com/', '_blank'); doOpen('x-ttp://www.invalid.com/', '_blank');
}, 'openInvalidScheme'); }, 'openInvalidScheme');
@ -596,7 +592,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen('nonexistent.html', '_blank'); doOpen('nonexistent.html', '_blank');
}, 'openInvalidMissing'); }, 'openInvalidMissing');
//CSS / JS injection // CSS / JS injection
createActionButton('Original Document', function () { createActionButton('Original Document', function () {
doOpen(injecthtml, '_blank'); doOpen(injecthtml, '_blank');
}, 'openOriginalDocument'); }, 'openOriginalDocument');
@ -625,7 +621,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
openWithScript(injecthtml, null, true); openWithScript(injecthtml, null, true);
}, 'openScriptLiteralInjectionCallback'); }, 'openScriptLiteralInjectionCallback');
//Open hidden // Open hidden
createActionButton('Create Hidden', function () { createActionButton('Create Hidden', function () {
openHidden('https://www.google.co.uk', true); openHidden('https://www.google.co.uk', true);
}, 'openHidden'); }, 'openHidden');
@ -645,7 +641,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
}, 2000); }, 2000);
}, 'openVisibleAndHide'); }, 'openVisibleAndHide');
//Clearing cache // Clearing cache
createActionButton('Clear Browser Cache', function () { createActionButton('Clear Browser Cache', function () {
doOpen('https://www.google.co.uk', '_blank', 'clearcache=yes'); doOpen('https://www.google.co.uk', '_blank', 'clearcache=yes');
}, 'openClearCache'); }, 'openClearCache');
@ -653,7 +649,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen('https://www.google.co.uk', '_blank', 'clearsessioncache=yes'); doOpen('https://www.google.co.uk', '_blank', 'clearsessioncache=yes');
}, 'openClearSessionCache'); }, 'openClearSessionCache');
//Video tag // Video tag
createActionButton('Remote Video', function () { createActionButton('Remote Video', function () {
doOpen(videohtml, '_blank'); doOpen(videohtml, '_blank');
}, 'openRemoteVideo'); }, 'openRemoteVideo');
@ -664,7 +660,7 @@ exports.defineManualTests = function (contentEl, createActionButton) {
doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=yes'); doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=yes');
}, 'openRemoteNeedUserYesVideo'); }, 'openRemoteNeedUserYesVideo');
//Local With Anchor Tag // Local With Anchor Tag
createActionButton('Anchor1', function () { createActionButton('Anchor1', function () {
doOpen(localhtml + '#bogusanchor', '_blank'); doOpen(localhtml + '#bogusanchor', '_blank');
}, 'openAnchor1'); }, 'openAnchor1');
@ -682,17 +678,17 @@ exports.defineManualTests = function (contentEl, createActionButton) {
createActionButton('hardwareback=no', function () { createActionButton('hardwareback=no', function () {
doOpen('http://cordova.apache.org', '_blank', 'hardwareback=no'); doOpen('http://cordova.apache.org', '_blank', 'hardwareback=no');
}, 'openHardwareBackNo'); }, 'openHardwareBackNo');
createActionButton('no hardwareback -> hardwareback=no -> no hardwareback', function() { createActionButton('no hardwareback -> hardwareback=no -> no hardwareback', function () {
var ref = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes'); var ref = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes');
ref.addEventListener('loadstop', function() { ref.addEventListener('loadstop', function () {
ref.close(); ref.close();
}); });
ref.addEventListener('exit', function() { ref.addEventListener('exit', function () {
var ref2 = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes,hardwareback=no'); var ref2 = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes,hardwareback=no');
ref2.addEventListener('loadstop', function() { ref2.addEventListener('loadstop', function () {
ref2.close(); ref2.close();
}); });
ref2.addEventListener('exit', function() { ref2.addEventListener('exit', function () {
cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes'); cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes');
}); });
}); });

View File

@ -19,7 +19,7 @@
* *
*/ */
(function() { (function () {
// special patch to correctly work on Ripple emulator (CB-9760) // special patch to correctly work on Ripple emulator (CB-9760)
if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021 if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021
module.exports = window.open.bind(window); // fallback to default window.open behaviour module.exports = window.open.bind(window); // fallback to default window.open behaviour
@ -31,13 +31,13 @@
var modulemapper = require('cordova/modulemapper'); var modulemapper = require('cordova/modulemapper');
var urlutil = require('cordova/urlutil'); var urlutil = require('cordova/urlutil');
function InAppBrowser() { function InAppBrowser () {
this.channels = { this.channels = {
'loadstart': channel.create('loadstart'), 'loadstart': channel.create('loadstart'),
'loadstop' : channel.create('loadstop'), 'loadstop': channel.create('loadstop'),
'loaderror' : channel.create('loaderror'), 'loaderror': channel.create('loaderror'),
'exit' : channel.create('exit') 'exit': channel.create('exit')
}; };
} }
InAppBrowser.prototype = { InAppBrowser.prototype = {
@ -47,47 +47,47 @@
} }
}, },
close: function (eventname) { close: function (eventname) {
exec(null, null, "InAppBrowser", "close", []); exec(null, null, 'InAppBrowser', 'close', []);
}, },
show: function (eventname) { show: function (eventname) {
exec(null, null, "InAppBrowser", "show", []); exec(null, null, 'InAppBrowser', 'show', []);
}, },
hide: function (eventname) { hide: function (eventname) {
exec(null, null, "InAppBrowser", "hide", []); exec(null, null, 'InAppBrowser', 'hide', []);
}, },
addEventListener: function (eventname,f) { addEventListener: function (eventname, f) {
if (eventname in this.channels) { if (eventname in this.channels) {
this.channels[eventname].subscribe(f); this.channels[eventname].subscribe(f);
} }
}, },
removeEventListener: function(eventname, f) { removeEventListener: function (eventname, f) {
if (eventname in this.channels) { if (eventname in this.channels) {
this.channels[eventname].unsubscribe(f); this.channels[eventname].unsubscribe(f);
} }
}, },
executeScript: function(injectDetails, cb) { executeScript: function (injectDetails, cb) {
if (injectDetails.code) { if (injectDetails.code) {
exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); exec(cb, null, 'InAppBrowser', 'injectScriptCode', [injectDetails.code, !!cb]);
} else if (injectDetails.file) { } else if (injectDetails.file) {
exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); exec(cb, null, 'InAppBrowser', 'injectScriptFile', [injectDetails.file, !!cb]);
} else { } else {
throw new Error('executeScript requires exactly one of code or file to be specified'); throw new Error('executeScript requires exactly one of code or file to be specified');
} }
}, },
insertCSS: function(injectDetails, cb) { insertCSS: function (injectDetails, cb) {
if (injectDetails.code) { if (injectDetails.code) {
exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); exec(cb, null, 'InAppBrowser', 'injectStyleCode', [injectDetails.code, !!cb]);
} else if (injectDetails.file) { } else if (injectDetails.file) {
exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); exec(cb, null, 'InAppBrowser', 'injectStyleFile', [injectDetails.file, !!cb]);
} else { } else {
throw new Error('insertCSS requires exactly one of code or file to be specified'); throw new Error('insertCSS requires exactly one of code or file to be specified');
} }
} }
}; };
module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) { module.exports = function (strUrl, strWindowName, strWindowFeatures, callbacks) {
// Don't catch calls that write to existing frames (e.g. named iframes). // Don't catch calls that write to existing frames (e.g. named iframes).
if (window.frames && window.frames[strWindowName]) { if (window.frames && window.frames[strWindowName]) {
var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
@ -102,13 +102,13 @@
iab.addEventListener(callbackName, callbacks[callbackName]); iab.addEventListener(callbackName, callbacks[callbackName]);
} }
var cb = function(eventname) { var cb = function (eventname) {
iab._eventHandler(eventname); iab._eventHandler(eventname);
}; };
strWindowFeatures = strWindowFeatures || ""; strWindowFeatures = strWindowFeatures || '';
exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); exec(cb, cb, 'InAppBrowser', 'open', [strUrl, strWindowName, strWindowFeatures]);
return iab; return iab;
}; };
})(); })();

View File

@ -19,8 +19,8 @@
* *
*/ */
/*jslint sloppy:true */ /* jslint sloppy:true */
/*global Windows:true, require, document, setTimeout, window, module */ /* global Windows:true, require, document, setTimeout, window, module */
var browserWrap; var browserWrap;
@ -36,33 +36,33 @@ var IAB = {
/* empty block, ran out of bacon? /* empty block, ran out of bacon?
if (browserWrap) { if (browserWrap) {
}*/ } */
}, },
hide: function (win, lose) { hide: function (win, lose) {
/* empty block, ran out of bacon? /* empty block, ran out of bacon?
if (browserWrap) { if (browserWrap) {
}*/ } */
}, },
open: function (win, lose, args) { open: function (win, lose, args) {
var strUrl = args[0], var strUrl = args[0];
target = args[1], var target = args[1];
url, var url;
elem; var elem;
if (target === "_system") { if (target === '_system') {
url = new Windows.Foundation.Uri(strUrl); url = new Windows.Foundation.Uri(strUrl);
Windows.System.Launcher.launchUriAsync(url); Windows.System.Launcher.launchUriAsync(url);
} else if (target === "_blank") { } else if (target === '_blank') {
if (!browserWrap) { if (!browserWrap) {
browserWrap = document.createElement("div"); browserWrap = document.createElement('div');
browserWrap.style.position = "absolute"; browserWrap.style.position = 'absolute';
browserWrap.style.width = (window.innerWidth - 80) + "px"; browserWrap.style.width = (window.innerWidth - 80) + 'px';
browserWrap.style.height = (window.innerHeight - 80) + "px"; browserWrap.style.height = (window.innerHeight - 80) + 'px';
browserWrap.style.borderWidth = "40px"; browserWrap.style.borderWidth = '40px';
browserWrap.style.borderStyle = "solid"; browserWrap.style.borderStyle = 'solid';
browserWrap.style.borderColor = "rgba(0,0,0,0.25)"; browserWrap.style.borderColor = 'rgba(0,0,0,0.25)';
browserWrap.style.zIndex = "9999999"; browserWrap.style.zIndex = '9999999';
browserWrap.onclick = function () { browserWrap.onclick = function () {
setTimeout(function () { setTimeout(function () {
@ -74,33 +74,31 @@ var IAB = {
} }
var localFile = (strUrl.indexOf('ms-appdata:///') > -1); var localFile = (strUrl.indexOf('ms-appdata:///') > -1);
if (localFile) { if (localFile) {
elem = document.createElement("x-ms-webview"); elem = document.createElement('x-ms-webview');
elem.style.width = (window.innerWidth - 80) + "px"; elem.style.width = (window.innerWidth - 80) + 'px';
elem.style.height = (window.innerHeight - 80) + "px"; elem.style.height = (window.innerHeight - 80) + 'px';
elem.style.borderWidth = "0px"; elem.style.borderWidth = '0px';
elem.name = "targetFrame"; elem.name = 'targetFrame';
elem.src = strUrl; elem.src = strUrl;
window.addEventListener("resize", function () { window.addEventListener('resize', function () {
if (browserWrap && elem) { if (browserWrap && elem) {
elem.style.width = (window.innerWidth - 80) + "px"; elem.style.width = (window.innerWidth - 80) + 'px';
elem.style.height = (window.innerHeight - 80) + "px"; elem.style.height = (window.innerHeight - 80) + 'px';
} }
}); });
} else { } else {
elem = document.createElement("iframe"); elem = document.createElement('iframe');
elem.style.width = (window.innerWidth - 80) + "px"; elem.style.width = (window.innerWidth - 80) + 'px';
elem.style.height = (window.innerHeight - 80) + "px"; elem.style.height = (window.innerHeight - 80) + 'px';
elem.style.borderWidth = "0px"; elem.style.borderWidth = '0px';
elem.name = "targetFrame"; elem.name = 'targetFrame';
elem.src = strUrl; elem.src = strUrl;
window.addEventListener('resize', function () {
window.addEventListener("resize", function () {
if (browserWrap && elem) { if (browserWrap && elem) {
elem.style.width = (window.innerWidth - 80) + "px"; elem.style.width = (window.innerWidth - 80) + 'px';
elem.style.height = (window.innerHeight - 80) + "px"; elem.style.height = (window.innerHeight - 80) + 'px';
} }
}); });
} }
@ -110,8 +108,7 @@ var IAB = {
window.location = strUrl; window.location = strUrl;
} }
//var object = new WinJS.UI.HtmlControl(elem, { uri: strUrl }); // var object = new WinJS.UI.HtmlControl(elem, { uri: strUrl });
}, },
injectScriptCode: function (code, bCB) { injectScriptCode: function (code, bCB) {
@ -126,5 +123,4 @@ var IAB = {
module.exports = IAB; module.exports = IAB;
require('cordova/exec/proxy').add('InAppBrowser', module.exports);
require("cordova/exec/proxy").add("InAppBrowser", module.exports);