text: "use strict";
  var validateNames = require("./helpers/validate-names");
  
  module.exports = function (core) {
    core.DOMImplementation.prototype.hasFeature = function () {
      return true;
    };
  
    core.DOMImplementation.prototype.createDocumentType = function (qualifiedName, publicId, systemId) {
      qualifiedName = String(qualifiedName);
      publicId = String(publicId);
      systemId = String(systemId);
  
      validateNames.qname(qualifiedName, core);
  
      return new core.DocumentType(this._ownerDocument, qualifiedName, publicId, systemId);
    };
  
    core.DOMImplementation.prototype.createDocument = function (namespace, qualifiedName, doctype) {
      namespace = namespace !== null ? String(namespace) : namespace;
      qualifiedName = qualifiedName === null ? "" : String(qualifiedName);
      if (doctype === undefined) {
        doctype = null;
      }
  
      var document = new core.Document({ parsingMode: "xml" });
  
      var element = null;
      if (qualifiedName !== "") {
        element = document.createElementNS(namespace, qualifiedName);
      }
  
      if (doctype !== null) {
        document.appendChild(doctype);
      }
  
      if (element !== null) {
        document.appendChild(element);
      }
  
      return document;
    };
  
    core.DOMImplementation.prototype.createHTMLDocument = function (title) {
      // Let doc be a new document that is an HTML document.
      // Set doc's content type to "text/html".
      var document = new core.HTMLDocument({ parsingMode: "html" });
  
      // Create a doctype, with "html" as its name and with its node document set
      // to doc. Append the newly created node to doc.
      var doctype = this.createDocumentType("html", "", "");
      document.appendChild(doctype);
  
      // Create an html element in the HTML namespace, and append it to doc.
      var htmlElement = document.createElementNS("http://www.w3.org/1999/xhtml", "html");
      document.appendChild(htmlElement);
  
      // Create a head element in the HTML namespace, and append it to the html
      // element created in the previous step.
      var headElement = document.createElement("head");
      htmlElement.appendChild(headElement);
  
      // If the title argument is not omitted:
      if (title !== undefined) {
        // Create a title element in the HTML namespace, and append it to the head
        // element created in the previous step.
        var titleElement = document.createElement("title");
        headElement.appendChild(titleElement);
  
        // Create a Text node, set its data to title (which could be the empty
        // string), and append it to the title element created in the previous step.
        titleElement.appendChild(document.createTextNode(title));
      }
  
      // Create a body element in the HTML namespace, and append it to the html
      // element created in the earlier step.
      htmlElement.appendChild(document.createElement("body"));
  
      // doc's origin is an alias to the origin of the context object's associated
      // document, and doc's effective script origin is an alias to the effective
      // script origin of the context object's associated document.
  
      return document;
    };
  };
  