Run tests in browser using Karma
diff --git a/karma.conf.js b/karma.conf.js
new file mode 100644
index 0000000..3f2ab30
--- /dev/null
+++ b/karma.conf.js
@@ -0,0 +1,90 @@
+/*!
+ * 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.
+ */
+
+// Use Chrome executable installed through npm
+process.env.CHROME_BIN = require('puppeteer').executablePath();
+
+module.exports = function (config) {
+    config.set({
+
+        // base path that will be used to resolve all patterns (eg. files, exclude)
+        basePath: '',
+
+        // frameworks to use
+        // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+        frameworks: ['jasmine'],
+
+        // list of files / patterns to load in the browser
+        files: [
+            'pkg/cordova.test.js',
+            'test/**/test.*.js'
+        ],
+
+        // list of files / patterns to exclude
+        exclude: [
+        ],
+
+        // preprocess matching files before serving them to the browser
+        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+        preprocessors: {
+        },
+
+        // test results reporter to use
+        // possible values: 'dots', 'progress'
+        // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+        reporters: ['progress'],
+
+        // web server port
+        port: 9876,
+
+        // enable / disable colors in the output (reporters and logs)
+        colors: true,
+
+        // level of logging
+        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+        logLevel: config.LOG_INFO,
+
+        // enable / disable watching file and executing tests whenever any file changes
+        autoWatch: false,
+
+        // start these browsers
+        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+        browsers: ['ChromeHeadless'],
+
+        // Continuous Integration mode
+        // if true, Karma captures browsers, runs the tests and exits
+        singleRun: true,
+
+        // Concurrency level
+        // how many browser should be started simultaneous
+        concurrency: Infinity
+    });
+
+    if (process.env.TRAVIS) {
+        config.set({
+            browsers: ['ChromeHeadlessNoSandbox'],
+            customLaunchers: {
+                ChromeHeadlessNoSandbox: {
+                    base: 'ChromeHeadless',
+                    flags: ['--no-sandbox']
+                }
+            }
+        });
+    }
+};
diff --git a/package.json b/package.json
index 71598cc..667a5ef 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
   },
   "scripts": {
     "eslint": "eslint src test pkg",
-    "test": "grunt test && npm run eslint",
+    "pretest": "grunt compile:test",
+    "test": "npm run eslint && karma start",
     "build": "grunt compile"
   },
   "license": "Apache-2.0",
@@ -78,9 +79,14 @@
     "grunt": "^1.0.1",
     "grunt-contrib-clean": "^1.0.0",
     "istanbul": "^0.4.5",
+    "jasmine-core": "^3.2.1",
     "jasmine-node": "^1.14.6",
     "jsdom-no-contextify": "^3.1.0",
-    "mkdirp": "^0.5.0"
+    "karma": "^3.0.0",
+    "karma-chrome-launcher": "^2.2.0",
+    "karma-jasmine": "^1.1.2",
+    "mkdirp": "^0.5.0",
+    "puppeteer": "^1.8.0"
   },
   "cordova-platforms": {
     "cordova-android": "../cordova-android",