diff --git a/src/options.js b/src/options.js
index e6e4117..1d63dcc 100644
--- a/src/options.js
+++ b/src/options.js
@@ -28,22 +28,26 @@ class Options {
Options.extract = function (document) {
for (const element of Array.from(document.getElementsByTagName('script'))) {
- var m, src;
- if ((src = element.getAttribute('src')) && (m = src.match(new RegExp('^(?:[^:]+:)?//(.*)/z?livereload\\.js(?:\\?(.*))?$')))) {
- var mm;
+ var m, mm,
+ src = element.src, srcAttr = element.getAttribute('src');
+ var lrUrlRegexp = /^([^:]+:\/\/([^\/:]+)(?::(\d+))?\/|\/\/|\/)?([^\/].*\/)?z?livereload\.js(?:\?(.*))?$/;
+ // ^proto:// ^host ^port ^// ^/ ^folder
+ if ((m = src.match(lrUrlRegexp)) && (mm = srcAttr.match(lrUrlRegexp))) {
+ const [, , host, port, , params] = m;
+ const [, , , portFromAttr] = mm;
const options = new Options();
options.https = element.src.indexOf('https') === 0;
- if ((mm = m[1].match(new RegExp('^([^/:]+)(?::(\\d+))?(\\/+.*)?$')))) {
- options.host = mm[1];
- if (mm[2]) {
- options.port = parseInt(mm[2], 10);
- }
- }
+ options.host = host;
+ options.port = port
+ ? parseInt(port, 10)
+ : portFromAttr
+ ? parseInt(portFromAttr, 10)
+ : options.port;
- if (m[2]) {
- for (const pair of m[2].split('&')) {
+ if (params) {
+ for (const pair of params.split('&')) {
var keyAndValue;
if ((keyAndValue = pair.split('=')).length > 1) {
diff --git a/test/options_test.js b/test/options_test.js
index 7636ed0..794dcc8 100644
--- a/test/options_test.js
+++ b/test/options_test.js
@@ -77,6 +77,29 @@ describe('Options', function () {
return assert.strictEqual(true, options.https);
});
+ it('should recognize same site URLs', function () {
+ let dom = new JSDOM('', {
+ url: 'https://somewhere.org/'
+ });
+ let options = Options.extract(dom.window.document);
+ assert.ok(options);
+ assert.strictEqual('somewhere.org', options.host);
+
+ dom = new JSDOM('', {
+ url: 'https://somewhere.org/'
+ });
+ options = Options.extract(dom.window.document);
+ assert.ok(options);
+ assert.strictEqual('somewhere.org', options.host);
+
+ dom = new JSDOM('', {
+ url: 'https://somewhere.org/'
+ });
+ options = Options.extract(dom.window.document);
+ assert.ok(options);
+ return assert.strictEqual('somewhere.org', options.host);
+ });
+
return it('should recognize protocol-relative https URL', function () {
const dom = new JSDOM('', {
url: 'https://somewhere.org/'
@@ -85,4 +108,5 @@ describe('Options', function () {
assert.ok(options);
return assert.strictEqual(true, options.https);
});
+
});