Changeset 437 for trunk/WebCore/dom/XMLTokenizer.cpp
- Timestamp:
- 08/15/08 13:25:16 (5 months ago)
- Files:
-
- trunk/WebCore/dom/XMLTokenizer.cpp (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/WebCore/dom/XMLTokenizer.cpp
r396 r437 43 43 #include "HTMLTokenizer.h" 44 44 #include "ScriptController.h" 45 #include "ScriptElement.h" 45 46 #include "ProcessingInstruction.h" 46 47 #include "ResourceError.h" … … 66 67 #if ENABLE(SVG) 67 68 #include "SVGNames.h" 69 #include "SVGScriptElement.h" 68 70 #include "SVGStyleElement.h" 69 #include "XLinkNames.h"70 71 #endif 71 72 … … 75 76 76 77 using namespace EventNames; 77 using namespace HTMLNames;78 78 79 79 const int maxErrors = 25; … … 543 543 544 544 // -------------------------------- 545 546 inline bool isScriptElement(Element* element) 547 { 548 return element->hasTagName(HTMLNames::scriptTag) 549 #if ENABLE(SVG) 550 || element->hasTagName(SVGNames::scriptTag) 551 #endif 552 ; 553 } 554 555 inline ScriptElement* castToScriptElement(Element* element) 556 { 557 ASSERT(isScriptElement(element)); 558 559 if (element->hasTagName(HTMLNames::scriptTag)) 560 return static_cast<HTMLScriptElement*>(element); 561 562 #if ENABLE(SVG) 563 if (element->hasTagName(SVGNames::scriptTag)) 564 return static_cast<SVGScriptElement*>(element); 565 #endif 566 567 ASSERT_NOT_REACHED(); 568 return 0; 569 } 545 570 546 571 XMLTokenizer::XMLTokenizer(Document* _doc, FrameView* _view) … … 751 776 return false; 752 777 } 778 779 static void eventuallyMarkAsParserCreated(Element* element) 780 { 781 if (element->hasTagName(HTMLNames::scriptTag)) 782 static_cast<HTMLScriptElement*>(element)->setCreatedByParser(true); 783 #if ENABLE(SVG) 784 else if (element->hasTagName(SVGNames::scriptTag)) 785 static_cast<SVGScriptElement*>(element)->setCreatedByParser(true); 786 #endif 787 else if (element->hasTagName(HTMLNames::styleTag)) 788 static_cast<HTMLStyleElement*>(element)->setCreatedByParser(true); 789 #if ENABLE(SVG) 790 else if (element->hasTagName(SVGNames::styleTag)) 791 static_cast<SVGStyleElement*>(element)->setCreatedByParser(true); 792 #endif 793 else if (element->hasTagName(HTMLNames::linkTag)) 794 static_cast<HTMLLinkElement*>(element)->setCreatedByParser(true); 795 } 796 753 797 #ifndef USE_QXMLSTREAM 754 798 static inline String toString(const xmlChar* str, unsigned len) … … 866 910 867 911 newElement->beginParsingChildren(); 868 869 if (newElement->hasTagName(scriptTag)) 870 static_cast<HTMLScriptElement*>(newElement.get())->setCreatedByParser(true); 871 else if (newElement->hasTagName(HTMLNames::styleTag)) 872 static_cast<HTMLStyleElement*>(newElement.get())->setCreatedByParser(true); 873 #if ENABLE(SVG) 874 else if (newElement->hasTagName(SVGNames::styleTag)) 875 static_cast<SVGStyleElement*>(newElement.get())->setCreatedByParser(true); 876 #endif 877 else if (newElement->hasTagName(HTMLNames::linkTag)) 878 static_cast<HTMLLinkElement*>(newElement.get())->setCreatedByParser(true); 879 880 if (newElement->hasTagName(HTMLNames::scriptTag) 881 #if ENABLE(SVG) 882 || newElement->hasTagName(SVGNames::scriptTag) 883 #endif 884 ) 912 eventuallyMarkAsParserCreated(newElement.get()); 913 914 if (isScriptElement(newElement.get())) 885 915 m_scriptStartLine = lineNumber(); 886 916 887 917 if (!m_currentNode->addChild(newElement.get())) { 888 918 stopParsing(); 889 919 return; 890 920 } 891 921 892 922 setCurrentNode(newElement.get()); 893 923 if (m_view && !newElement->attached()) … … 912 942 913 943 // don't load external scripts for standalone documents (for now) 914 if (n->isElementNode() && m_view && (static_cast<Element*>(n)->hasTagName(scriptTag) 915 #if ENABLE(SVG) 916 || static_cast<Element*>(n)->hasTagName(SVGNames::scriptTag) 917 #endif 918 )) { 919 920 944 if (n->isElementNode() && m_view && isScriptElement(static_cast<Element*>(n))) { 921 945 ASSERT(!m_pendingScript); 922 923 946 m_requestingScript = true; 924 925 Element* scriptElement = static_cast<Element*>(n); 926 String scriptHref; 927 928 if (static_cast<Element*>(n)->hasTagName(scriptTag)) 929 scriptHref = scriptElement->getAttribute(srcAttr); 930 #if ENABLE(SVG) 931 else if (static_cast<Element*>(n)->hasTagName(SVGNames::scriptTag)) 932 scriptHref = scriptElement->getAttribute(XLinkNames::hrefAttr); 933 #endif 934 947 948 Element* element = static_cast<Element*>(n); 949 ScriptElement* scriptElement = castToScriptElement(element); 950 951 String scriptHref = scriptElement->sourceAttributeValue(); 935 952 if (!scriptHref.isEmpty()) { 936 953 // we have a src attribute 937 const AtomicString& charset = scriptElement->getAttribute(charsetAttr);938 if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, charset))) {939 m_scriptElement = scriptElement;954 String scriptCharset = scriptElement->charsetAttributeValue(); 955 if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) { 956 m_scriptElement = element; 940 957 m_pendingScript->addClient(this); 941 958 942 959 // m_pendingScript will be 0 if script was already loaded and ref() executed it 943 960 if (m_pendingScript) … … 947 964 948 965 } else { 949 String scriptCode = ""; 950 for (Node* child = scriptElement->firstChild(); child; child = child->nextSibling()) { 951 if (child->isTextNode() || child->nodeType() == Node::CDATA_SECTION_NODE) 952 scriptCode += static_cast<CharacterData*>(child)->data(); 953 } 966 String scriptCode = scriptElement->scriptContent(); 954 967 m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine, scriptCode); 955 968 } 956 969 957 970 m_requestingScript = false; 958 971 } … … 1432 1445 { 1433 1446 ExceptionCode ec = 0; 1434 RefPtr<Element> reportElement = doc->createElementNS( xhtmlNamespaceURI, "parsererror", ec);1435 reportElement->setAttribute( styleAttr, "display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black");1436 1437 RefPtr<Element> h3 = doc->createElementNS( xhtmlNamespaceURI, "h3", ec);1447 RefPtr<Element> reportElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "parsererror", ec); 1448 reportElement->setAttribute(HTMLNames::styleAttr, "display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"); 1449 1450 RefPtr<Element> h3 = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "h3", ec); 1438 1451 reportElement->appendChild(h3.get(), ec); 1439 1452 h3->appendChild(doc->createTextNode("This page contains the following errors:"), ec); 1440 1453 1441 RefPtr<Element> fixed = doc->createElementNS( xhtmlNamespaceURI, "div", ec);1454 RefPtr<Element> fixed = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "div", ec); 1442 1455 reportElement->appendChild(fixed.get(), ec); 1443 fixed->setAttribute( styleAttr, "font-family:monospace;font-size:12px");1456 fixed->setAttribute(HTMLNames::styleAttr, "font-family:monospace;font-size:12px"); 1444 1457 fixed->appendChild(doc->createTextNode(errorMessages), ec); 1445 1458 1446 h3 = doc->createElementNS( xhtmlNamespaceURI, "h3", ec);1459 h3 = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "h3", ec); 1447 1460 reportElement->appendChild(h3.get(), ec); 1448 1461 h3->appendChild(doc->createTextNode("Below is a rendering of the page up to the first error."), ec); … … 1466 1479 Node* documentElement = doc->documentElement(); 1467 1480 if (!documentElement) { 1468 RefPtr<Node> rootElement = doc->createElementNS( xhtmlNamespaceURI, "html", ec);1481 RefPtr<Node> rootElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "html", ec); 1469 1482 doc->appendChild(rootElement, ec); 1470 RefPtr<Node> body = doc->createElementNS( xhtmlNamespaceURI, "body", ec);1483 RefPtr<Node> body = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "body", ec); 1471 1484 rootElement->appendChild(body, ec); 1472 1485 documentElement = body.get(); … … 1477 1490 // wrap the erroneous SVG document in an xhtml document and render 1478 1491 // the combined document with error messages. 1479 RefPtr<Node> rootElement = doc->createElementNS( xhtmlNamespaceURI, "html", ec);1480 RefPtr<Node> body = doc->createElementNS( xhtmlNamespaceURI, "body", ec);1492 RefPtr<Node> rootElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "html", ec); 1493 RefPtr<Node> body = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "body", ec); 1481 1494 rootElement->appendChild(body, ec); 1482 1495 body->appendChild(documentElement, ec); … … 1490 1503 #if ENABLE(XSLT) 1491 1504 if (doc->transformSourceDocument()) { 1492 RefPtr<Element> par = doc->createElementNS( xhtmlNamespaceURI, "p", ec);1505 RefPtr<Element> par = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "p", ec); 1493 1506 reportElement->appendChild(par, ec); 1494 par->setAttribute( styleAttr, "white-space: normal");1507 par->setAttribute(HTMLNames::styleAttr, "white-space: normal"); 1495 1508 par->appendChild(doc->createTextNode("This document was created as the result of an XSL transformation. The line and column numbers given are from the transformed result."), ec); 1496 1509 } … … 1913 1926 } 1914 1927 1915 if (newElement->hasTagName(scriptTag)) 1916 static_cast<HTMLScriptElement*>(newElement.get())->setCreatedByParser(true); 1917 1918 if (newElement->hasTagName(HTMLNames::scriptTag) 1919 #if ENABLE(SVG) 1920 || newElement->hasTagName(SVGNames::scriptTag) 1921 #endif 1922 ) 1928 eventuallyMarkAsParserCreated(newElement.get()); 1929 1930 if (isScriptElement(newElement.get())) 1923 1931 m_scriptStartLine = lineNumber(); 1924 1932 … … 1938 1946 1939 1947 Node* n = m_currentNode; 1940 1941 // skip end of dummy element1942 // if (m_parsingFragment & n->nodeType() == Node::DOCUMENT_FRAGMENT_NODE)1943 // return;1944 1945 1948 RefPtr<Node> parent = n->parentNode(); 1946 1949 n->finishParsingChildren(); 1947 1950 1948 1951 // don't load external scripts for standalone documents (for now) 1949 if (n->isElementNode() && m_view && (static_cast<Element*>(n)->hasTagName(scriptTag) 1950 #if ENABLE(SVG) 1951 || static_cast<Element*>(n)->hasTagName(SVGNames::scriptTag) 1952 #endif 1953 )) { 1954 1955 1952 if (n->isElementNode() && m_view && isScriptElement(static_cast<Element*>(n))) { 1956 1953 ASSERT(!m_pendingScript); 1957 1958 1954 m_requestingScript = true; 1959 1955 1960 Element* scriptElement = static_cast<Element*>(n); 1961 String scriptHref; 1962 1963 if (static_cast<Element*>(n)->hasTagName(scriptTag)) 1964 scriptHref = scriptElement->getAttribute(srcAttr); 1965 #if ENABLE(SVG) 1966 else if (static_cast<Element*>(n)->hasTagName(SVGNames::scriptTag)) 1967 scriptHref = scriptElement->getAttribute(XLinkNames::hrefAttr); 1968 #endif 1956 Element* element = static_cast<Element*>(n); 1957 ScriptElement* scriptElement = castToScriptElement(element); 1958 1959 String scriptHref = scriptElement->sourceAttributeValue(); 1969 1960 if (!scriptHref.isEmpty()) { 1970 1961 // we have a src attribute 1971 const AtomicString& charset = scriptElement->getAttribute(charsetAttr);1972 if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, charset))) {1973 m_scriptElement = scriptElement;1962 String scriptCharset = scriptElement->charsetAttributeValue(); 1963 if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) { 1964 m_scriptElement = element; 1974 1965 m_pendingScript->addClient(this); 1975 1966 … … 1981 1972 1982 1973 } else { 1983 String scriptCode = ""; 1984 for (Node* child = scriptElement->firstChild(); child; child = child->nextSibling()) { 1985 if (child->isTextNode() || child->nodeType() == Node::CDATA_SECTION_NODE) 1986 scriptCode += static_cast<CharacterData*>(child)->data(); 1987 } 1974 String scriptCode = scriptElement->scriptContent(); 1988 1975 m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine, scriptCode); 1989 1976 } 1977 1990 1978 m_requestingScript = false; 1991 1979 }
