Path: blob/main/plugins/default-browser-emulator/test/plugins.test.ts
1029 views
import * as Fs from 'fs';1import * as Path from 'path';2import { inspect } from 'util';3import * as Helpers from '@secret-agent/testing/helpers';4import Puppet from '@secret-agent/puppet';5import Log from '@secret-agent/commons/Logger';6import CorePlugins from '@secret-agent/core/lib/CorePlugins';7import { IBoundLog } from '@secret-agent/interfaces/ILog';8import BrowserEmulator from '../index';9import * as pluginsChrome from './plugins-Chrome.json';10import { getOverrideScript } from '../lib/DomOverridesBuilder';11import DomExtractor = require('./DomExtractor');1213const { log } = Log(module);14const selectBrowserMeta = BrowserEmulator.selectBrowserMeta();1516const navigatorJsonPath = Path.resolve(17__dirname,18'../data/as-chrome-88-0/as-mac-os-10-14/window-navigator.json',19);2021const { navigator } = JSON.parse(Fs.readFileSync(navigatorJsonPath, 'utf8')) as any;2223let puppet: Puppet;24beforeAll(async () => {25puppet = new Puppet(selectBrowserMeta.browserEngine);26Helpers.onClose(() => puppet.close(), true);27await puppet.start();28});2930afterAll(Helpers.afterAll);31afterEach(Helpers.afterEach);3233const debug = process.env.DEBUG || false;3435test('it should override plugins in a browser window', async () => {36const httpServer = await Helpers.runHttpServer();37const plugins = new CorePlugins({ selectBrowserMeta }, log as IBoundLog);38const context = await puppet.newContext(plugins, log);39Helpers.onClose(() => context.close());40const page = await context.newPage();4142page.on('page-error', console.log);43if (debug) {44page.on('console', console.log);45}46await page.addNewDocumentScript(47getOverrideScript('navigator.plugins', {48mimeTypes: [49{50type: 'application/pdf',51suffixes: 'pdf',52description: '',53__pluginName: 'Chrome PDF Viewer',54},55{56type: 'application/x-google-chrome-pdf',57suffixes: 'pdf',58description: 'Portable Document Format',59__pluginName: 'Chrome PDF Plugin',60},61{62type: 'application/x-nacl',63suffixes: '',64description: 'Native Client Executable',65__pluginName: 'Native Client',66},67{68type: 'application/x-pnacl',69suffixes: '',70description: 'Portable Native Client Executable',71__pluginName: 'Native Client',72},73],74plugins: [75{76name: 'Chrome PDF Plugin',77filename: 'internal-pdf-viewer',78description: 'Portable Document Format',79},80{81name: 'Chrome PDF Viewer',82filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai',83description: '',84},85{86name: 'Native Client',87filename: 'internal-nacl-plugin',88description: '',89},90],91}).script,92false,93);94await Promise.all([95page.navigate(httpServer.url),96page.mainFrame.waitOn('frame-lifecycle', ev => ev.name === 'DOMContentLoaded'),97]);9899const hasPlugins = await page.mainFrame.evaluate(100`'plugins' in navigator && 'mimeTypes' in navigator`,101false,102);103expect(hasPlugins).toBe(true);104105const pluginCount = await page.mainFrame.evaluate(`navigator.plugins.length`, false);106expect(pluginCount).toBe(3);107108const plugin1Count = await page.mainFrame.evaluate(109`(() => {110let mimes = [];111for(const mime of navigator.plugins[0]) {112mimes.push(mime.type);113}114return mimes;115})()`,116false,117);118expect(plugin1Count).toStrictEqual(['application/x-google-chrome-pdf']);119120const mimecount = await page.mainFrame.evaluate(`navigator.mimeTypes.length`, false);121expect(mimecount).toBe(4);122123const structure = JSON.parse(124(await page.mainFrame.evaluate(125`new (${DomExtractor.toString()})('window').run(window, 'window', ['Plugin', 'PluginArray', 'MimeType', 'MimeTypeArray','navigator'])`,126false,127)) as any,128).window;129130for (const proto of ['Plugin', 'PluginArray', 'MimeType', 'MimeTypeArray']) {131if (debug) console.log(proto, inspect(structure[proto], false, null, true));132expect(structure[proto]).toStrictEqual(pluginsChrome[proto]);133}134const navigatorStructure = structure.navigator;135if (debug) console.log(inspect(navigatorStructure.mimeTypes, false, null, true));136expect(navigatorStructure.mimeTypes).toStrictEqual(navigator.mimeTypes);137138if (debug) console.log(inspect(navigatorStructure.plugins, false, null, true));139expect(navigatorStructure.plugins).toStrictEqual(navigator.plugins);140}, 60e3);141142143