/*
 *
 * 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'
    );
};