blob: cb54e99f2f7f9f69be662c858e89d3f5192cdbca [file] [log] [blame]
<!DOCTYPE html>
<!--
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.
-->
<html>
<head>
<meta name="viewport" content="width=device-width,height=device-height,user-scalable=no,maximum-scale=1.0,initial-scale=1.0" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8"> <!-- ISO-8859-1 -->
<title>Cordova Mobile Spec</title>
<link rel="stylesheet" href="../master.css" type="text/css" media="screen" title="no title" charset="utf-8">
<script type="text/javascript" charset="utf-8" src="../cordova-incl.js"></script>
<script type="text/javascript" charset="utf-8">
var deviceReady = false;
/**
* Function called when page has finished loading.
*/
function init() {
document.addEventListener("deviceready", function() {
deviceReady = true;
console.log("Device="+device.platform+" "+device.version);
}, false);
function updateUserAgent() {
document.getElementById("user-agent").textContent = navigator.userAgent;
}
updateUserAgent();
window.setInterval(updateUserAgent, 1500);
window.setTimeout(function() {
if (!deviceReady) {
alert("Error: Apache Cordova did not initialize. Demo will not run correctly.");
}
},1000);
}
function doOpen(url, target, params, numExpectedRedirects) {
numExpectedRedirects = numExpectedRedirects || 0;
var iab = window.open(url, target, params);
if (!iab) {
alert('window.open returned ' + iab);
return;
}
var counts;
var lastLoadStartURL;
var wasReset = false;
function reset() {
counts = {
'loaderror': 0,
'loadstart': 0,
'loadstop': 0,
'exit': 0
};
lastLoadStartURL = '';
}
reset();
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.');
}
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');
}
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'] + ')');
}
} else if (numExpectedRedirects > 0 && counts['loadstart'] < (numExpectedRedirects+1)) {
alert('Unexpected: should have got at least ' + (numExpectedRedirects+1) + ' loadstart events, but got ' + counts['loadstart']);
}
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.')
} else if (numStopEvents > 1) {
alert('Unexpected: got multiple loadstop/loaderror events.');
}
}
}
iab.addEventListener('loaderror', logEvent, false);
iab.addEventListener('loadstart', logEvent, false);
iab.addEventListener('loadstop', logEvent, false);
iab.addEventListener('exit', logEvent, false);
return iab;
}
function openWithStyle(url, cssUrl, useCallback) {
var iab = doOpen(url, '_blank', 'location=yes');
var callback = function(results) {
if (results && results.length === 0) {
alert('Results verified');
} else {
console.log(results);
alert('Got: ' + typeof(results) + '\n' + JSON.stringify(results));
}
};
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');
} else {
console.log(results);
alert('Got: ' + typeof(results) + '\n' + JSON.stringify(results));
}
});
});
} 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');
} else {
console.log(results);
alert('Got: ' + typeof(results) + '\n' + JSON.stringify(results));
}
});
});
}
}
var hiddenwnd=null;
var loadlistener = function(event) { alert('background window loaded ' ); };
function openHidden(url, startHidden) {
var shopt =(startHidden) ? 'hidden=yes' : '';
hiddenwnd = window.open(url,'random_string',shopt);
if (!hiddenwnd) {
alert('window.open returned ' + hiddenwnd);
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;
}
}
</script>
</head>
<body onload="init();" id="stage" class="theme">
<h1>InAppBrowser</h1>
<div id="info">
Make sure http://www.google.com is 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></h4>
</div>
<div class="btn small" onclick="backHome();">Back</div>
<h1>Local URL</h1>
<div class="btn large" onclick="doOpen('local.html');">target = Default</div>
Expected result: opens successfully in CordovaWebView.
<p/>
<div class="btn large" onclick="doOpen('local.html', '_self');">target=_self</div>
Expected result: opens successfully in CordovaWebView.
<p/>
<div class="btn large" onclick="doOpen('local.html', '_system');">target=_system</div>
Expected result: fails to open.
<p/>
<div class="btn large" onclick="doOpen('local.html', '_blank');">target=_blank</div>
Expected result: opens successfully in InAppBrowser with locationBar at top.
<p/>
<div class="btn large" onclick="doOpen('local.html', 'random_string', 'location=no,disallowoverscroll=yes');">target=Random, location=no,disallowoverscroll=yes</div>
Expected result: opens successfully in InAppBrowser without locationBar.
<p/>
<div class="btn large" onclick="doOpen('local.html', 'random_string', 'toolbarposition=bottom');">target=Random, toolbarposition=bottom</div>
Expected result: opens successfully in InAppBrowser with locationBar. On iOS the toolbar is at the bottom.
<p/>
<div class="btn large" onclick="doOpen('local.html', 'random_string', 'toolbarposition=top');">target=Random, toolbarposition=top</div>
Expected result: opens successfully in InAppBrowser with locationBar. On iOS the toolbar is at the top.
<p/>
<div class="btn large" onclick="doOpen('local.html', 'random_string', 'toolbarposition=top,location=no');">target=Random, toolbarposition=top,location=no</div>
Expected result: opens successfully in InAppBrowser with no locationBar. On iOS the toolbar is at the top.
<h1>White Listed URL</h1>
<div class="btn large" onclick="doOpen('http://www.google.com');">target=Default<span style="vertical-align:super">*</span></div>
Expected result: open successfully in CordovaWebView to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', '_self');">target=_self<span style="vertical-align:super">*</span></div>
Expected result: open successfully in CordovaWebView to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', '_system');">target=_system</div>
Expected result: open successfully in system browser to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', '_blank');">target=_blank</div>
Expected result: open successfully in InAppBrowser to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', 'random_string');">target=Random</div>
Expected result: open successfully in InAppBrowser to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', 'random_string', 'location=no');">target=Random, no location bar<span style="vertical-align:super">*</span></div>
Expected result: open successfully in InAppBrowser to www.google.com with no location bar.
<h1>Non White Listed URL</h1>
<div class="btn large" onclick="doOpen('http://www.apple.com');">target=Default</div>
Expected result: open successfully in InAppBrowser to apple.com (_self enforces whitelist).
<p/>
<div class="btn large" onclick="doOpen('http://www.apple.com', '_self');">target=_self</div>
Expected result: open successfully in InAppBrowser to apple.com (_self enforces whitelist).
<p/>
<div class="btn large" onclick="doOpen('http://www.apple.com', '_system');">target=_system</div>
Expected result: open successfully in system browser to apple.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.apple.com', '_blank');">target=_blank</div>
Expected result: open successfully in InAppBrowser to apple.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.apple.com', 'random_string');">target=Random</div>
Expected result: open successfully in InAppBrowser to apple.com.
<p/>
<div class="btn large" onclick="doOpen('http://www.apple.com', 'random_string', 'location=no');">target=Random, no location bar<span style="vertical-align:super">*</span></div>
Expected result: open successfully in InAppBrowser to apple.com without locationBar.
<h1>Page with redirect</h1>
<div class="btn large" onclick="doOpen('http://google.com', 'random_string', '', 1);">http://google.com</div>
Expected result: should 301 and open successfully in InAppBrowser to www.google.com.
<p/>
<div class="btn large" onclick="doOpen('http://goo.gl/pUFqg', 'random_string', '', 2);">http://goo.gl/pUFqg</div>
Expected result: should 302 and open successfully in InAppBrowser to www.zhihu.com/answer/16714076.
<h1>PDF URL</h1>
<div class="btn large" onclick="doOpen('http://www.stluciadance.com/prospectus_file/sample.pdf');">Remote URL</div>
Expected result: InAppBrowser opens. PDF should render on iOS.
<p/>
<div class="btn large" onclick="doOpen('local.pdf', '_blank');">Local URL</div>
Expected result: InAppBrowser opens. PDF should render on iOS.
<h1>Invalid URL</h1>
<div class="btn large" onclick="doOpen('x-ttp://www.invalid.com/', '_blank');">Invalid Scheme</div>
Expected result: fail to load in InAppBrowser.
<p/>
<div class="btn large" onclick="doOpen('http://www.inv;alid.com/', '_blank');">Invalid Host</div>
Expected result: fail to load in InAppBrowser.
<p/>
<div class="btn large" onclick="doOpen('nonexistent.html', '_blank');">Missing Local File</div>
Expected result: fail to load in InAppBrowser (404).
<h1>CSS / JS Injection</h1>
<div class="btn large" onclick="doOpen('inject.html', '_blank');">Original Document</div>
Expected result: open successfully in InAppBrowser without text "Style updated from..."
<p/>
<div class="btn large" onclick="openWithStyle('inject.html','inject.css');">CSS File Injection</div>
Expected result: open successfully in InAppBrowser with "Style updated from file".
<p/>
<div class="btn large" onclick="openWithStyle('inject.html','inject.css', true);">CSS File Injection (callback)</div>
Expected result: open successfully in InAppBrowser with "Style updated from file", and alert dialog with text "Results verified".
<p/>
<div class="btn large" onclick="openWithStyle('inject.html');">CSS Literal Injection</div>
Expected result: open successfully in InAppBrowser with "Style updated from literal".
<p/>
<div class="btn large" onclick="openWithStyle('inject.html', null, true);">CSS Literal Injection (callback)</div>
Expected result: open successfully in InAppBrowser with "Style updated from literal", and alert dialog with text "Results verified".
<p/>
<div class="btn large" onclick="openWithScript('inject.html', 'inject.js');">Script File Injection</div>
Expected result: open successfully in InAppBrowser with text "Script file successfully injected"
<p/>
<div class="btn large" onclick="openWithScript('inject.html', 'inject.js', true);">Script File Injection (callback)</div>
Expected result: open successfully in InAppBrowser with text "InAppBrowser - Script / Style Injection Test" and alert dialog with the text "Results verified".
<p/>
<div class="btn large" onclick="openWithScript('inject.html');">Script Literal Injection</div>
Expected result: open successfully in InAppBrowser with the text "abc" in small font in the top left corner.
<p/>
<div class="btn large" onclick="openWithScript('inject.html', null, true);">Script Literal Injection (callback)</div>
Expected result: open successfully in InAppBrowser with text "InAppBrowser - Script / Style Injection Test" and alert dialog with the text "Results verified".
<h1>Open Hidden </h1>
<div class="btn large" onclick="openHidden('http://google.com',true);">create hidden</div>
Expected result: no additional browser window. Alert appears with the text "background window loaded".
<p/>
<div class="btn large" onclick="showHidden();">show hidden</div>
Expected result: after first clicking on previous test "create hidden", open successfully in InAppBrowser to google.com.
<p/>
<div class="btn large" onclick="closeHidden();">close hidden</div>
Expected result: no output. But click on "show hidden" again and nothing should be shown.
<p/>
<div class="btn large" onclick="openHidden('http://google.com',false);">google.com not hidden</div>
Expected result: open successfully in InAppBrowser to www.google.com
<h1>Clearing Cache</h1>
<div class="btn large" onclick="doOpen('http://www.google.com', '_blank', 'clearcache=yes');">Clear Browser Cache</div>
Expected result: ?
<p/>
<div class="btn large" onclick="doOpen('http://www.google.com', '_blank', 'clearsessioncache=yes');">Clear Session Cache</div>
Expected result: ?
<h1>Video tag</h1>
<div class="btn large" onclick="doOpen('video.html', '_blank');">remote video</div>
Expected result: open successfully in InAppBrowser with an embedded video that works after clicking the "play" button.
<h1>Local with anchor tag</h1>
<div class="btn large" onclick="doOpen('local.html#anchor1', '_blank');">Anchor1</div>
Expected result: open successfully in InAppBrowser to the local page, scrolled to the top.
<p/>
<div class="btn large" onclick="doOpen('local.html#anchor2', '_blank');">Anchor2</div>
Expected result: open successfully in InAppBrowser to the local page, scrolled to the beginning of the tall div with border.
<p/>
<div class="backBtn" onclick="backHome();">Back</div>
</body>
</html>