const KeymapManager = require('atom-keymap'); const WindowEventHandler = require('../src/window-event-handler'); const { conditionPromise } = require('./async-spec-helpers'); describe('WindowEventHandler', () => { let windowEventHandler; beforeEach(() => { atom.uninstallWindowEventHandler(); spyOn(atom, 'hide'); const initialPath = atom.project.getPaths()[0]; spyOn(atom, 'getLoadSettings').andCallFake(() => { const loadSettings = atom.getLoadSettings.originalValue.call(atom); loadSettings.initialPath = initialPath; return loadSettings; }); atom.project.destroy(); windowEventHandler = new WindowEventHandler({ atomEnvironment: atom, applicationDelegate: atom.applicationDelegate }); windowEventHandler.initialize(window, document); }); afterEach(() => { windowEventHandler.unsubscribe(); atom.installWindowEventHandler(); }); describe('when the window is loaded', () => it("doesn't have .is-blurred on the body tag", () => { if (process.platform === 'win32') { return; } // Win32TestFailures - can not steal focus expect(document.body.className).not.toMatch('is-blurred'); })); describe('when the window is blurred', () => { beforeEach(() => window.dispatchEvent(new CustomEvent('blur'))); afterEach(() => document.body.classList.remove('is-blurred')); it('adds the .is-blurred class on the body', () => expect(document.body.className).toMatch('is-blurred')); describe('when the window is focused again', () => it('removes the .is-blurred class from the body', () => { window.dispatchEvent(new CustomEvent('focus')); expect(document.body.className).not.toMatch('is-blurred'); })); }); describe('resize event', () => it('calls storeWindowDimensions', async () => { jasmine.useRealClock(); spyOn(atom, 'storeWindowDimensions'); window.dispatchEvent(new CustomEvent('resize')); await conditionPromise(() => atom.storeWindowDimensions.callCount > 0); })); describe('window:close event', () => it('closes the window', () => { spyOn(atom, 'close'); window.dispatchEvent(new CustomEvent('window:close')); expect(atom.close).toHaveBeenCalled(); })); describe('when a link is clicked', () => { it('opens the http/https links in an external application', () => { const { shell } = require('electron'); spyOn(shell, 'openExternal'); const link = document.createElement('a'); const linkChild = document.createElement('span'); link.appendChild(linkChild); link.href = 'http://github.com'; jasmine.attachToDOM(link); const fakeEvent = { target: linkChild, currentTarget: link, preventDefault: () => {} }; windowEventHandler.handleLinkClick(fakeEvent); expect(shell.openExternal).toHaveBeenCalled(); expect(shell.openExternal.argsForCall[0][0]).toBe('http://github.com'); shell.openExternal.reset(); link.href = 'https://github.com'; windowEventHandler.handleLinkClick(fakeEvent); expect(shell.openExternal).toHaveBeenCalled(); expect(shell.openExternal.argsForCall[0][0]).toBe('https://github.com'); shell.openExternal.reset(); link.href = ''; windowEventHandler.handleLinkClick(fakeEvent); expect(shell.openExternal).not.toHaveBeenCalled(); shell.openExternal.reset(); link.href = '#scroll-me'; windowEventHandler.handleLinkClick(fakeEvent); expect(shell.openExternal).not.toHaveBeenCalled(); }); it('opens the "atom://" links with URL handler', () => { const uriHandler = windowEventHandler.atomEnvironment.uriHandlerRegistry; expect(uriHandler).toBeDefined(); spyOn(uriHandler, 'handleURI'); const link = document.createElement('a'); const linkChild = document.createElement('span'); link.appendChild(linkChild); link.href = 'atom://github.com'; jasmine.attachToDOM(link); const fakeEvent = { target: linkChild, currentTarget: link, preventDefault: () => {} }; windowEventHandler.handleLinkClick(fakeEvent); expect(uriHandler.handleURI).toHaveBeenCalled(); expect(uriHandler.handleURI.argsForCall[0][0]).toBe('atom://github.com'); }); }); describe('when a form is submitted', () => it("prevents the default so that the window's URL isn't changed", () => { const form = document.createElement('form'); jasmine.attachToDOM(form); let defaultPrevented = false; const event = new CustomEvent('submit', { bubbles: true }); event.preventDefault = () => { defaultPrevented = true; }; form.dispatchEvent(event); expect(defaultPrevented).toBe(true); })); describe('core:focus-next and core:focus-previous', () => { describe('when there is no currently focused element', () => it('focuses the element with the lowest/highest tabindex', () => { const wrapperDiv = document.createElement('div'); wrapperDiv.innerHTML = `