summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLViewSourceDocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/html/HTMLViewSourceDocument.cpp')
-rw-r--r--Source/WebCore/html/HTMLViewSourceDocument.cpp294
1 files changed, 0 insertions, 294 deletions
diff --git a/Source/WebCore/html/HTMLViewSourceDocument.cpp b/Source/WebCore/html/HTMLViewSourceDocument.cpp
deleted file mode 100644
index 5b705d9ce..000000000
--- a/Source/WebCore/html/HTMLViewSourceDocument.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2006, 2008, 2009, 2010 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * 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.
- */
-
-#include "config.h"
-#include "HTMLViewSourceDocument.h"
-
-#include "DOMImplementation.h"
-#include "DocumentStyleSheetCollection.h"
-#include "HTMLAnchorElement.h"
-#include "HTMLBRElement.h"
-#include "HTMLBaseElement.h"
-#include "HTMLBodyElement.h"
-#include "HTMLDivElement.h"
-#include "HTMLHtmlElement.h"
-#include "HTMLTableCellElement.h"
-#include "HTMLTableElement.h"
-#include "HTMLTableRowElement.h"
-#include "HTMLTableSectionElement.h"
-#include "Text.h"
-#include "TextViewSourceParser.h"
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-HTMLViewSourceDocument::HTMLViewSourceDocument(Frame* frame, const URL& url, const String& mimeType)
- : HTMLDocument(frame, url)
- , m_type(mimeType)
-{
- styleSheetCollection().setUsesBeforeAfterRulesOverride(true);
- setIsViewSource(true);
-
- setCompatibilityMode(QuirksMode);
- lockCompatibilityMode();
-}
-
-PassRefPtr<DocumentParser> HTMLViewSourceDocument::createParser()
-{
- if (m_type == "text/html" || m_type == "application/xhtml+xml" || m_type == "image/svg+xml" || DOMImplementation::isXMLMIMEType(m_type))
- return HTMLViewSourceParser::create(*this);
-
- return TextViewSourceParser::create(*this);
-}
-
-void HTMLViewSourceDocument::createContainingTable()
-{
- RefPtr<HTMLHtmlElement> html = HTMLHtmlElement::create(*this);
- parserAppendChild(html);
- RefPtr<HTMLBodyElement> body = HTMLBodyElement::create(*this);
- html->parserAppendChild(body);
- // Create a line gutter div that can be used to make sure the gutter extends down the height of the whole
- // document.
- RefPtr<HTMLDivElement> div = HTMLDivElement::create(*this);
- div->setAttribute(classAttr, "webkit-line-gutter-backdrop");
- body->parserAppendChild(div);
-
- RefPtr<HTMLTableElement> table = HTMLTableElement::create(*this);
- body->parserAppendChild(table);
- m_tbody = HTMLTableSectionElement::create(tbodyTag, *this);
- table->parserAppendChild(m_tbody);
- m_current = m_tbody;
-}
-
-void HTMLViewSourceDocument::addSource(const String& source, HTMLToken& token)
-{
- if (!m_current)
- createContainingTable();
-
- switch (token.type()) {
- case HTMLToken::Uninitialized:
- ASSERT_NOT_REACHED();
- break;
- case HTMLToken::DOCTYPE:
- processDoctypeToken(source, token);
- break;
- case HTMLToken::EndOfFile:
- if (!m_tbody->hasChildNodes())
- addLine(String());
- break;
- case HTMLToken::StartTag:
- case HTMLToken::EndTag:
- processTagToken(source, token);
- break;
- case HTMLToken::Comment:
- processCommentToken(source, token);
- break;
- case HTMLToken::Character:
- processCharacterToken(source, token);
- break;
- }
-}
-
-void HTMLViewSourceDocument::processDoctypeToken(const String& source, HTMLToken&)
-{
- if (!m_current)
- createContainingTable();
- m_current = addSpanWithClassName("webkit-html-doctype");
- addText(source, "webkit-html-doctype");
- m_current = m_td;
-}
-
-void HTMLViewSourceDocument::processTagToken(const String& source, HTMLToken& token)
-{
- m_current = addSpanWithClassName("webkit-html-tag");
-
- AtomicString tagName(token.name());
-
- unsigned index = 0;
- HTMLToken::AttributeList::const_iterator iter = token.attributes().begin();
- while (index < source.length()) {
- if (iter == token.attributes().end()) {
- // We want to show the remaining characters in the token.
- index = addRange(source, index, source.length(), "");
- ASSERT(index == source.length());
- break;
- }
-
- AtomicString name(iter->name);
- String value = StringImpl::create8BitIfPossible(iter->value);
-
- index = addRange(source, index, iter->nameRange.start - token.startIndex(), "");
- index = addRange(source, index, iter->nameRange.end - token.startIndex(), "webkit-html-attribute-name");
-
- if (tagName == baseTag && name == hrefAttr)
- m_current = addBase(value);
-
- index = addRange(source, index, iter->valueRange.start - token.startIndex(), "");
-
- bool isLink = name == srcAttr || name == hrefAttr;
- index = addRange(source, index, iter->valueRange.end - token.startIndex(), "webkit-html-attribute-value", isLink, tagName == aTag, value);
-
- ++iter;
- }
- m_current = m_td;
-}
-
-void HTMLViewSourceDocument::processCommentToken(const String& source, HTMLToken&)
-{
- m_current = addSpanWithClassName("webkit-html-comment");
- addText(source, "webkit-html-comment");
- m_current = m_td;
-}
-
-void HTMLViewSourceDocument::processCharacterToken(const String& source, HTMLToken&)
-{
- addText(source, "");
-}
-
-PassRefPtr<Element> HTMLViewSourceDocument::addSpanWithClassName(const AtomicString& className)
-{
- if (m_current == m_tbody) {
- addLine(className);
- return m_current;
- }
-
- RefPtr<HTMLElement> span = HTMLElement::create(spanTag, *this);
- span->setAttribute(classAttr, className);
- m_current->parserAppendChild(span);
- return span.release();
-}
-
-void HTMLViewSourceDocument::addLine(const AtomicString& className)
-{
- // Create a table row.
- RefPtr<HTMLTableRowElement> trow = HTMLTableRowElement::create(*this);
- m_tbody->parserAppendChild(trow);
-
- // Create a cell that will hold the line number (it is generated in the stylesheet using counters).
- RefPtr<HTMLTableCellElement> td = HTMLTableCellElement::create(tdTag, *this);
- td->setAttribute(classAttr, "webkit-line-number");
- trow->parserAppendChild(td);
-
- // Create a second cell for the line contents
- td = HTMLTableCellElement::create(tdTag, *this);
- td->setAttribute(classAttr, "webkit-line-content");
- trow->parserAppendChild(td);
- m_current = m_td = td;
-
-#ifdef DEBUG_LINE_NUMBERS
- RefPtr<Text> lineNumberText = Text::create(*this, String::number(parser()->lineNumber() + 1) + " ");
- td->addChild(lineNumberText);
-#endif
-
- // Open up the needed spans.
- if (!className.isEmpty()) {
- if (className == "webkit-html-attribute-name" || className == "webkit-html-attribute-value")
- m_current = addSpanWithClassName("webkit-html-tag");
- m_current = addSpanWithClassName(className);
- }
-}
-
-void HTMLViewSourceDocument::finishLine()
-{
- if (!m_current->hasChildNodes()) {
- RefPtr<HTMLBRElement> br = HTMLBRElement::create(*this);
- m_current->parserAppendChild(br);
- }
- m_current = m_tbody;
-}
-
-void HTMLViewSourceDocument::addText(const String& text, const AtomicString& className)
-{
- if (text.isEmpty())
- return;
-
- // Add in the content, splitting on newlines.
- Vector<String> lines;
- text.split('\n', true, lines);
- unsigned size = lines.size();
- for (unsigned i = 0; i < size; i++) {
- String substring = lines[i];
- if (m_current == m_tbody)
- addLine(className);
- if (substring.isEmpty()) {
- if (i == size - 1)
- break;
- finishLine();
- continue;
- }
- RefPtr<Text> text = Text::create(*this, substring);
- m_current->parserAppendChild(text);
- if (i < size - 1)
- finishLine();
- }
-}
-
-int HTMLViewSourceDocument::addRange(const String& source, int start, int end, const String& className, bool isLink, bool isAnchor, const String& link)
-{
- ASSERT(start <= end);
- if (start == end)
- return start;
-
- String text = source.substring(start, end - start);
- if (!className.isEmpty()) {
- if (isLink)
- m_current = addLink(link, isAnchor);
- else
- m_current = addSpanWithClassName(className);
- }
- addText(text, className);
- if (!className.isEmpty() && m_current != m_tbody)
- m_current = toElement(m_current->parentNode());
- return end;
-}
-
-PassRefPtr<Element> HTMLViewSourceDocument::addBase(const AtomicString& href)
-{
- RefPtr<HTMLBaseElement> base = HTMLBaseElement::create(baseTag, *this);
- base->setAttribute(hrefAttr, href);
- m_current->parserAppendChild(base);
- return base.release();
-}
-
-PassRefPtr<Element> HTMLViewSourceDocument::addLink(const AtomicString& url, bool isAnchor)
-{
- if (m_current == m_tbody)
- addLine("webkit-html-tag");
-
- // Now create a link for the attribute value instead of a span.
- RefPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::create(*this);
- const char* classValue;
- if (isAnchor)
- classValue = "webkit-html-attribute-value webkit-html-external-link";
- else
- classValue = "webkit-html-attribute-value webkit-html-resource-link";
- anchor->setAttribute(classAttr, classValue);
- anchor->setAttribute(targetAttr, "_blank");
- anchor->setAttribute(hrefAttr, url);
- m_current->parserAppendChild(anchor);
- return anchor.release();
-}
-
-}