diff --git a/addons/core/addon/services/browser-object.js b/addons/core/addon/services/browser-object.js deleted file mode 100644 index 5b236dc94..000000000 --- a/addons/core/addon/services/browser-object.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: MPL-2.0 - */ - -import Service from '@ember/service'; - -/** - * A simple service that wraps around the global window and - * document variables that allows us to mock them in testing - */ -export default class BrowserObjectService extends Service { - /** - * The global window object - * @returns {Window} - */ - get window() { - return window; - } - - /** - * The global document object - * @returns {Document} - */ - get document() { - return this.window?.document; - } - - /** - * The hostname of the current location of the URL - * @returns {string} - */ - get hostname() { - return this.window?.location?.hostname; - } -} diff --git a/addons/core/app/services/browser-object.js b/addons/core/app/services/browser-object.js deleted file mode 100644 index 7eccd85d0..000000000 --- a/addons/core/app/services/browser-object.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: MPL-2.0 - */ - -export { default } from 'core/services/browser-object'; diff --git a/addons/core/tests/unit/services/browser-object-test.js b/addons/core/tests/unit/services/browser-object-test.js deleted file mode 100644 index 07a2a1156..000000000 --- a/addons/core/tests/unit/services/browser-object-test.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: MPL-2.0 - */ - -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Service | browser-object', function (hooks) { - setupTest(hooks); - - test('it contains a window', function (assert) { - let service = this.owner.lookup('service:browser-object'); - assert.ok(service.window, 'Service contains a window'); - }); - - test('it contains a document', function (assert) { - let service = this.owner.lookup('service:browser-object'); - assert.ok(service.document, 'Service contains a document'); - }); - - test('it contains a hostname', function (assert) { - let service = this.owner.lookup('service:browser-object'); - assert.ok(service.hostname, 'Service contains a hostname'); - }); -}); diff --git a/ui/admin/app/components/form/worker/create-worker-led/index.js b/ui/admin/app/components/form/worker/create-worker-led/index.js index 6678cef63..1a1316648 100644 --- a/ui/admin/app/components/form/worker/create-worker-led/index.js +++ b/ui/admin/app/components/form/worker/create-worker-led/index.js @@ -22,7 +22,7 @@ class Tag { export default class FormWorkerCreateWorkerLedComponent extends Component { // =services @service features; - @service browserObject; + @service('browser/window') window; // =attributes @tracked generatedWorkerAuthToken; @@ -35,7 +35,7 @@ export default class FormWorkerCreateWorkerLedComponent extends Component { @tracked newWorkerValue; get clusterIDFromURL() { - const hostname = this.browserObject.hostname; + const hostname = this.window?.location?.hostname; // Match against a guid with either the prod, int, or dev hcp domain const clusterIDMatcher = diff --git a/ui/admin/app/routes/onboarding/success.js b/ui/admin/app/routes/onboarding/success.js index cba145eea..8847eea01 100644 --- a/ui/admin/app/routes/onboarding/success.js +++ b/ui/admin/app/routes/onboarding/success.js @@ -11,14 +11,14 @@ export default class OnboardingSuccessRoute extends Route { // =services @service router; @service session; - @service browserObject; + @service('browser/window') window; // =methods model() { const model = this.modelFor('onboarding'); return { ...model, - clusterUrl: this.browserObject.window.origin, + clusterUrl: this.window.origin, }; } diff --git a/ui/admin/tests/integration/components/form/worker/create-worker-led-test.js b/ui/admin/tests/integration/components/form/worker/create-worker-led-test.js index dabcb637f..f374c9960 100644 --- a/ui/admin/tests/integration/components/form/worker/create-worker-led-test.js +++ b/ui/admin/tests/integration/components/form/worker/create-worker-led-test.js @@ -9,11 +9,13 @@ import { render } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import { v1 } from 'ember-uuid'; import { setupIntl } from 'ember-intl/test-support'; +import { setupBrowserFakes } from 'ember-browser-services/test-support'; module( 'Integration | Component | form/worker/create-worker-led', function (hooks) { setupRenderingTest(hooks); + setupBrowserFakes(hooks, { window: true }); setupIntl(hooks); hooks.beforeEach(function () { @@ -23,14 +25,13 @@ module( }); test('it correctly populates the cluster id for an hcp dev cluster', async function (assert) { + const windowService = this.owner.lookup('service:browser/window'); const guid = v1(); this.model = {}; this.submit = () => {}; this.refresh = () => {}; - const service = { hostname: `${guid}.boundary.hcp.dev` }; - this.owner.register('service:browser-object', service, { - instantiate: false, - }); + + windowService.location.hostname = `${guid}.boundary.hcp.dev`; await render( hbs`` @@ -40,14 +41,13 @@ module( }); test('it correctly populates the cluster id for an hcp int cluster', async function (assert) { + const windowService = this.owner.lookup('service:browser/window'); const guid = v1(); this.model = {}; this.submit = () => {}; this.refresh = () => {}; - const service = { hostname: `${guid}.boundary.hcp.to` }; - this.owner.register('service:browser-object', service, { - instantiate: false, - }); + + windowService.location.hostname = `${guid}.boundary.hcp.to`; await render( hbs`` @@ -57,14 +57,13 @@ module( }); test('it correctly populates the cluster id for an hcp prod cluster', async function (assert) { + const windowService = this.owner.lookup('service:browser/window'); const guid = v1(); this.model = {}; this.submit = () => {}; this.refresh = () => {}; - const service = { hostname: `${guid}.boundary.hashicorp.cloud` }; - this.owner.register('service:browser-object', service, { - instantiate: false, - }); + + windowService.location.hostname = `${guid}.boundary.hashicorp.cloud`; await render( hbs`` @@ -74,13 +73,12 @@ module( }); test('it leaves the cluster id as blank for any other url', async function (assert) { + const windowService = this.owner.lookup('service:browser/window'); this.model = {}; this.submit = () => {}; this.refresh = () => {}; - const service = { hostname: `personal.website.com` }; - this.owner.register('service:browser-object', service, { - instantiate: false, - }); + + windowService.location.hostname = `personal.website.com`; await render( hbs`` diff --git a/ui/desktop/app/routes/cluster-url.js b/ui/desktop/app/routes/cluster-url.js index a597ee9a2..566a881ff 100644 --- a/ui/desktop/app/routes/cluster-url.js +++ b/ui/desktop/app/routes/cluster-url.js @@ -5,7 +5,6 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; -import { getOwner } from '@ember/application'; import { action } from '@ember/object'; import { loading } from 'ember-loading'; import config from '../config/environment'; @@ -19,6 +18,7 @@ export default class ClusterUrlRoute extends Route { @service intl; @service flashMessages; @service router; + @service('browser/window') window; // =attributes @@ -29,17 +29,6 @@ export default class ClusterUrlRoute extends Route { return this.store.adapterFor('application'); } - /** - * Looks up the window object indirectly. - * @type {Window} - */ - get window() { - // The Ember way of accessing globals... - const document = getOwner(this).lookup('service:-document').documentElement; - // defaultView === window, but without using globals directly - return document.parentNode.defaultView; - } - // =methods /** diff --git a/ui/desktop/tests/acceptance/cluster-url-test.js b/ui/desktop/tests/acceptance/cluster-url-test.js index 58130dcd2..2fd574da0 100644 --- a/ui/desktop/tests/acceptance/cluster-url-test.js +++ b/ui/desktop/tests/acceptance/cluster-url-test.js @@ -58,6 +58,10 @@ module('Acceptance | clusterUrl', function (hooks) { projects: null, targets: null, }; + const setupMockIpc = (test) => { + test.owner.register('service:browser/window', WindowMockIPC); + mockIPC = test.owner.lookup('service:browser/window').mockIPC; + }; hooks.beforeEach(function () { invalidateSession(); @@ -96,10 +100,6 @@ module('Acceptance | clusterUrl', function (hooks) { urls.authenticate.methods.global = `${urls.authenticate.global}/${instances.authMethods.global.id}`; urls.projects = `${urls.scopes.global}/projects`; urls.targets = `${urls.projects}/targets`; - - // Mock the postMessage interface used by IPC. - this.owner.register('service:browser/window', WindowMockIPC); - mockIPC = this.owner.lookup('service:browser/window').mockIPC; }); hooks.afterEach(function () { @@ -115,6 +115,7 @@ module('Acceptance | clusterUrl', function (hooks) { test('visiting index without a clusterUrl specified redirects to clusterUrl route', async function (assert) { assert.expect(2); + setupMockIpc(this); await visit(urls.index); await a11yAudit(); assert.notOk(mockIPC.clusterUrl); @@ -123,6 +124,7 @@ module('Acceptance | clusterUrl', function (hooks) { test('can set clusterUrl', async function (assert) { assert.expect(3); + setupMockIpc(this); assert.notOk(mockIPC.clusterUrl); await visit(urls.clusterUrl); await fillIn('[name="host"]', currentOrigin); @@ -133,6 +135,7 @@ module('Acceptance | clusterUrl', function (hooks) { test('can reset clusterUrl before authentication', async function (assert) { assert.expect(4); + setupMockIpc(this); assert.notOk(mockIPC.clusterUrl); await visit(urls.clusterUrl); await fillIn('[name="host"]', currentOrigin); @@ -145,6 +148,7 @@ module('Acceptance | clusterUrl', function (hooks) { test('captures error on clusterUrl update', async function (assert) { assert.expect(2); + setupMockIpc(this); assert.notOk(mockIPC.clusterUrl); sinon .stub(this.owner.lookup('service:clusterUrl'), 'setClusterUrl')