From 415de9a291625891520bab3ab92c6e2d86d64447 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 20 Mar 2019 23:29:14 +0200 Subject: [PATCH] test(service-worker): ensure `SwTestHarness#parseUrl()` behaves the same on browser and Node.js (#27080) PR Close #27080 --- .../service-worker/worker/testing/scope.ts | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/service-worker/worker/testing/scope.ts b/packages/service-worker/worker/testing/scope.ts index 265df3c3d6..f2c0d1f66e 100644 --- a/packages/service-worker/worker/testing/scope.ts +++ b/packages/service-worker/worker/testing/scope.ts @@ -95,8 +95,13 @@ export class SwTestHarness implements ServiceWorkerGlobalScope, Adapter, Context } as any; static envIsSupported(): boolean { - return (typeof URL === 'function') || - (typeof require === 'function' && typeof require('url')['parse'] === 'function'); + if (typeof URL === 'function') { + return true; + } + + // In older Node.js versions, the `URL` global does not exist. We can use `url` instead. + const url = (typeof require === 'function') && require('url'); + return url && (typeof url.parse === 'function') && (typeof url.resolve === 'function'); } time: number; @@ -176,13 +181,14 @@ export class SwTestHarness implements ServiceWorkerGlobalScope, Adapter, Context } parseUrl(url: string, relativeTo?: string): {origin: string, path: string} { - if (typeof URL === 'function') { - const obj = new URL(url, relativeTo); - return {origin: obj.origin, path: obj.pathname}; - } else { - const obj = require('url').parse(url); - return {origin: `${obj.protocol}//${obj.host}`, path: obj.pathname}; - } + const parsedUrl: URL = (typeof URL === 'function') ? + new URL(url, relativeTo) : + require('url').parse(require('url').resolve(relativeTo || '', url)); + + return { + origin: parsedUrl.origin || `${parsedUrl.protocol}//${parsedUrl.host}`, + path: parsedUrl.pathname, + }; } async skipWaiting(): Promise { this.skippedWaiting = true; }