File: //proc/1526/task/1530/cwd/zaklada/html/node_modules/jsdom/lib/jsdom/living/document.js
"use strict";
const DOMException = require("../web-idl/DOMException");
const validateNames = require("./helpers/validate-names");
const defineGetter = require("../utils").defineGetter;
const defineSetter = require("../utils").defineSetter;
const memoizeQuery = require("../utils").memoizeQuery;
const clone = require("./node").clone;
const listOfElementsWithClassNames = require("./node").listOfElementsWithClassNames;
const validateName = require("./helpers/validate-names").name;
const validateAndExtract = require("./helpers/validate-names").validateAndExtract;
const NODE_TYPE = require("../living/node-type");
module.exports = function (core) {
  core.Document.prototype.createProcessingInstruction = function (target, data) {
    if (arguments.length < 2) {
      throw new TypeError("Not enough arguments to Document.prototype.createProcessingInstruction");
    }
    target = String(target);
    data = String(data);
    validateNames.name(target);
    if (data.indexOf("?>") !== -1) {
      throw new core.DOMException(core.DOMException.INVALID_CHARACTER_ERR,
        "Processing instruction data cannot contain the string \"?>\"");
    }
    return new core.ProcessingInstruction(this._ownerDocument, target, data);
  };
  core.Document.prototype.createTextNode = function (data) {
    if (arguments.length < 1) {
      throw new TypeError("Not enough arguments to Document.prototype.createTextNode");
    }
    data = String(data);
    return new core.Text(this, data);
  };
  core.Document.prototype.createComment = function (data) {
    if (arguments.length < 1) {
      throw new TypeError("Not enough arguments to Document.prototype.createComment");
    }
    data = String(data);
    return new core.Comment(this, data);
  };
  core.Document.prototype.createElement = function (localName) {
    if (arguments.length < 1) {
      throw new TypeError("Not enough arguments to Document.prototype.createElement");
    }
    localName = String(localName);
    validateName(localName);
    if (this._parsingMode === "html") {
      localName = localName.toLowerCase();
    }
    const element = this._createElementWithCorrectElementInterface(localName, "http://www.w3.org/1999/xhtml");
    element._namespaceURI = "http://www.w3.org/1999/xhtml";
    element._localName = localName;
    element._ownerDocument = this;
    return element;
  };
  core.Document.prototype.createElementNS = function (namespace, qualifiedName) {
    if (arguments.length < 2) {
      throw new TypeError("Not enough arguments to Document.prototype.createElementNS");
    }
    namespace = namespace !== null ? String(namespace) : namespace;
    qualifiedName = String(qualifiedName);
    const extracted = validateAndExtract(namespace, qualifiedName);
    const element = this._createElementWithCorrectElementInterface(extracted.localName, extracted.namespace);
    element._namespaceURI = extracted.namespace;
    element._prefix = extracted.prefix;
    element._localName = extracted.localName;
    element._ownerDocument = this;
    return element;
  };
  core.Document.prototype.createDocumentFragment = function () {
    return new core.DocumentFragment(this);
  };
  core.Document.prototype.importNode = function (node, deep) {
    if (arguments.length < 1) {
      throw new TypeError("Not enough arguments to Document.prototype.createElement");
    }
    if (!("_ownerDocument" in node)) {
      throw new TypeError("First argument to importNode must be a Node");
    }
    deep = Boolean(deep);
    if (node.nodeType === NODE_TYPE.DOCUMENT_NODE) {
      throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Cannot import a document node");
    }
    return clone(core, node, this, deep);
  };
  core.Document.prototype.getElementsByClassName = memoizeQuery(function getElementsByClassName(classNames) {
    if (arguments.length < 1) {
      throw new TypeError("Not enough arguments to Document.prototype.getElementsByClassName");
    }
    classNames = String(classNames);
    return listOfElementsWithClassNames(classNames, this);
  });
  // https://html.spec.whatwg.org/multipage/dom.html#dom-document-cookie
  defineGetter(core.Document.prototype, "cookie", function () {
    return this._cookieJar.getCookieStringSync(this._URL, { http: false });
  });
  defineSetter(core.Document.prototype, "cookie", function (cookieStr) {
    cookieStr = String(cookieStr);
    this._cookieJar.setCookieSync(cookieStr, this._URL, {
      http: false,
      ignoreError: true
    });
  });
};