1019 lines
38 KiB
JavaScript
1019 lines
38 KiB
JavaScript
/*
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
/* global MSApp */
|
|
|
|
var cordova = require('cordova');
|
|
var isWindows = cordova.platformId === 'windows';
|
|
var isIos = cordova.platformId === 'ios';
|
|
var isAndroid = cordova.platformId === 'android';
|
|
var isBrowser = cordova.platformId === 'browser';
|
|
|
|
window.alert = window.alert || navigator.notification.alert;
|
|
if (isWindows && navigator && navigator.notification && navigator.notification.alert) {
|
|
// window.alert is defined but not functional on UWP
|
|
window.alert = navigator.notification.alert;
|
|
}
|
|
|
|
exports.defineAutoTests = function () {
|
|
var createTests = function (platformOpts) {
|
|
platformOpts = platformOpts || '';
|
|
|
|
describe('cordova.InAppBrowser', function () {
|
|
it('inappbrowser.spec.1 should exist', function () {
|
|
expect(cordova.InAppBrowser).toBeDefined();
|
|
});
|
|
|
|
it('inappbrowser.spec.2 should contain open function', function () {
|
|
expect(cordova.InAppBrowser.open).toBeDefined();
|
|
expect(cordova.InAppBrowser.open).toEqual(jasmine.any(Function));
|
|
});
|
|
});
|
|
|
|
describe('open method', function () {
|
|
if (cordova.platformId === 'osx') {
|
|
pending('Open method not fully supported on OSX.');
|
|
return;
|
|
}
|
|
|
|
var iabInstance;
|
|
var originalTimeout;
|
|
var url = 'https://dist.apache.org/repos/dist/dev/cordova/';
|
|
var badUrl = 'http://bad-uri/';
|
|
|
|
beforeEach(function () {
|
|
// increase timeout to ensure test url could be loaded within test time
|
|
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
|
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
|
|
|
iabInstance = null;
|
|
});
|
|
|
|
afterEach(function (done) {
|
|
// restore original timeout
|
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
|
|
|
|
if (iabInstance !== null && iabInstance.close) {
|
|
iabInstance.close();
|
|
}
|
|
iabInstance = null;
|
|
// add some extra time so that iab dialog is closed
|
|
setTimeout(done, 2000);
|
|
});
|
|
|
|
function verifyEvent (evt, type) {
|
|
expect(evt).toBeDefined();
|
|
expect(evt.type).toEqual(type);
|
|
// `exit` event does not have url field, browser returns null url for CORS requests
|
|
if (type !== 'exit' && !isBrowser) {
|
|
expect(evt.url).toEqual(url);
|
|
}
|
|
}
|
|
|
|
function verifyLoadErrorEvent (evt) {
|
|
expect(evt).toBeDefined();
|
|
expect(evt.type).toEqual('loaderror');
|
|
expect(evt.url).toEqual(badUrl);
|
|
expect(evt.code).toEqual(jasmine.any(Number));
|
|
expect(evt.message).toEqual(jasmine.any(String));
|
|
}
|
|
|
|
it('inappbrowser.spec.3 should return InAppBrowser instance with required methods', function () {
|
|
iabInstance = cordova.InAppBrowser.open(url, '_blank', platformOpts);
|
|
|
|
expect(iabInstance).toBeDefined();
|
|
|
|
expect(iabInstance.addEventListener).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.removeEventListener).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.close).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.show).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.hide).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.executeScript).toEqual(jasmine.any(Function));
|
|
expect(iabInstance.insertCSS).toEqual(jasmine.any(Function));
|
|
});
|
|
|
|
it('inappbrowser.spec.4 should support loadstart and loadstop events', function (done) {
|
|
var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) {
|
|
verifyEvent(evt, 'loadstart');
|
|
});
|
|
|
|
iabInstance = cordova.InAppBrowser.open(url, '_blank', platformOpts);
|
|
iabInstance.addEventListener('loadstart', onLoadStart);
|
|
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
|
|
expect(onLoadStart).toHaveBeenCalled();
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('inappbrowser.spec.5 should support exit event', function (done) {
|
|
iabInstance = cordova.InAppBrowser.open(url, '_blank', platformOpts);
|
|
iabInstance.addEventListener('exit', function (evt) {
|
|
verifyEvent(evt, 'exit');
|
|
done();
|
|
});
|
|
iabInstance.addEventListener('loadstop', function (evt) {
|
|
iabInstance.close();
|
|
iabInstance = null;
|
|
});
|
|
});
|
|
|
|
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");
|
|
}
|
|
iabInstance = cordova.InAppBrowser.open(badUrl, '_blank', platformOpts);
|
|
iabInstance.addEventListener('loaderror', function (evt) {
|
|
verifyLoadErrorEvent(evt);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('inappbrowser.spec.7 should support message event', function (done) {
|
|
if (!isAndroid && !isIos) {
|
|
return pending(cordova.platformId + " platform doesn't support message event");
|
|
}
|
|
var messageKey = 'my_message';
|
|
var messageValue = 'is_this';
|
|
iabInstance = cordova.InAppBrowser.open(url, '_blank', platformOpts);
|
|
iabInstance.addEventListener('message', function (evt) {
|
|
// Verify message event
|
|
expect(evt).toBeDefined();
|
|
expect(evt.type).toEqual('message');
|
|
expect(evt.data).toBeDefined();
|
|
expect(evt.data[messageKey]).toBeDefined();
|
|
expect(evt.data[messageKey]).toEqual(messageValue);
|
|
done();
|
|
});
|
|
iabInstance.addEventListener('loadstop', function (evt) {
|
|
var code =
|
|
'(function(){\n' +
|
|
' var message = {' +
|
|
messageKey +
|
|
': "' +
|
|
messageValue +
|
|
'"};\n' +
|
|
' webkit.messageHandlers.cordova_iab.postMessage(JSON.stringify(message));\n' +
|
|
'})()';
|
|
iabInstance.executeScript({ code: code });
|
|
});
|
|
});
|
|
});
|
|
};
|
|
createTests();
|
|
};
|
|
|
|
exports.defineManualTests = function (contentEl, createActionButton) {
|
|
var platformOpts = '';
|
|
var platform_info = '';
|
|
|
|
function doOpen (url, target, params, numExpectedRedirects, useWindowOpen) {
|
|
numExpectedRedirects = numExpectedRedirects || 0;
|
|
useWindowOpen = useWindowOpen || false;
|
|
console.log('Opening ' + url);
|
|
|
|
var counts;
|
|
var lastLoadStartURL;
|
|
var wasReset = false;
|
|
function reset () {
|
|
counts = {
|
|
loaderror: 0,
|
|
loadstart: 0,
|
|
loadstop: 0,
|
|
exit: 0
|
|
};
|
|
lastLoadStartURL = '';
|
|
}
|
|
reset();
|
|
|
|
var iab;
|
|
var callbacks = {
|
|
loaderror: logEvent,
|
|
loadstart: logEvent,
|
|
loadstop: logEvent,
|
|
exit: logEvent
|
|
};
|
|
if (useWindowOpen) {
|
|
console.log('Use window.open() for url');
|
|
iab = window.open(url, target, params, callbacks);
|
|
} else {
|
|
if (platformOpts) {
|
|
params += (params ? ',' : '') + platformOpts;
|
|
}
|
|
iab = cordova.InAppBrowser.open(url, target, params, callbacks);
|
|
}
|
|
if (!iab) {
|
|
alert('open returned ' + iab); // eslint-disable-line no-undef
|
|
return;
|
|
}
|
|
|
|
function logEvent (e) {
|
|
console.log('IAB event=' + JSON.stringify(e));
|
|
counts[e.type]++;
|
|
// Verify that event.url gets updated on redirects.
|
|
if (e.type === 'loadstart') {
|
|
if (e.url === lastLoadStartURL) {
|
|
alert('Unexpected: loadstart fired multiple times for the same URL.'); // eslint-disable-line no-undef
|
|
}
|
|
lastLoadStartURL = e.url;
|
|
}
|
|
// 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
|
|
}
|
|
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
|
|
}
|
|
wasReset = true;
|
|
numExpectedRedirects = 0;
|
|
reset();
|
|
}
|
|
// Verify that loadend / loaderror was called.
|
|
if (e.type === 'exit') {
|
|
var numStopEvents = counts.loadstop + counts.loaderror;
|
|
if (numStopEvents === 0 && !wasReset) {
|
|
alert('Unexpected: browser closed without a loadstop or loaderror.'); // eslint-disable-line no-undef
|
|
} else if (numStopEvents > 1) {
|
|
alert('Unexpected: got multiple loadstop/loaderror events.'); // eslint-disable-line no-undef
|
|
}
|
|
}
|
|
}
|
|
|
|
return iab;
|
|
}
|
|
|
|
function doHookOpen (url, target, params, numExpectedRedirects) {
|
|
var originalFunc = window.open;
|
|
var wasClobbered = Object.prototype.hasOwnProperty.call(window, 'open');
|
|
window.open = cordova.InAppBrowser.open;
|
|
|
|
try {
|
|
doOpen(url, target, params, numExpectedRedirects, true);
|
|
} finally {
|
|
if (wasClobbered) {
|
|
window.open = originalFunc;
|
|
} else {
|
|
console.log('just delete, to restore open from prototype');
|
|
delete window.open;
|
|
}
|
|
}
|
|
}
|
|
|
|
function openWithStyle (url, cssUrl, useCallback) {
|
|
var iab = doOpen(url, '_blank', 'location=yes');
|
|
var callback = 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
|
|
}
|
|
};
|
|
if (cssUrl) {
|
|
iab.addEventListener('loadstop', function (event) {
|
|
iab.insertCSS({ file: cssUrl }, useCallback && callback);
|
|
});
|
|
} else {
|
|
iab.addEventListener('loadstop', function (event) {
|
|
iab.insertCSS({ code: '#style-update-literal { \ndisplay: block !important; \n}' }, useCallback && callback);
|
|
});
|
|
}
|
|
}
|
|
|
|
function openWithScript (url, jsUrl, useCallback) {
|
|
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
|
|
}
|
|
}
|
|
);
|
|
});
|
|
} 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 hiddenwnd = null;
|
|
var loadlistener = function (event) {
|
|
alert('background window loaded ');
|
|
}; // eslint-disable-line no-undef
|
|
function openHidden (url, startHidden) {
|
|
var shopt = startHidden ? 'hidden=yes' : '';
|
|
if (platformOpts) {
|
|
shopt += (shopt ? ',' : '') + platformOpts;
|
|
}
|
|
hiddenwnd = cordova.InAppBrowser.open(url, 'random_string', shopt);
|
|
if (!hiddenwnd) {
|
|
alert('cordova.InAppBrowser.open returned ' + hiddenwnd); // eslint-disable-line no-undef
|
|
return;
|
|
}
|
|
if (startHidden) hiddenwnd.addEventListener('loadstop', loadlistener);
|
|
}
|
|
function showHidden () {
|
|
if (hiddenwnd) {
|
|
hiddenwnd.show();
|
|
}
|
|
}
|
|
function closeHidden () {
|
|
if (hiddenwnd) {
|
|
hiddenwnd.removeEventListener('loadstop', loadlistener);
|
|
hiddenwnd.close();
|
|
hiddenwnd = null;
|
|
}
|
|
}
|
|
|
|
var info_div =
|
|
'<h1>InAppBrowser</h1>' +
|
|
'<div id="info">' +
|
|
'Make sure http://cordova.apache.org and http://google.co.uk and https://www.google.co.uk are white listed. </br>' +
|
|
'Make sure http://www.apple.com is not in the white list.</br>' +
|
|
'In iOS, starred <span style="vertical-align:super">*</span> tests will put the app in a state with no way to return. </br>' +
|
|
'<h4>User-Agent: <span id="user-agent"> </span></hr>' +
|
|
'</div>';
|
|
|
|
var local_tests =
|
|
'<h1>Local URL</h1>' +
|
|
'<div id="openLocal"></div>' +
|
|
'Expected result: opens successfully in CordovaWebView.' +
|
|
'<p/> <div id="openLocalHook"></div>' +
|
|
'Expected result: opens successfully in CordovaWebView (using hook of window.open()).' +
|
|
'<p/> <div id="openLocalSelf"></div>' +
|
|
'Expected result: opens successfully in CordovaWebView.' +
|
|
'<p/> <div id="openLocalSystem"></div>' +
|
|
'Expected result: fails to open' +
|
|
'<p/> <div id="openLocalBlank"></div>' +
|
|
'Expected result: opens successfully in InAppBrowser with locationBar at top.' +
|
|
'<p/> <div id="openLocalRandomNoLocation"></div>' +
|
|
'Expected result: opens successfully in InAppBrowser without locationBar.' +
|
|
'<p/> <div id="openLocalRandomToolBarBottom"></div>' +
|
|
'Expected result: opens successfully in InAppBrowser with locationBar. On iOS the toolbar is at the bottom.' +
|
|
'<p/> <div id="openLocalRandomToolBarTop"></div>' +
|
|
'Expected result: opens successfully in InAppBrowser with locationBar. On iOS the toolbar is at the top.' +
|
|
'<p/><div id="openLocalRandomToolBarTopNoLocation"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with no locationBar. On iOS the toolbar is at the top.';
|
|
|
|
var white_listed_tests =
|
|
'<h1>White Listed URL</h1>' +
|
|
'<div id="openWhiteListed"></div>' +
|
|
'Expected result: open successfully in CordovaWebView to cordova.apache.org' +
|
|
'<p/> <div id="openWhiteListedHook"></div>' +
|
|
'Expected result: open successfully in CordovaWebView to cordova.apache.org (using hook of window.open())' +
|
|
'<p/> <div id="openWhiteListedSelf"></div>' +
|
|
'Expected result: open successfully in CordovaWebView to cordova.apache.org' +
|
|
'<p/> <div id="openWhiteListedSystem"></div>' +
|
|
'Expected result: open successfully in system browser to cordova.apache.org' +
|
|
'<p/> <div id="openWhiteListedBlank"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to cordova.apache.org' +
|
|
'<p/> <div id="openWhiteListedRandom"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to cordova.apache.org' +
|
|
'<p/> <div id="openWhiteListedRandomNoLocation"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to cordova.apache.org with no location bar.';
|
|
|
|
var non_white_listed_tests =
|
|
'<h1>Non White Listed URL</h1>' +
|
|
'<div id="openNonWhiteListed"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com.' +
|
|
'<p/> <div id="openNonWhiteListedHook"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com (using hook of window.open()).' +
|
|
'<p/> <div id="openNonWhiteListedSelf"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com (_self enforces whitelist).' +
|
|
'<p/> <div id="openNonWhiteListedSystem"></div>' +
|
|
'Expected result: open successfully in system browser to apple.com.' +
|
|
'<p/> <div id="openNonWhiteListedBlank"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com.' +
|
|
'<p/> <div id="openNonWhiteListedRandom"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com.' +
|
|
'<p/> <div id="openNonWhiteListedRandomNoLocation"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to apple.com without locationBar.';
|
|
|
|
var page_with_redirects_tests =
|
|
'<h1>Page with redirect</h1>' +
|
|
'<div id="openRedirect301"></div>' +
|
|
'Expected result: should 301 and open successfully in InAppBrowser to https://www.google.co.uk.' +
|
|
'<p/> <div id="openRedirect302"></div>' +
|
|
'Expected result: should 302 and open successfully in InAppBrowser to www.zhihu.com/answer/16714076.';
|
|
|
|
var pdf_url_tests =
|
|
'<h1>PDF URL</h1>' +
|
|
'<div id="openPDF"></div>' +
|
|
'Expected result: InAppBrowser opens. PDF should render on iOS.' +
|
|
'<p/> <div id="openPDFBlank"></div>' +
|
|
'Expected result: InAppBrowser opens. PDF should render on iOS.';
|
|
|
|
var invalid_url_tests =
|
|
'<h1>Invalid URL</h1>' +
|
|
'<div id="openInvalidScheme"></div>' +
|
|
'Expected result: fail to load in InAppBrowser.' +
|
|
'<p/> <div id="openInvalidHost"></div>' +
|
|
'Expected result: fail to load in InAppBrowser.' +
|
|
'<p/> <div id="openInvalidMissing"></div>' +
|
|
'Expected result: fail to load in InAppBrowser (404).';
|
|
|
|
var css_js_injection_tests =
|
|
'<h1>CSS / JS Injection</h1>' +
|
|
'<div id="openOriginalDocument"></div>' +
|
|
'Expected result: open successfully in InAppBrowser without text "Style updated from..."' +
|
|
'<p/> <div id="openCSSInjection"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with "Style updated from file".' +
|
|
'<p/> <div id="openCSSInjectionCallback"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with "Style updated from file", and alert dialog with text "Results verified".' +
|
|
'<p/> <div id="openCSSLiteralInjection"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with "Style updated from literal".' +
|
|
'<p/> <div id="openCSSLiteralInjectionCallback"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with "Style updated from literal", and alert dialog with text "Results verified".' +
|
|
'<p/> <div id="openScriptInjection"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with text "Script file successfully injected".' +
|
|
'<p/> <div id="openScriptInjectionCallback"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with text "Script file successfully injected" and alert dialog with the text "Results verified".' +
|
|
'<p/> <div id="openScriptLiteralInjection"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with the text "Script literal successfully injected" .' +
|
|
'<p/> <div id="openScriptLiteralInjectionCallback"></div>' +
|
|
'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 =
|
|
'<h1>Open Hidden </h1>' +
|
|
'<div id="openHidden"></div>' +
|
|
'Expected result: no additional browser window. Alert appears with the text "background window loaded".' +
|
|
'<p/> <div id="showHidden"></div>' +
|
|
'Expected result: after first clicking on previous test "create hidden", open successfully in InAppBrowser to https://www.google.co.uk.' +
|
|
'<p/> <div id="closeHidden"></div>' +
|
|
'Expected result: no output. But click on "show hidden" again and nothing should be shown.' +
|
|
'<p/> <div id="openHiddenShow"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to https://www.google.co.uk' +
|
|
'<p/> <div id="openVisibleAndHide"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to https://www.google.co.uk. Hide after 2 seconds';
|
|
|
|
var clearing_cache_tests =
|
|
'<h1>Clearing Cache</h1>' +
|
|
'<div id="openClearCache"></div>' +
|
|
'Expected result: ?' +
|
|
'<p/> <div id="openClearSessionCache"></div>' +
|
|
'Expected result: ?';
|
|
|
|
var video_tag_tests =
|
|
'<h1>Video tag</h1>' +
|
|
'<div id="openRemoteVideo"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with an embedded video plays automatically on iOS and Android.' +
|
|
'<div id="openRemoteNeedUserNoVideo"></div>' +
|
|
'Expected result: open successfully in InAppBrowser with an embedded video plays automatically on iOS and Android.' +
|
|
'<div id="openRemoteNeedUserYesVideo"></div>' +
|
|
'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 =
|
|
'<h1>Local with anchor tag</h1>' +
|
|
'<div id="openAnchor1"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to the local page, scrolled to the top as normal.' +
|
|
'<p/> <div id="openAnchor2"></div>' +
|
|
'Expected result: open successfully in InAppBrowser to the local page, scrolled to the beginning of the tall div with border.';
|
|
|
|
var hardwareback_tests =
|
|
'<h1>HardwareBack</h1>' +
|
|
'<p/> <div id="openHardwareBackDefault"></div>' +
|
|
'Expected result: By default hardwareback is yes so pressing back button should navigate backwards in history then close InAppBrowser' +
|
|
'<p/> <div id="openHardwareBackYes"></div>' +
|
|
'Expected result: hardwareback=yes pressing back button should navigate backwards in history then close InAppBrowser' +
|
|
'<p/> <div id="openHardwareBackNo"></div>' +
|
|
'Expected result: hardwareback=no pressing back button should close InAppBrowser regardless history' +
|
|
'<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';
|
|
|
|
// 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
|
|
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;
|
|
});
|
|
} 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;
|
|
}
|
|
|
|
document.getElementById('user-agent').textContent = navigator.userAgent;
|
|
|
|
// we are already in cdvtests directory
|
|
var basePath = 'iab-resources/';
|
|
var localhtml = basePath + 'local.html';
|
|
var localpdf = basePath + 'local.pdf';
|
|
var injecthtml = basePath + 'inject.html';
|
|
var injectjs = isWindows ? basePath + 'inject.js' : 'inject.js';
|
|
var injectcss = isWindows ? basePath + 'inject.css' : 'inject.css';
|
|
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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// PDF URL
|
|
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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// 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'
|
|
);
|
|
|
|
// Local With Anchor Tag
|
|
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();
|
|
});
|
|
ref2.addEventListener('exit', function () {
|
|
cordova.InAppBrowser.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : ''));
|
|
});
|
|
});
|
|
},
|
|
'openHardwareBackDefaultAfterNo'
|
|
);
|
|
};
|