tabs.js.map 9.6 KB
{"version":3,"sources":["tabs.js"],"names":[],"mappings":"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","file":"tabs.js","sourcesContent":["// Tab management.\n\nconst _             = require('lodash');\nconst createHistory = require('./history');\n\n\nmodule.exports = class Tabs extends Array {\n\n  constructor(browser) {\n    super();\n    this._current = null;\n    this._browser = browser;\n    this.length   = 0;\n    Object.defineProperty(this, 'length',   { enumerable: false, writable: true });\n    Object.defineProperty(this, '_browser', { enumerable: false, writable: true });\n    Object.defineProperty(this, '_current', { enumerable: false, writable: true });\n  }\n\n  // Get the currently open tab\n  get current() {\n    return this._current;\n  }\n\n  // Sets the currently open tab\n  // - Name   - Pick existing window with this name\n  // - Number - Pick existing window from tab position\n  // - Window - Use this window\n  set current(nameOrWindow) {\n    const window = this.find(nameOrWindow);\n    if (this._indexOf(window) < 0)\n      return;\n    if (!Tabs.sameWindow(this._current, window)) {\n      if (this._current)\n        this._browser.emit('inactive', this._current);\n      this._current = window;\n      this._browser.emit('active', this._current);\n    }\n  }\n\n  // Returns window by index or name. Use this for window names that shadow\n  // existing properties (e.g. tabs['open'] is a function, use\n  find(nameOrWindow) {\n    if (this.propertyIsEnumerable(nameOrWindow))\n      return this[nameOrWindow];\n    const byName = _.find(this, { name: nameOrWindow });\n    if (byName)\n      return byName;\n    if (this._indexOf(nameOrWindow) >= 0)\n      return nameOrWindow;\n    return null;\n  }\n\n  // Index of currently selected tab.\n  get index() {\n    return this._indexOf(this._current);\n  }\n\n  // Opens and returns a tab.  If an open window by the same name already exists,\n  // opens this window in the same tab.  Omit name or use '_blank' to always open\n  // a new tab.\n  //\n  // name    - Window name (optional)\n  // opener  - Opening window (window.open call)\n  // referer - Referrer\n  // url     - Set document location to this URL upon opening\n  // html    - Document contents (browser.load)\n  open(options = {}) {\n\n    // If name window in open tab, reuse that tab. Otherwise, open new window.\n    const named = options.name && this.find(options.name.toString());\n    if (named) {\n      // Select this as the currently open tab. Changing the location would then\n      // select a different window.\n      this._current = named;\n      if (options.url)\n        this._current.location = options.url;\n      return this._current;\n    }\n\n    // When window changes we need to change tab slot. We can't keep the index\n    // around, since tab order changes, so we look up the currently known\n    // active window and switch that around.\n    let active = null;\n    const open = createHistory(this._browser, (window)=> {\n      // Focus changes to different window, make it the active window\n      if (!Tabs.sameWindow(window, active)) {\n        const index = this._indexOf(active);\n        if (index >= 0)\n          this[index] = window;\n        this.current = active = window;\n      }\n      if (window)\n        this._browser._eventLoop.setActiveWindow(window);\n    });\n\n    const name = options.name === '_blank' ? '' : (options.name || '');\n    options.name = name;\n    const window = open(options);\n    this.push(window);\n    if (name && (this.propertyIsEnumerable(name) || !this[name]))\n      this[name] = window;\n    // Select this as the currently open tab\n    this.current = active = window;\n    return window;\n  }\n\n  // Close an open tab.\n  //\n  // With no argument, closes the currently open tab (tabs.current).\n  //\n  // Argument can be the window, window name or tab position (same as find).\n  close(nameOrWindow) {\n    const window = nameOrWindow ?  this.find(nameOrWindow) : this._current;\n    if (this._indexOf(window) >= 0)\n      window.close();\n  }\n\n  // Closes all open tabs/windows.\n  closeAll() {\n    const tabs = this.slice();\n    this._current = null;\n    for (let tab of tabs)\n      tab.close();\n  }\n\n  // Dump list of all open tabs to stdout or output stream.\n  dump(output = process.stdout) {\n    if (this.length === 0) {\n      output.write('No open tabs.\\n');\n      return;\n    }\n    for (let tab of this)\n      output.write(`Window ${tab.name || 'unnamed'} open to ${tab.location.href}\\n`);\n  }\n\n\n  // Find the position of this window in the tabs array\n  _indexOf(window) {\n    if (!window)\n      return -1;\n    return this.slice().map(tab => tab._globalProxy).indexOf(window._globalProxy);\n  }\n\n  // Called when window closed to remove it from tabs list.\n  _closed(window) {\n    const index = this._indexOf(window);\n    if (index >= 0) {\n      this._browser.emit('inactive', window);\n\n      this.splice(index, 1);\n      if (this.propertyIsEnumerable(window.name))\n        delete this[window.name];\n\n      // If we closed the currently open tab, need to select another window.\n      if (Tabs.sameWindow(window, this._current)) {\n        // Don't emit inactive event for closed window.\n        this._current = this[index - 1] || this[0];\n        if (this._current)\n          this._browser.emit('active', this._current);\n      }\n    }\n\n  }\n\n  // Determine if two windows are the same\n  static sameWindow(a, b) {\n    return a && b && a._globalProxy === b._globalProxy;\n  }\n};\n"]}