text: /*
   * Copyright (C) 2007 Apple Inc.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1.  Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   * 2.  Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
   *     its contributors may be used to endorse or promote products derived
   *     from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
   * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  //# sourceURL=__InjectedScript_CommandLineAPIModuleSource.js
  
  (function (InjectedScriptHost, inspectedGlobalObject, injectedScriptId, injectedScript, {RemoteObject, CommandLineAPI}, CommandLineAPIHost) {
  
  // FIXME: <https://webkit.org/b/152294> Web Inspector: Parse InjectedScriptSource as a built-in to get guaranteed non-user-overridden built-ins
  
  injectedScript._inspectObject = function(object) {
      if (arguments.length === 0)
          return;
  
      let objectId = RemoteObject.create(object);
      let hints = {};
  
      switch (RemoteObject.describe(object)) {
      case "Database":
          var databaseId = CommandLineAPIHost.databaseId(object);
          if (databaseId)
              hints.databaseId = databaseId;
          break;
      case "Storage":
          var storageId = CommandLineAPIHost.storageId(object);
          if (storageId)
              hints.domStorageId = InjectedScriptHost.evaluate("(" + storageId + ")");
          break;
      }
  
      CommandLineAPIHost.inspect(objectId, hints);
  };
  
  CommandLineAPI.getters["0"] = function() {
      return CommandLineAPIHost.inspectedObject();
  };
  
  CommandLineAPI.methods["copy"] = function(object) {
      let string = null;
  
      let subtype = RemoteObject.subtype(object);
      if (subtype === "node")
          string = object.outerHTML;
      else if (subtype === "regexp")
          string = "" + object;
      else if (injectedScript.isPrimitiveValue(object))
          string = "" + object;
      else if (typeof object === "symbol")
          string = inspectedGlobalObject.String(object);
      else if (typeof object === "function")
          string = "" + object;
      else {
          try {
              string = inspectedGlobalObject.JSON.stringify(object, null, "  ");
          } catch {
              string = "" + object;
          }
      }
  
      CommandLineAPIHost.copyText(string);
  };
  
  CommandLineAPI.methods["getEventListeners"] = function(target) {
      return CommandLineAPIHost.getEventListeners(target);
  };
  
  function normalizeEventTypes(types) {
      if (types === undefined)
          types = ["mouse", "key", "touch", "control", "abort", "blur", "change", "devicemotion", "deviceorientation", "error", "focus", "load", "reset", "resize", "scroll", "search", "select", "submit", "unload"];
      else if (typeof types === "string")
          types = [types];
  
      let result = [];
      for (let i = 0; i < types.length; i++) {
          if (types[i] === "mouse")
              result.push("click", "dblclick", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup", "mousewheel");
          else if (types[i] === "key")
              result.push("keydown", "keypress", "keyup", "textInput");
          else if (types[i] === "touch")
              result.push("touchcancel", "touchend", "touchmove", "touchstart");
          else if (types[i] === "control")
              result.push("blur", "change", "focus", "reset", "resize", "scroll", "select", "submit", "zoom");
          else
              result.push(types[i]);
      }
      return result;
  }
  
  function logEvent(event)
  {
      inspectedGlobalObject.console.log(event.type, event);
  }
  
  CommandLineAPI.methods["monitorEvents"] = function(object, types) {
      if (!object || !object.addEventListener || !object.removeEventListener)
          return;
      types = normalizeEventTypes(types);
      for (let i = 0; i < types.length; ++i) {
          object.removeEventListener(types[i], logEvent, false);
          object.addEventListener(types[i], logEvent, false);
      }
  };
  
  CommandLineAPI.methods["unmonitorEvents"] = function(object, types) {
      if (!object || !object.addEventListener || !object.removeEventListener)
          return;
      types = normalizeEventTypes(types);
      for (let i = 0; i < types.length; ++i)
          object.removeEventListener(types[i], logEvent, false);
  };
  
  if (inspectedGlobalObject.document && inspectedGlobalObject.Node) {
      function canQuerySelectorOnNode(node) {
          return node && InjectedScriptHost.subtype(node) === "node" && (node.nodeType === inspectedGlobalObject.Node.ELEMENT_NODE || node.nodeType === inspectedGlobalObject.Node.DOCUMENT_NODE || node.nodeType === inspectedGlobalObject.Node.DOCUMENT_FRAGMENT_NODE);
      }
  
      CommandLineAPI.methods["$"] = function(selector, start) {
          if (canQuerySelectorOnNode(start))
              return start.querySelector(selector);
  
          let result = inspectedGlobalObject.document.querySelector(selector);
          if (result)
              return result;
  
          if (selector && selector[0] !== "#") {
              result = inspectedGlobalObject.document.getElementById(selector);
              if (result) {
                  inspectedGlobalObject.console.warn("The console function $() has changed from $=getElementById(id) to $=querySelector(selector). You might try $(\"#%s\")", selector);
                  return null;
              }
          }
  
          return result;
      };
  
      CommandLineAPI.methods["$$"] = function(selector, start) {
          if (canQuerySelectorOnNode(start))
              return inspectedGlobalObject.Array.from(start.querySelectorAll(selector));
          return inspectedGlobalObject.Array.from(inspectedGlobalObject.document.querySelectorAll(selector));
      };
  
      CommandLineAPI.methods["$x"] = function(xpath, context) {
          let doc = (context && context.ownerDocument) || inspectedGlobalObject.document;
          let result = doc.evaluate(xpath, context || doc, null, inspectedGlobalObject.XPathResult.ANY_TYPE, null);
          switch (result.resultType) {
          case inspectedGlobalObject.XPathResult.NUMBER_TYPE:
              return result.numberValue;
          case inspectedGlobalObject.XPathResult.STRING_TYPE:
              return result.stringValue;
          case inspectedGlobalObject.XPathResult.BOOLEAN_TYPE:
              return result.booleanValue;
          }
  
          let nodes = [];
          let node = null;
          while (node = result.iterateNext())
              nodes.push(node);
          return nodes;
      };
  }
  
  for (let name in CommandLineAPI.methods)
      CommandLineAPI.methods[name].toString = function() { return "function " + name + "() { [Command Line API] }"; };
  
  })
  