diff --git a/.eslintrc.yml b/.eslintrc.yml index 0cccb8c7a..17277f7fb 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,10 +1,23 @@ +# 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. + root: true -extends: semistandard -rules: - indent: - - error - - 4 - camelcase: off - padded-blocks: off - operator-linebreak: off - no-throw-literal: off \ No newline at end of file +extends: '@cordova/eslint-config/browser' + +overrides: + - files: [tests/**/*.js] + extends: '@cordova/eslint-config/node-tests' diff --git a/package.json b/package.json index 1dbacf72e..2d8f0977b 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "cordova-windows" ], "scripts": { - "test": "npm run eslint", - "eslint": "node node_modules/eslint/bin/eslint www && node node_modules/eslint/bin/eslint src && node node_modules/eslint/bin/eslint tests" + "test": "npm run lint", + "lint": "eslint ." }, "engines": { "cordovaDependencies": { @@ -54,12 +54,6 @@ "author": "Apache Software Foundation", "license": "Apache-2.0", "devDependencies": { - "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" + "@cordova/eslint-config": "^3.0.0" } } diff --git a/src/browser/InAppBrowserProxy.js b/src/browser/InAppBrowserProxy.js index 1c62574b9..9b95b3563 100644 --- a/src/browser/InAppBrowserProxy.js +++ b/src/browser/InAppBrowserProxy.js @@ -17,43 +17,37 @@ * specific language governing permissions and limitations * under the License. * -*/ + */ var modulemapper = require('cordova/modulemapper'); -var browserWrap, - popup, - navigationButtonsDiv, - navigationButtonsDivInner, - backButton, - forwardButton, - closeButton; +var browserWrap, popup, navigationButtonsDiv, navigationButtonsDivInner, backButton, forwardButton, closeButton; function attachNavigationEvents (element, callback) { var onError = function () { try { - callback({ type: 'loaderror', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loaderror', url: this.contentWindow.location.href }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } catch (err) { // blocked by CORS :\ - callback({ type: 'loaderror', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loaderror', url: null }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } }; element.addEventListener('pageshow', function () { try { - callback({ type: 'loadstart', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loadstart', url: this.contentWindow.location.href }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } catch (err) { // blocked by CORS :\ - callback({ type: 'loadstart', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loadstart', url: null }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } }); element.addEventListener('load', function () { try { - callback({ type: 'loadstop', url: this.contentWindow.location.href }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loadstop', url: this.contentWindow.location.href }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } catch (err) { // blocked by CORS :\ - callback({ type: 'loadstop', url: null }, {keepCallback: true}); // eslint-disable-line standard/no-callback-literal + callback({ type: 'loadstop', url: null }, { keepCallback: true }); // eslint-disable-line standard/no-callback-literal } }); @@ -153,7 +147,9 @@ var IAB = { backButton.innerHTML = '←'; backButton.addEventListener('click', function (e) { - if (popup.canGoBack) { popup.goBack(); } + if (popup.canGoBack) { + popup.goBack(); + } }); forwardButton = document.createElement('button'); @@ -164,7 +160,9 @@ var IAB = { forwardButton.innerHTML = '→'; forwardButton.addEventListener('click', function (e) { - if (popup.canGoForward) { popup.goForward(); } + if (popup.canGoForward) { + popup.goForward(); + } }); closeButton = document.createElement('button'); diff --git a/src/windows/InAppBrowserProxy.js b/src/windows/InAppBrowserProxy.js index 9e544c5d0..29277beee 100644 --- a/src/windows/InAppBrowserProxy.js +++ b/src/windows/InAppBrowserProxy.js @@ -17,11 +17,10 @@ * specific language governing permissions and limitations * under the License. * -*/ + */ -/* jslint sloppy:true */ -/* global Windows:true, setImmediate */ -/* eslint standard/no-callback-literal : 0 */ +/* eslint-disable standard/no-callback-literal */ +/* global Windows, setImmediate */ var cordova = require('cordova'); var urlutil = require('cordova/urlutil'); @@ -44,21 +43,32 @@ var isWebViewAvailable = cordova.platformId === 'windows'; function attachNavigationEvents (element, callback) { if (isWebViewAvailable) { 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) { if (e.isSuccess) { callback({ type: 'loadstop', url: e.uri }, { keepCallback: true }); } 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) { // WebView found the content to be not HTML. // 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) { @@ -78,15 +88,15 @@ function attachNavigationEvents (element, callback) { }); } else { 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 () { - callback({ type: 'loadstart', url: this.contentWindow.location }, {keepCallback: true}); + callback({ type: 'loadstart', url: this.contentWindow.location }, { keepCallback: true }); }); 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); @@ -175,7 +185,8 @@ var IAB = { } popup = document.createElement(isWebViewAvailable ? 'x-ms-webview' : 'iframe'); - if (popup instanceof HTMLIFrameElement) { // eslint-disable-line no-undef + if (popup instanceof HTMLIFrameElement) { + // eslint-disable-line no-undef // For iframe we need to override bacground color of parent element here // otherwise pages without background color set will have transparent background popup.style.backgroundColor = 'white'; @@ -240,14 +251,18 @@ var IAB = { backButton.innerText = 'back'; backButton.className = 'app-bar-action action-back'; backButton.addEventListener('click', function (e) { - if (popup.canGoBack) { popup.goBack(); } + if (popup.canGoBack) { + popup.goBack(); + } }); forwardButton = document.createElement('div'); forwardButton.innerText = 'forward'; forwardButton.className = 'app-bar-action action-forward'; forwardButton.addEventListener('click', function (e) { - if (popup.canGoForward) { popup.goForward(); } + if (popup.canGoForward) { + popup.goForward(); + } }); closeButton = document.createElement('div'); @@ -292,11 +307,11 @@ var IAB = { op.oncomplete = function (e) { if (hasCallback) { // return null if event target is unavailable by some reason - var result = (e && e.target) ? [e.target.result] : [null]; + var result = e && e.target ? [e.target.result] : [null]; win(result); } }; - op.onerror = function () { }; + op.onerror = function () {}; op.start(); } }); @@ -323,7 +338,7 @@ var IAB = { win(result); } }; - op.onerror = function () { }; + op.onerror = function () {}; op.start(); }); }); @@ -352,13 +367,18 @@ var IAB = { if (isWebViewAvailable && browserWrap && popup) { // CB-12364 getFileFromApplicationUriAsync does not support ms-appx-web var uri = new Windows.Foundation.Uri(filePath.replace('ms-appx-web:', 'ms-appx:')); - Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) { - return Windows.Storage.FileIO.readTextAsync(file); - }).done(function (code) { - injectCSS(popup, code, hasCallback && win); - }, function () { - // no-op, just catch an error - }); + Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri) + .then(function (file) { + return Windows.Storage.FileIO.readTextAsync(file); + }) + .done( + function (code) { + injectCSS(popup, code, hasCallback && win); + }, + function () { + // no-op, just catch an error + } + ); } }); } @@ -367,8 +387,10 @@ var IAB = { function injectCSS (webView, cssCode, callback) { // This will automatically escape all thing that we need (quotes, slashes, etc.) var escapedCode = JSON.stringify(cssCode); - var evalWrapper = '(function(d){var c=d.createElement(\'style\');c.innerHTML=%s;d.head.appendChild(c);})(document)' - .replace('%s', escapedCode); + var evalWrapper = "(function(d){var c=d.createElement('style');c.innerHTML=%s;d.head.appendChild(c);})(document)".replace( + '%s', + escapedCode + ); var op = webView.invokeScriptAsync('eval', evalWrapper); op.oncomplete = function () { @@ -376,7 +398,7 @@ function injectCSS (webView, cssCode, callback) { callback([]); } }; - op.onerror = function () { }; + op.onerror = function () {}; op.start(); } diff --git a/tests/resources/inject.js b/tests/resources/inject.js index d704ab347..bf94d4e54 100644 --- a/tests/resources/inject.js +++ b/tests/resources/inject.js @@ -15,6 +15,7 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. -*/ + */ + var d = document.getElementById('header'); d.innerHTML = 'Script file successfully injected'; diff --git a/tests/tests.js b/tests/tests.js index 85d5eba8f..150a3c456 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. * -*/ + */ /* global MSApp */ @@ -38,7 +38,6 @@ exports.defineAutoTests = function () { platformOpts = platformOpts || ''; describe('cordova.InAppBrowser', function () { - it('inappbrowser.spec.1 should exist', function () { expect(cordova.InAppBrowser).toBeDefined(); }); @@ -50,7 +49,6 @@ exports.defineAutoTests = function () { }); describe('open method', function () { - if (cordova.platformId === 'osx') { pending('Open method not fully supported on OSX.'); return; @@ -62,7 +60,7 @@ exports.defineAutoTests = function () { var badUrl = 'http://bad-uri/'; beforeEach(function () { - // increase timeout to ensure test url could be loaded within test time + // increase timeout to ensure test url could be loaded within test time originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; @@ -70,7 +68,7 @@ exports.defineAutoTests = function () { }); afterEach(function (done) { - // restore original timeout + // restore original timeout jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; if (iabInstance !== null && iabInstance.close) { @@ -122,8 +120,8 @@ exports.defineAutoTests = function () { iabInstance.addEventListener('loadstop', function (evt) { verifyEvent(evt, 'loadstop'); if (!isBrowser) { - // according to documentation, "loadstart" event is not supported on browser - // https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1 + // according to documentation, "loadstart" event is not supported on browser + // https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1 expect(onLoadStart).toHaveBeenCalled(); } done(); @@ -144,9 +142,9 @@ exports.defineAutoTests = function () { it('inappbrowser.spec.6 should support loaderror event', function (done) { if (isBrowser) { - // according to documentation, "loaderror" event is not supported on browser - // https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1 - pending('Browser platform doesn\'t support loaderror event'); + // according to documentation, "loaderror" event is not supported on browser + // https://github.com/apache/cordova-plugin-inappbrowser#browser-quirks-1 + pending("Browser platform doesn't support loaderror event"); } iabInstance = cordova.InAppBrowser.open(badUrl, '_blank', platformOpts); iabInstance.addEventListener('loaderror', function (evt) { @@ -157,7 +155,7 @@ exports.defineAutoTests = function () { it('inappbrowser.spec.7 should support message event', function (done) { if (!isAndroid && !isIos) { - return pending(cordova.platformId + ' platform doesn\'t support message event'); + return pending(cordova.platformId + " platform doesn't support message event"); } var messageKey = 'my_message'; var messageValue = 'is_this'; @@ -172,13 +170,17 @@ exports.defineAutoTests = function () { done(); }); iabInstance.addEventListener('loadstop', function (evt) { - var code = '(function(){\n' + - ' var message = {' + messageKey + ': "' + messageValue + '"};\n' + + var code = + '(function(){\n' + + ' var message = {' + + messageKey + + ': "' + + messageValue + + '"};\n' + ' webkit.messageHandlers.cordova_iab.postMessage(JSON.stringify(message));\n' + '})()'; iabInstance.executeScript({ code: code }); }); - }); }); }; @@ -186,7 +188,6 @@ exports.defineAutoTests = function () { }; exports.defineManualTests = function (contentEl, createActionButton) { - var platformOpts = ''; var platform_info = ''; @@ -200,10 +201,10 @@ exports.defineManualTests = function (contentEl, createActionButton) { var wasReset = false; function reset () { counts = { - 'loaderror': 0, - 'loadstart': 0, - 'loadstop': 0, - 'exit': 0 + loaderror: 0, + loadstart: 0, + loadstop: 0, + exit: 0 }; lastLoadStartURL = ''; } @@ -243,15 +244,20 @@ exports.defineManualTests = function (contentEl, createActionButton) { // Verify the right number of loadstart events were fired. if (e.type === 'loadstop' || e.type === 'loaderror') { if (e.url !== lastLoadStartURL) { - alert('Unexpected: ' + e.type + ' event.url != loadstart\'s event.url'); // eslint-disable-line no-undef + alert('Unexpected: ' + e.type + " event.url != loadstart's event.url"); // eslint-disable-line no-undef } if (numExpectedRedirects === 0 && counts.loadstart !== 1) { // Do allow a loaderror without a loadstart (e.g. in the case of an invalid URL). if (!(e.type === 'loaderror' && counts.loadstart === 0)) { alert('Unexpected: got multiple loadstart events. (' + counts.loadstart + ')'); // eslint-disable-line no-undef } - } else if (numExpectedRedirects > 0 && counts.loadstart < (numExpectedRedirects + 1)) { - alert('Unexpected: should have got at least ' + (numExpectedRedirects + 1) + ' loadstart events, but got ' + counts.loadstart); // eslint-disable-line no-undef + } else if (numExpectedRedirects > 0 && counts.loadstart < numExpectedRedirects + 1) { + alert( + 'Unexpected: should have got at least ' + + (numExpectedRedirects + 1) + + ' loadstart events, but got ' + + counts.loadstart + ); // eslint-disable-line no-undef } wasReset = true; numExpectedRedirects = 0; @@ -273,7 +279,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { function doHookOpen (url, target, params, numExpectedRedirects) { var originalFunc = window.open; - var wasClobbered = window.hasOwnProperty('open'); + var wasClobbered = Object.prototype.hasOwnProperty.call(window, 'open'); window.open = cordova.InAppBrowser.open; try { @@ -295,7 +301,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { alert('Results verified'); // eslint-disable-line no-undef } else { console.log(results); - alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef + alert('Got: ' + typeof results + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef } }; if (cssUrl) { @@ -304,8 +310,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { }); } else { iab.addEventListener('loadstop', function (event) { - iab.insertCSS({ code: '#style-update-literal { \ndisplay: block !important; \n}' }, - useCallback && callback); + iab.insertCSS({ code: '#style-update-literal { \ndisplay: block !important; \n}' }, useCallback && callback); }); } } @@ -314,37 +319,48 @@ exports.defineManualTests = function (contentEl, createActionButton) { var iab = doOpen(url, '_blank', 'location=yes'); if (jsUrl) { iab.addEventListener('loadstop', function (event) { - iab.executeScript({ file: jsUrl }, useCallback && function (results) { - if (results && results.length === 0) { - alert('Results verified'); // eslint-disable-line no-undef - } else { - console.log(results); - alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef - } - }); + iab.executeScript( + { file: jsUrl }, + useCallback && + function (results) { + if (results && results.length === 0) { + alert('Results verified'); // eslint-disable-line no-undef + } else { + console.log(results); + alert('Got: ' + typeof results + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef + } + } + ); }); } else { iab.addEventListener('loadstop', function (event) { - var code = '(function(){\n' + - ' var header = document.getElementById("header");\n' + - ' header.innerHTML = "Script literal successfully injected";\n' + - ' return "abc";\n' + - '})()'; - iab.executeScript({ code: code }, useCallback && function (results) { - if (results && results.length === 1 && results[0] === 'abc') { - alert('Results verified'); // eslint-disable-line no-undef - } else { - console.log(results); - alert('Got: ' + typeof (results) + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef - } - }); + var code = + '(function(){\n' + + ' var header = document.getElementById("header");\n' + + ' header.innerHTML = "Script literal successfully injected";\n' + + ' return "abc";\n' + + '})()'; + iab.executeScript( + { code: code }, + useCallback && + function (results) { + if (results && results.length === 1 && results[0] === 'abc') { + alert('Results verified'); // eslint-disable-line no-undef + } else { + console.log(results); + alert('Got: ' + typeof results + '\n' + JSON.stringify(results)); // eslint-disable-line no-undef + } + } + ); }); } } var hiddenwnd = null; - var loadlistener = function (event) { alert('background window loaded '); }; // eslint-disable-line no-undef + var loadlistener = function (event) { + alert('background window loaded '); + }; // eslint-disable-line no-undef function openHidden (url, startHidden) { - var shopt = (startHidden) ? 'hidden=yes' : ''; + var shopt = startHidden ? 'hidden=yes' : ''; if (platformOpts) { shopt += (shopt ? ',' : '') + platformOpts; } @@ -368,7 +384,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { } } - var info_div = '

InAppBrowser

' + + var info_div = + '

InAppBrowser

' + '
' + 'Make sure http://cordova.apache.org and http://google.co.uk and https://www.google.co.uk are white listed.
' + 'Make sure http://www.apple.com is not in the white list.
' + @@ -376,7 +393,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

User-Agent: ' + '

'; - var local_tests = '

Local URL

' + + var local_tests = + '

Local URL

' + '
' + 'Expected result: opens successfully in CordovaWebView.' + '

' + @@ -396,7 +414,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: open successfully in InAppBrowser with no locationBar. On iOS the toolbar is at the top.'; - var white_listed_tests = '

White Listed URL

' + + var white_listed_tests = + '

White Listed URL

' + '
' + 'Expected result: open successfully in CordovaWebView to cordova.apache.org' + '

' + @@ -412,7 +431,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: open successfully in InAppBrowser to cordova.apache.org with no location bar.'; - var non_white_listed_tests = '

Non White Listed URL

' + + var non_white_listed_tests = + '

Non White Listed URL

' + '
' + 'Expected result: open successfully in InAppBrowser to apple.com.' + '

' + @@ -428,19 +448,22 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: open successfully in InAppBrowser to apple.com without locationBar.'; - var page_with_redirects_tests = '

Page with redirect

' + + var page_with_redirects_tests = + '

Page with redirect

' + '
' + 'Expected result: should 301 and open successfully in InAppBrowser to https://www.google.co.uk.' + '

' + 'Expected result: should 302 and open successfully in InAppBrowser to www.zhihu.com/answer/16714076.'; - var pdf_url_tests = '

PDF URL

' + + var pdf_url_tests = + '

PDF URL

' + '
' + 'Expected result: InAppBrowser opens. PDF should render on iOS.' + '

' + 'Expected result: InAppBrowser opens. PDF should render on iOS.'; - var invalid_url_tests = '

Invalid URL

' + + var invalid_url_tests = + '

Invalid URL

' + '
' + 'Expected result: fail to load in InAppBrowser.' + '

' + @@ -448,7 +471,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: fail to load in InAppBrowser (404).'; - var css_js_injection_tests = '

CSS / JS Injection

' + + var css_js_injection_tests = + '

CSS / JS Injection

' + '
' + 'Expected result: open successfully in InAppBrowser without text "Style updated from..."' + '

' + @@ -468,7 +492,8 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: open successfully in InAppBrowser with the text "Script literal successfully injected" and alert dialog with the text "Results verified".'; - var open_hidden_tests = '

Open Hidden

' + + var open_hidden_tests = + '

Open Hidden

' + '
' + 'Expected result: no additional browser window. Alert appears with the text "background window loaded".' + '

' + @@ -480,13 +505,15 @@ exports.defineManualTests = function (contentEl, createActionButton) { '

' + 'Expected result: open successfully in InAppBrowser to https://www.google.co.uk. Hide after 2 seconds'; - var clearing_cache_tests = '

Clearing Cache

' + + var clearing_cache_tests = + '

Clearing Cache

' + '
' + 'Expected result: ?' + '

' + 'Expected result: ?'; - var video_tag_tests = '

Video tag

' + + var video_tag_tests = + '

Video tag

' + '
' + 'Expected result: open successfully in InAppBrowser with an embedded video plays automatically on iOS and Android.' + '
' + @@ -494,13 +521,15 @@ exports.defineManualTests = function (contentEl, createActionButton) { '
' + 'Expected result: open successfully in InAppBrowser with an embedded video does not play automatically on iOS and Android but rather works after clicking the "play" button.'; - var local_with_anchor_tag_tests = '

Local with anchor tag

' + + var local_with_anchor_tag_tests = + '

Local with anchor tag

' + '
' + 'Expected result: open successfully in InAppBrowser to the local page, scrolled to the top as normal.' + '

' + 'Expected result: open successfully in InAppBrowser to the local page, scrolled to the beginning of the tall div with border.'; - var hardwareback_tests = '

HardwareBack

' + + var hardwareback_tests = + '

HardwareBack

' + '

' + 'Expected result: By default hardwareback is yes so pressing back button should navigate backwards in history then close InAppBrowser' + '

' + @@ -514,12 +543,38 @@ exports.defineManualTests = function (contentEl, createActionButton) { // see http://msdn.microsoft.com/en-us/library/windows/apps/hh465380.aspx#differences for details if (window.MSApp && window.MSApp.execUnsafeLocalFunction) { MSApp.execUnsafeLocalFunction(function () { - contentEl.innerHTML = info_div + platform_info + 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; + contentEl.innerHTML = + info_div + + platform_info + + 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; }); } else { - contentEl.innerHTML = info_div + platform_info + 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; + contentEl.innerHTML = + info_div + + platform_info + + 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; } document.getElementById('user-agent').textContent = navigator.userAgent; @@ -534,206 +589,430 @@ exports.defineManualTests = function (contentEl, createActionButton) { var videohtml = basePath + 'video.html'; // Local - createActionButton('target=Default', function () { - doOpen(localhtml); - }, 'openLocal'); - createActionButton('target=Default (window.open)', function () { - doHookOpen(localhtml); - }, 'openLocalHook'); - createActionButton('target=_self', function () { - doOpen(localhtml, '_self'); - }, 'openLocalSelf'); - createActionButton('target=_system', function () { - doOpen(localhtml, '_system'); - }, 'openLocalSystem'); - createActionButton('target=_blank', function () { - doOpen(localhtml, '_blank'); - }, 'openLocalBlank'); - createActionButton('target=Random, location=no, disallowoverscroll=yes', function () { - doOpen(localhtml, 'random_string', 'location=no, disallowoverscroll=yes'); - }, 'openLocalRandomNoLocation'); - createActionButton('target=Random, toolbarposition=bottom', function () { - doOpen(localhtml, 'random_string', 'toolbarposition=bottom'); - }, 'openLocalRandomToolBarBottom'); - createActionButton('target=Random, toolbarposition=top', function () { - doOpen(localhtml, 'random_string', 'toolbarposition=top'); - }, 'openLocalRandomToolBarTop'); - createActionButton('target=Random, toolbarposition=top, location=no', function () { - doOpen(localhtml, 'random_string', 'toolbarposition=top,location=no'); - }, 'openLocalRandomToolBarTopNoLocation'); + createActionButton( + 'target=Default', + function () { + doOpen(localhtml); + }, + 'openLocal' + ); + createActionButton( + 'target=Default (window.open)', + function () { + doHookOpen(localhtml); + }, + 'openLocalHook' + ); + createActionButton( + 'target=_self', + function () { + doOpen(localhtml, '_self'); + }, + 'openLocalSelf' + ); + createActionButton( + 'target=_system', + function () { + doOpen(localhtml, '_system'); + }, + 'openLocalSystem' + ); + createActionButton( + 'target=_blank', + function () { + doOpen(localhtml, '_blank'); + }, + 'openLocalBlank' + ); + createActionButton( + 'target=Random, location=no, disallowoverscroll=yes', + function () { + doOpen(localhtml, 'random_string', 'location=no, disallowoverscroll=yes'); + }, + 'openLocalRandomNoLocation' + ); + createActionButton( + 'target=Random, toolbarposition=bottom', + function () { + doOpen(localhtml, 'random_string', 'toolbarposition=bottom'); + }, + 'openLocalRandomToolBarBottom' + ); + createActionButton( + 'target=Random, toolbarposition=top', + function () { + doOpen(localhtml, 'random_string', 'toolbarposition=top'); + }, + 'openLocalRandomToolBarTop' + ); + createActionButton( + 'target=Random, toolbarposition=top, location=no', + function () { + doOpen(localhtml, 'random_string', 'toolbarposition=top,location=no'); + }, + 'openLocalRandomToolBarTopNoLocation' + ); // White Listed - createActionButton('* target=Default', function () { - doOpen('http://cordova.apache.org'); - }, 'openWhiteListed'); - createActionButton('* target=Default (window.open)', function () { - doHookOpen('http://cordova.apache.org'); - }, 'openWhiteListedHook'); - createActionButton('* target=_self', function () { - doOpen('http://cordova.apache.org', '_self'); - }, 'openWhiteListedSelf'); - createActionButton('target=_system', function () { - doOpen('http://cordova.apache.org', '_system'); - }, 'openWhiteListedSystem'); - createActionButton('target=_blank', function () { - doOpen('http://cordova.apache.org', '_blank'); - }, 'openWhiteListedBlank'); - createActionButton('target=Random', function () { - doOpen('http://cordova.apache.org', 'random_string'); - }, 'openWhiteListedRandom'); - createActionButton('* target=Random, no location bar', function () { - doOpen('http://cordova.apache.org', 'random_string', 'location=no'); - }, 'openWhiteListedRandomNoLocation'); + createActionButton( + '* target=Default', + function () { + doOpen('http://cordova.apache.org'); + }, + 'openWhiteListed' + ); + createActionButton( + '* target=Default (window.open)', + function () { + doHookOpen('http://cordova.apache.org'); + }, + 'openWhiteListedHook' + ); + createActionButton( + '* target=_self', + function () { + doOpen('http://cordova.apache.org', '_self'); + }, + 'openWhiteListedSelf' + ); + createActionButton( + 'target=_system', + function () { + doOpen('http://cordova.apache.org', '_system'); + }, + 'openWhiteListedSystem' + ); + createActionButton( + 'target=_blank', + function () { + doOpen('http://cordova.apache.org', '_blank'); + }, + 'openWhiteListedBlank' + ); + createActionButton( + 'target=Random', + function () { + doOpen('http://cordova.apache.org', 'random_string'); + }, + 'openWhiteListedRandom' + ); + createActionButton( + '* target=Random, no location bar', + function () { + doOpen('http://cordova.apache.org', 'random_string', 'location=no'); + }, + 'openWhiteListedRandomNoLocation' + ); // Non White Listed - createActionButton('target=Default', function () { - doOpen('http://www.apple.com'); - }, 'openNonWhiteListed'); - createActionButton('target=Default (window.open)', function () { - doHookOpen('http://www.apple.com'); - }, 'openNonWhiteListedHook'); - createActionButton('target=_self', function () { - doOpen('http://www.apple.com', '_self'); - }, 'openNonWhiteListedSelf'); - createActionButton('target=_system', function () { - doOpen('http://www.apple.com', '_system'); - }, 'openNonWhiteListedSystem'); - createActionButton('target=_blank', function () { - doOpen('http://www.apple.com', '_blank'); - }, 'openNonWhiteListedBlank'); - createActionButton('target=Random', function () { - doOpen('http://www.apple.com', 'random_string'); - }, 'openNonWhiteListedRandom'); - createActionButton('* target=Random, no location bar', function () { - doOpen('http://www.apple.com', 'random_string', 'location=no'); - }, 'openNonWhiteListedRandomNoLocation'); + createActionButton( + 'target=Default', + function () { + doOpen('http://www.apple.com'); + }, + 'openNonWhiteListed' + ); + createActionButton( + 'target=Default (window.open)', + function () { + doHookOpen('http://www.apple.com'); + }, + 'openNonWhiteListedHook' + ); + createActionButton( + 'target=_self', + function () { + doOpen('http://www.apple.com', '_self'); + }, + 'openNonWhiteListedSelf' + ); + createActionButton( + 'target=_system', + function () { + doOpen('http://www.apple.com', '_system'); + }, + 'openNonWhiteListedSystem' + ); + createActionButton( + 'target=_blank', + function () { + doOpen('http://www.apple.com', '_blank'); + }, + 'openNonWhiteListedBlank' + ); + createActionButton( + 'target=Random', + function () { + doOpen('http://www.apple.com', 'random_string'); + }, + 'openNonWhiteListedRandom' + ); + createActionButton( + '* target=Random, no location bar', + function () { + doOpen('http://www.apple.com', 'random_string', 'location=no'); + }, + 'openNonWhiteListedRandomNoLocation' + ); // Page with redirect - createActionButton('http://google.co.uk', function () { - doOpen('http://google.co.uk', 'random_string', '', 1); - }, 'openRedirect301'); - createActionButton('http://goo.gl/pUFqg', function () { - doOpen('http://goo.gl/pUFqg', 'random_string', '', 2); - }, 'openRedirect302'); + createActionButton( + 'http://google.co.uk', + function () { + doOpen('http://google.co.uk', 'random_string', '', 1); + }, + 'openRedirect301' + ); + createActionButton( + 'http://goo.gl/pUFqg', + function () { + doOpen('http://goo.gl/pUFqg', 'random_string', '', 2); + }, + 'openRedirect302' + ); // PDF URL - createActionButton('Remote URL', function () { - doOpen('http://www.stluciadance.com/prospectus_file/sample.pdf'); - }, 'openPDF'); - createActionButton('Local URL', function () { - doOpen(localpdf, '_blank'); - }, 'openPDFBlank'); + createActionButton( + 'Remote URL', + function () { + doOpen('http://www.stluciadance.com/prospectus_file/sample.pdf'); + }, + 'openPDF' + ); + createActionButton( + 'Local URL', + function () { + doOpen(localpdf, '_blank'); + }, + 'openPDFBlank' + ); // Invalid URL - createActionButton('Invalid Scheme', function () { - doOpen('x-ttp://www.invalid.com/', '_blank'); - }, 'openInvalidScheme'); - createActionButton('Invalid Host', function () { - doOpen('http://www.inv;alid.com/', '_blank'); - }, 'openInvalidHost'); - createActionButton('Missing Local File', function () { - doOpen('nonexistent.html', '_blank'); - }, 'openInvalidMissing'); + createActionButton( + 'Invalid Scheme', + function () { + doOpen('x-ttp://www.invalid.com/', '_blank'); + }, + 'openInvalidScheme' + ); + createActionButton( + 'Invalid Host', + function () { + doOpen('http://www.inv;alid.com/', '_blank'); + }, + 'openInvalidHost' + ); + createActionButton( + 'Missing Local File', + function () { + doOpen('nonexistent.html', '_blank'); + }, + 'openInvalidMissing' + ); // CSS / JS injection - createActionButton('Original Document', function () { - doOpen(injecthtml, '_blank'); - }, 'openOriginalDocument'); - createActionButton('CSS File Injection', function () { - openWithStyle(injecthtml, injectcss); - }, 'openCSSInjection'); - createActionButton('CSS File Injection (callback)', function () { - openWithStyle(injecthtml, injectcss, true); - }, 'openCSSInjectionCallback'); - createActionButton('CSS Literal Injection', function () { - openWithStyle(injecthtml); - }, 'openCSSLiteralInjection'); - createActionButton('CSS Literal Injection (callback)', function () { - openWithStyle(injecthtml, null, true); - }, 'openCSSLiteralInjectionCallback'); - createActionButton('Script File Injection', function () { - openWithScript(injecthtml, injectjs); - }, 'openScriptInjection'); - createActionButton('Script File Injection (callback)', function () { - openWithScript(injecthtml, injectjs, true); - }, 'openScriptInjectionCallback'); - createActionButton('Script Literal Injection', function () { - openWithScript(injecthtml); - }, 'openScriptLiteralInjection'); - createActionButton('Script Literal Injection (callback)', function () { - openWithScript(injecthtml, null, true); - }, 'openScriptLiteralInjectionCallback'); + createActionButton( + 'Original Document', + function () { + doOpen(injecthtml, '_blank'); + }, + 'openOriginalDocument' + ); + createActionButton( + 'CSS File Injection', + function () { + openWithStyle(injecthtml, injectcss); + }, + 'openCSSInjection' + ); + createActionButton( + 'CSS File Injection (callback)', + function () { + openWithStyle(injecthtml, injectcss, true); + }, + 'openCSSInjectionCallback' + ); + createActionButton( + 'CSS Literal Injection', + function () { + openWithStyle(injecthtml); + }, + 'openCSSLiteralInjection' + ); + createActionButton( + 'CSS Literal Injection (callback)', + function () { + openWithStyle(injecthtml, null, true); + }, + 'openCSSLiteralInjectionCallback' + ); + createActionButton( + 'Script File Injection', + function () { + openWithScript(injecthtml, injectjs); + }, + 'openScriptInjection' + ); + createActionButton( + 'Script File Injection (callback)', + function () { + openWithScript(injecthtml, injectjs, true); + }, + 'openScriptInjectionCallback' + ); + createActionButton( + 'Script Literal Injection', + function () { + openWithScript(injecthtml); + }, + 'openScriptLiteralInjection' + ); + createActionButton( + 'Script Literal Injection (callback)', + function () { + openWithScript(injecthtml, null, true); + }, + 'openScriptLiteralInjectionCallback' + ); // Open hidden - createActionButton('Create Hidden', function () { - openHidden('https://www.google.co.uk', true); - }, 'openHidden'); - createActionButton('Show Hidden', function () { - showHidden(); - }, 'showHidden'); - createActionButton('Close Hidden', function () { - closeHidden(); - }, 'closeHidden'); - createActionButton('google.co.uk Not Hidden', function () { - openHidden('https://www.google.co.uk', false); - }, 'openHiddenShow'); - createActionButton('google.co.uk shown for 2 seconds than hidden', function () { - var iab = doOpen('https://www.google.co.uk/', 'random_sting'); - setTimeout(function () { - iab.hide(); - }, 2000); - }, 'openVisibleAndHide'); + createActionButton( + 'Create Hidden', + function () { + openHidden('https://www.google.co.uk', true); + }, + 'openHidden' + ); + createActionButton( + 'Show Hidden', + function () { + showHidden(); + }, + 'showHidden' + ); + createActionButton( + 'Close Hidden', + function () { + closeHidden(); + }, + 'closeHidden' + ); + createActionButton( + 'google.co.uk Not Hidden', + function () { + openHidden('https://www.google.co.uk', false); + }, + 'openHiddenShow' + ); + createActionButton( + 'google.co.uk shown for 2 seconds than hidden', + function () { + var iab = doOpen('https://www.google.co.uk/', 'random_sting'); + setTimeout(function () { + iab.hide(); + }, 2000); + }, + 'openVisibleAndHide' + ); // Clearing cache - createActionButton('Clear Browser Cache', function () { - doOpen('https://www.google.co.uk', '_blank', 'clearcache=yes'); - }, 'openClearCache'); - createActionButton('Clear Session Cache', function () { - doOpen('https://www.google.co.uk', '_blank', 'clearsessioncache=yes'); - }, 'openClearSessionCache'); + createActionButton( + 'Clear Browser Cache', + function () { + doOpen('https://www.google.co.uk', '_blank', 'clearcache=yes'); + }, + 'openClearCache' + ); + createActionButton( + 'Clear Session Cache', + function () { + doOpen('https://www.google.co.uk', '_blank', 'clearsessioncache=yes'); + }, + 'openClearSessionCache' + ); // Video tag - createActionButton('Remote Video', function () { - doOpen(videohtml, '_blank'); - }, 'openRemoteVideo'); - createActionButton('Remote Need User No Video', function () { - doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=no'); - }, 'openRemoteNeedUserNoVideo'); - createActionButton('Remote Need User Yes Video', function () { - doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=yes'); - }, 'openRemoteNeedUserYesVideo'); + createActionButton( + 'Remote Video', + function () { + doOpen(videohtml, '_blank'); + }, + 'openRemoteVideo' + ); + createActionButton( + 'Remote Need User No Video', + function () { + doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=no'); + }, + 'openRemoteNeedUserNoVideo' + ); + createActionButton( + 'Remote Need User Yes Video', + function () { + doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=yes'); + }, + 'openRemoteNeedUserYesVideo' + ); // Local With Anchor Tag - createActionButton('Anchor1', function () { - doOpen(localhtml + '#bogusanchor', '_blank'); - }, 'openAnchor1'); - createActionButton('Anchor2', function () { - doOpen(localhtml + '#anchor2', '_blank'); - }, 'openAnchor2'); + createActionButton( + 'Anchor1', + function () { + doOpen(localhtml + '#bogusanchor', '_blank'); + }, + 'openAnchor1' + ); + createActionButton( + 'Anchor2', + function () { + doOpen(localhtml + '#anchor2', '_blank'); + }, + 'openAnchor2' + ); // Hardwareback - createActionButton('no hardwareback (defaults to yes)', function () { - doOpen('http://cordova.apache.org', '_blank'); - }, 'openHardwareBackDefault'); - createActionButton('hardwareback=yes', function () { - doOpen('http://cordova.apache.org', '_blank', 'hardwareback=yes'); - }, 'openHardwareBackYes'); - createActionButton('hardwareback=no', function () { - doOpen('http://cordova.apache.org', '_blank', 'hardwareback=no'); - }, 'openHardwareBackNo'); - createActionButton('no hardwareback -> hardwareback=no -> no hardwareback', function () { - var ref = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : '')); - ref.addEventListener('loadstop', function () { - ref.close(); - }); - ref.addEventListener('exit', function () { - var ref2 = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes,hardwareback=no' + (platformOpts ? ',' + platformOpts : '')); - ref2.addEventListener('loadstop', function () { - ref2.close(); + createActionButton( + 'no hardwareback (defaults to yes)', + function () { + doOpen('http://cordova.apache.org', '_blank'); + }, + 'openHardwareBackDefault' + ); + createActionButton( + 'hardwareback=yes', + function () { + doOpen('http://cordova.apache.org', '_blank', 'hardwareback=yes'); + }, + 'openHardwareBackYes' + ); + createActionButton( + 'hardwareback=no', + function () { + doOpen('http://cordova.apache.org', '_blank', 'hardwareback=no'); + }, + 'openHardwareBackNo' + ); + createActionButton( + 'no hardwareback -> hardwareback=no -> no hardwareback', + function () { + var ref = cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : '')); + ref.addEventListener('loadstop', function () { + ref.close(); }); - ref2.addEventListener('exit', function () { - cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : '')); + ref.addEventListener('exit', function () { + var ref2 = cordova.InAppBrowser.open( + 'https://google.com', + '_blank', + 'location=yes,hardwareback=no' + (platformOpts ? ',' + platformOpts : '') + ); + ref2.addEventListener('loadstop', function () { + ref2.close(); + }); + ref2.addEventListener('exit', function () { + cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : '')); + }); }); - }); - }, 'openHardwareBackDefaultAfterNo'); + }, + 'openHardwareBackDefaultAfterNo' + ); }; diff --git a/www/inappbrowser.js b/www/inappbrowser.js index f93626cbc..3dcab215f 100644 --- a/www/inappbrowser.js +++ b/www/inappbrowser.js @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. * -*/ + */ (function () { var exec = require('cordova/exec'); @@ -27,19 +27,19 @@ function InAppBrowser () { this.channels = { - 'beforeload': channel.create('beforeload'), - 'loadstart': channel.create('loadstart'), - 'loadstop': channel.create('loadstop'), - 'loaderror': channel.create('loaderror'), - 'exit': channel.create('exit'), - 'customscheme': channel.create('customscheme'), - 'message': channel.create('message') + beforeload: channel.create('beforeload'), + loadstart: channel.create('loadstart'), + loadstop: channel.create('loadstop'), + loaderror: channel.create('loaderror'), + exit: channel.create('exit'), + customscheme: channel.create('customscheme'), + message: channel.create('message') }; } InAppBrowser.prototype = { _eventHandler: function (event) { - if (event && (event.type in this.channels)) { + if (event && event.type in this.channels) { if (event.type === 'beforeload') { this.channels[event.type].fire(event, this._loadAfterBeforeload); } else {