text: /*
   *
   * 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.InAppBrowserPopUp.open).toBeDefined();
                  expect(cordova.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.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.InAppBrowserPopUp.open(url, 'random_string', shopt);
          if (!hiddenwnd) {
              alert('cordova.InAppBrowserPopUp.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.InAppBrowserPopUp.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : ''));
              ref.addEventListener('loadstop', function () {
                  ref.close();
              });
              ref.addEventListener('exit', function () {
                  var ref2 = cordova.InAppBrowserPopUp.open(
                      'https://google.com',
                      '_blank',
                      'location=yes,hardwareback=no' + (platformOpts ? ',' + platformOpts : '')
                  );
                  ref2.addEventListener('loadstop', function () {
                      ref2.close();
                  });
                  ref2.addEventListener('exit', function () {
                      cordova.InAppBrowserPopUp.open('https://google.com', '_blank', 'location=yes' + (platformOpts ? ',' + platformOpts : ''));
                  });
              });
          },
          'openHardwareBackDefaultAfterNo'
      );
  };
  