void HTMLDocument::determineParseMode() { // FIXME: It's terrible that this code runs separately and isn't just built in to the // HTML tokenizer/parser. // This code more or less mimics Mozilla's implementation (specifically the // doctype parsing implemented by David Baron in Mozilla's nsParser.cpp). // // There are three possible parse modes: // COMPAT - quirks mode emulates WinIE and NS4. CSS parsing is also relaxed in this mode, e.g., unit types can // be omitted from numbers. // ALMOST STRICT - This mode is identical to strict mode except for its treatment of line-height in the inline box model. For // now (until the inline box model is re-written), this mode is identical to STANDARDS mode. // STRICT - no quirks apply. Web pages will obey the specifications to the letter. bool wasInCompatMode = inCompatMode(); DocumentType* docType = doctype(); if (!docType || !equalIgnoringCase(docType->name(), "html")) // No doctype found at all or the doctype is not HTML. Default to quirks mode and Html4. setParseMode(Compat); else if (!doctype()->systemId().isEmpty() && equalIgnoringCase(docType->systemId(), "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd")) // Assume quirks mode for this particular system ID. In the HTML5 spec, this is the only // system identifier that is examined. setParseMode(Compat); else if (docType->publicId().isEmpty()) // A doctype without a public ID means use strict mode. setParseMode(Strict); else { // We have to check a list of public IDs to see what we // should do. String lowerPubID = docType->publicId().lower(); CString pubIDStr = lowerPubID.latin1(); // Look up the entry in our gperf-generated table. const PubIDInfo* doctypeEntry = findDoctypeEntry(pubIDStr.data(), pubIDStr.length()); if (!doctypeEntry) // The DOCTYPE is not in the list. Assume strict mode. setParseMode(Strict); else { switch (docType->systemId().isEmpty() ? doctypeEntry->mode_if_no_sysid : doctypeEntry->mode_if_sysid) { case PubIDInfo::eQuirks3: case PubIDInfo::eQuirks: setParseMode(Compat); break; case PubIDInfo::eAlmostStandards: setParseMode(AlmostStrict); break; default: ASSERT(false); } } } if (inCompatMode() != wasInCompatMode) { clearPageUserSheet(); clearPageGroupUserSheets(); updateStyleSelector(); } }
void MarkupAccumulator::appendDocumentType(StringBuilder& result, const DocumentType& n) { if (n.name().isEmpty()) return; result.appendLiteral("<!DOCTYPE "); result.append(n.name()); if (!n.publicId().isEmpty()) { result.appendLiteral(" PUBLIC \""); result.append(n.publicId()); result.append('"'); if (!n.systemId().isEmpty()) { result.appendLiteral(" \""); result.append(n.systemId()); result.append('"'); } } else if (!n.systemId().isEmpty()) { result.appendLiteral(" SYSTEM \""); result.append(n.systemId()); result.append('"'); } if (!n.internalSubset().isEmpty()) { result.appendLiteral(" ["); result.append(n.internalSubset()); result.append(']'); } result.append('>'); }
JSValue jsDocumentTypeSystemId(ExecState* exec, const Identifier&, const PropertySlot& slot) { JSDocumentType* castedThis = static_cast<JSDocumentType*>(asObject(slot.slotBase())); UNUSED_PARAM(exec); DocumentType* imp = static_cast<DocumentType*>(castedThis->impl()); return jsStringOrNull(exec, imp->systemId()); }
JSValue* JSDocumentType::getValueProperty(ExecState* exec, int token) const { switch (token) { case NameAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return jsString(exec, imp->name()); } case EntitiesAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return toJS(exec, WTF::getPtr(imp->entities())); } case NotationsAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return toJS(exec, WTF::getPtr(imp->notations())); } case PublicIdAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return jsStringOrNull(exec, imp->publicId()); } case SystemIdAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return jsStringOrNull(exec, imp->systemId()); } case InternalSubsetAttrNum: { DocumentType* imp = static_cast<DocumentType*>(impl()); return jsStringOrNull(exec, imp->internalSubset()); } case ConstructorAttrNum: return getConstructor(exec); } return 0; }
JSValue jsDocumentTypeSystemId(ExecState* exec, JSValue slotBase, const Identifier&) { JSDocumentType* castedThis = static_cast<JSDocumentType*>(asObject(slotBase)); UNUSED_PARAM(exec); DocumentType* imp = static_cast<DocumentType*>(castedThis->impl()); JSValue result = jsStringOrNull(exec, imp->systemId()); return result; }
void HTMLDocument::setCompatibilityModeFromDoctype() { // There are three possible compatibility modes: // Quirks - quirks mode emulates WinIE and NS4. CSS parsing is also relaxed in this mode, e.g., unit types can // be omitted from numbers. // Limited Quirks - This mode is identical to no-quirks mode except for its treatment of line-height in the inline box model. // No Quirks - no quirks apply. Web pages will obey the specifications to the letter. DocumentType* docType = doctype(); if (!docType) return; // Check for Quirks Mode. const String& publicId = docType->publicId(); if (docType->name() != "html" || publicId.startsWith("+//Silmaril//dtd html Pro v0r11 19970101//", false) || publicId.startsWith("-//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//", false) || publicId.startsWith("-//AS//DTD HTML 3.0 asWedit + extensions//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0 Level 1//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0 Level 2//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0 Strict Level 1//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0 Strict Level 2//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0 Strict//", false) || publicId.startsWith("-//IETF//DTD HTML 2.0//", false) || publicId.startsWith("-//IETF//DTD HTML 2.1E//", false) || publicId.startsWith("-//IETF//DTD HTML 3.0//", false) || publicId.startsWith("-//IETF//DTD HTML 3.2 Final//", false) || publicId.startsWith("-//IETF//DTD HTML 3.2//", false) || publicId.startsWith("-//IETF//DTD HTML 3//", false) || publicId.startsWith("-//IETF//DTD HTML Level 0//", false) || publicId.startsWith("-//IETF//DTD HTML Level 1//", false) || publicId.startsWith("-//IETF//DTD HTML Level 2//", false) || publicId.startsWith("-//IETF//DTD HTML Level 3//", false) || publicId.startsWith("-//IETF//DTD HTML Strict Level 0//", false) || publicId.startsWith("-//IETF//DTD HTML Strict Level 1//", false) || publicId.startsWith("-//IETF//DTD HTML Strict Level 2//", false) || publicId.startsWith("-//IETF//DTD HTML Strict Level 3//", false) || publicId.startsWith("-//IETF//DTD HTML Strict//", false) || publicId.startsWith("-//IETF//DTD HTML//", false) || publicId.startsWith("-//Metrius//DTD Metrius Presentational//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 2.0 HTML Strict//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 2.0 HTML//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 2.0 Tables//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 3.0 HTML Strict//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 3.0 HTML//", false) || publicId.startsWith("-//Microsoft//DTD Internet Explorer 3.0 Tables//", false) || publicId.startsWith("-//Netscape Comm. Corp.//DTD HTML//", false) || publicId.startsWith("-//Netscape Comm. Corp.//DTD Strict HTML//", false) || publicId.startsWith("-//O'Reilly and Associates//DTD HTML 2.0//", false) || publicId.startsWith("-//O'Reilly and Associates//DTD HTML Extended 1.0//", false) || publicId.startsWith("-//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//", false) || publicId.startsWith("-//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//", false) || publicId.startsWith("-//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//", false) || publicId.startsWith("-//Spyglass//DTD HTML 2.0 Extended//", false) || publicId.startsWith("-//SQ//DTD HTML 2.0 HoTMetaL + extensions//", false) || publicId.startsWith("-//Sun Microsystems Corp.//DTD HotJava HTML//", false) || publicId.startsWith("-//Sun Microsystems Corp.//DTD HotJava Strict HTML//", false) || publicId.startsWith("-//W3C//DTD HTML 3 1995-03-24//", false) || publicId.startsWith("-//W3C//DTD HTML 3.2 Draft//", false) || publicId.startsWith("-//W3C//DTD HTML 3.2 Final//", false) || publicId.startsWith("-//W3C//DTD HTML 3.2//", false) || publicId.startsWith("-//W3C//DTD HTML 3.2S Draft//", false) || publicId.startsWith("-//W3C//DTD HTML 4.0 Frameset//", false) || publicId.startsWith("-//W3C//DTD HTML 4.0 Transitional//", false) || publicId.startsWith("-//W3C//DTD HTML Experimental 19960712//", false) || publicId.startsWith("-//W3C//DTD HTML Experimental 970421//", false) || publicId.startsWith("-//W3C//DTD W3 HTML//", false) || publicId.startsWith("-//W3O//DTD W3 HTML 3.0//", false) || equalIgnoringCase(publicId, "-//W3O//DTD W3 HTML Strict 3.0//EN//") || publicId.startsWith("-//WebTechs//DTD Mozilla HTML 2.0//", false) || publicId.startsWith("-//WebTechs//DTD Mozilla HTML//", false) || equalIgnoringCase(publicId, "-/W3C/DTD HTML 4.0 Transitional/EN") || equalIgnoringCase(publicId, "HTML") || equalIgnoringCase(docType->systemId(), "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") || (docType->systemId().isEmpty() && publicId.startsWith("-//W3C//DTD HTML 4.01 Frameset//", false)) || (docType->systemId().isEmpty() && publicId.startsWith("-//W3C//DTD HTML 4.01 Transitional//", false))) { setCompatibilityMode(QuirksMode); return; } // Check for Limited Quirks Mode. if (publicId.startsWith("-//W3C//DTD XHTML 1.0 Frameset//", false) || publicId.startsWith("-//W3C//DTD XHTML 1.0 Transitional//", false) || (!docType->systemId().isEmpty() && publicId.startsWith("-//W3C//DTD HTML 4.01 Frameset//", false)) || (!docType->systemId().isEmpty() && publicId.startsWith("-//W3C//DTD HTML 4.01 Transitional//", false))) { setCompatibilityMode(LimitedQuirksMode); return; } // Otherwise we are No Quirks Mode. setCompatibilityMode(NoQuirksMode); return; }