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