diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-23 10:25:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-23 10:25:11 +0200 |
commit | 5ea819f80c6840c492386bfafbffb059c7e2091f (patch) | |
tree | 42ad0b1d82eff090d14278a088ea0f4840a0f938 /Source/WebCore/html | |
parent | 43a42f108af6bcbd91f2672731c3047c26213af1 (diff) |
Imported WebKit commit 20434eb8eb95065803473139d8794e98a7672f75 (http://svn.webkit.org/repository/webkit/trunk@132191)
New snapshot that should fix build with latest qtbase and the QPlastiqueStyle removal
Diffstat (limited to 'Source/WebCore/html')
-rw-r--r-- | Source/WebCore/html/HTMLBaseElement.cpp | 27 | ||||
-rw-r--r-- | Source/WebCore/html/HTMLBaseElement.h | 3 | ||||
-rw-r--r-- | Source/WebCore/html/HTMLBaseElement.idl | 3 | ||||
-rw-r--r-- | Source/WebCore/html/HTMLInputElement.cpp | 6 | ||||
-rw-r--r-- | Source/WebCore/html/HTMLLinkElement.cpp | 5 | ||||
-rw-r--r-- | Source/WebCore/html/parser/HTMLToken.h | 2 | ||||
-rw-r--r-- | Source/WebCore/html/parser/HTMLTokenizer.cpp | 50 | ||||
-rw-r--r-- | Source/WebCore/html/parser/HTMLTokenizer.h | 4 | ||||
-rw-r--r-- | Source/WebCore/html/parser/HTMLTreeBuilder.cpp | 2 | ||||
-rw-r--r-- | Source/WebCore/html/shadow/DateTimeEditElement.cpp | 31 | ||||
-rw-r--r-- | Source/WebCore/html/shadow/HTMLContentElement.cpp | 2 | ||||
-rw-r--r-- | Source/WebCore/html/shadow/HTMLContentElement.h | 3 | ||||
-rw-r--r-- | Source/WebCore/html/shadow/InsertionPoint.cpp | 5 | ||||
-rw-r--r-- | Source/WebCore/html/shadow/InsertionPoint.h | 15 |
14 files changed, 118 insertions, 40 deletions
diff --git a/Source/WebCore/html/HTMLBaseElement.cpp b/Source/WebCore/html/HTMLBaseElement.cpp index 2754717c0..b58035e99 100644 --- a/Source/WebCore/html/HTMLBaseElement.cpp +++ b/Source/WebCore/html/HTMLBaseElement.cpp @@ -26,6 +26,8 @@ #include "Attribute.h" #include "Document.h" #include "HTMLNames.h" +#include "HTMLParserIdioms.h" +#include "TextResourceDecoder.h" namespace WebCore { @@ -75,4 +77,29 @@ String HTMLBaseElement::target() const return fastGetAttribute(targetAttr); } +KURL HTMLBaseElement::href() const +{ + // This does not use the getURLAttribute function because that will resolve relative to the document's base URL; + // base elements like this one can be used to set that base URL. Thus we need to resolve relative to the document's + // URL and ignore the base URL. + + const AtomicString& attributeValue = fastGetAttribute(hrefAttr); + if (attributeValue.isNull()) + return document()->url(); + + KURL url = !document()->decoder() ? + KURL(document()->url(), stripLeadingAndTrailingHTMLSpaces(attributeValue)) : + KURL(document()->url(), stripLeadingAndTrailingHTMLSpaces(attributeValue), document()->decoder()->encoding()); + + if (!url.isValid()) + return KURL(); + + return url; +} + +void HTMLBaseElement::setHref(const AtomicString& value) +{ + setAttribute(hrefAttr, value); +} + } diff --git a/Source/WebCore/html/HTMLBaseElement.h b/Source/WebCore/html/HTMLBaseElement.h index bb74fb730..e6b0a41a2 100644 --- a/Source/WebCore/html/HTMLBaseElement.h +++ b/Source/WebCore/html/HTMLBaseElement.h @@ -31,6 +31,9 @@ class HTMLBaseElement : public HTMLElement { public: static PassRefPtr<HTMLBaseElement> create(const QualifiedName&, Document*); + KURL href() const; + void setHref(const AtomicString&); + private: HTMLBaseElement(const QualifiedName&, Document*); diff --git a/Source/WebCore/html/HTMLBaseElement.idl b/Source/WebCore/html/HTMLBaseElement.idl index 0f63ddd19..4d9d39f0f 100644 --- a/Source/WebCore/html/HTMLBaseElement.idl +++ b/Source/WebCore/html/HTMLBaseElement.idl @@ -18,7 +18,6 @@ */ interface HTMLBaseElement : HTMLElement { - [Reflect, URL] attribute DOMString href; + [TreatNullAs=NullString] attribute DOMString href; [Reflect] attribute DOMString target; }; - diff --git a/Source/WebCore/html/HTMLInputElement.cpp b/Source/WebCore/html/HTMLInputElement.cpp index c4a8bf675..4f21a0f43 100644 --- a/Source/WebCore/html/HTMLInputElement.cpp +++ b/Source/WebCore/html/HTMLInputElement.cpp @@ -515,11 +515,11 @@ void HTMLInputElement::updateType() if (didRespectHeightAndWidth != m_inputType->shouldRespectHeightAndWidthAttributes()) { ASSERT(attributeData()); if (Attribute* height = getAttributeItem(heightAttr)) - attributeChanged(*height); + attributeChanged(heightAttr, height->value()); if (Attribute* width = getAttributeItem(widthAttr)) - attributeChanged(*width); + attributeChanged(widthAttr, width->value()); if (Attribute* align = getAttributeItem(alignAttr)) - attributeChanged(*align); + attributeChanged(alignAttr, align->value()); } if (wasAttached) { diff --git a/Source/WebCore/html/HTMLLinkElement.cpp b/Source/WebCore/html/HTMLLinkElement.cpp index fdc7a5cce..7c96b19b1 100644 --- a/Source/WebCore/html/HTMLLinkElement.cpp +++ b/Source/WebCore/html/HTMLLinkElement.cpp @@ -29,6 +29,7 @@ #include "CachedCSSStyleSheet.h" #include "CachedResource.h" #include "CachedResourceLoader.h" +#include "CachedResourceRequest.h" #include "Document.h" #include "DocumentStyleSheetCollection.h" #include "EventSender.h" @@ -220,8 +221,8 @@ void HTMLLinkElement::process() // Load stylesheets that are not needed for the rendering immediately with low priority. ResourceLoadPriority priority = blocking ? ResourceLoadPriorityUnresolved : ResourceLoadPriorityVeryLow; - ResourceRequest request(document()->completeURL(m_url)); - m_cachedSheet = document()->cachedResourceLoader()->requestCSSStyleSheet(request, charset, priority); + CachedResourceRequest request(ResourceRequest(document()->completeURL(m_url)), charset, priority); + m_cachedSheet = document()->cachedResourceLoader()->requestCSSStyleSheet(request); if (m_cachedSheet) m_cachedSheet->addClient(this); diff --git a/Source/WebCore/html/parser/HTMLToken.h b/Source/WebCore/html/parser/HTMLToken.h index 3099c785c..e2e93a777 100644 --- a/Source/WebCore/html/parser/HTMLToken.h +++ b/Source/WebCore/html/parser/HTMLToken.h @@ -63,7 +63,7 @@ public: ASSERT(m_type == HTMLTokenTypes::StartTag || m_type == HTMLTokenTypes::EndTag || m_type == HTMLTokenTypes::DOCTYPE); MarkupTokenBase<HTMLTokenTypes, HTMLTokenTypes::DoctypeData>::appendToName(character); } - + const DataVector& name() const { ASSERT(m_type == HTMLTokenTypes::StartTag || m_type == HTMLTokenTypes::EndTag || m_type == HTMLTokenTypes::DOCTYPE); diff --git a/Source/WebCore/html/parser/HTMLTokenizer.cpp b/Source/WebCore/html/parser/HTMLTokenizer.cpp index 90bc39fad..4ffd319c0 100644 --- a/Source/WebCore/html/parser/HTMLTokenizer.cpp +++ b/Source/WebCore/html/parser/HTMLTokenizer.cpp @@ -316,10 +316,10 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(EndTagOpenState) { if (isASCIIUpper(cc)) { - m_token->beginEndTag(toLowerCase(cc)); + m_token->beginEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(TagNameState); } else if (isASCIILower(cc)) { - m_token->beginEndTag(cc); + m_token->beginEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(TagNameState); } else if (cc == '>') { parseError(); @@ -373,11 +373,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(RCDATAEndTagOpenState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(RCDATAEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(RCDATAEndTagNameState); } else { bufferCharacter('<'); @@ -390,11 +390,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(RCDATAEndTagNameState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(RCDATAEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(RCDATAEndTagNameState); } else { if (isTokenizerWhitespace(cc)) { @@ -438,11 +438,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(RAWTEXTEndTagOpenState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(RAWTEXTEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(RAWTEXTEndTagNameState); } else { bufferCharacter('<'); @@ -455,11 +455,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(RAWTEXTEndTagNameState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(RAWTEXTEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(RAWTEXTEndTagNameState); } else { if (isTokenizerWhitespace(cc)) { @@ -507,11 +507,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(ScriptDataEndTagOpenState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(ScriptDataEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(ScriptDataEndTagNameState); } else { bufferCharacter('<'); @@ -524,11 +524,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(ScriptDataEndTagNameState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(ScriptDataEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(ScriptDataEndTagNameState); } else { if (isTokenizerWhitespace(cc)) { @@ -653,11 +653,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(ScriptDataEscapedEndTagOpenState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState); } else { bufferCharacter('<'); @@ -670,11 +670,11 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token) HTML_BEGIN_STATE(ScriptDataEscapedEndTagNameState) { if (isASCIIUpper(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(toLowerCase(cc)); + addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc))); HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState); } else if (isASCIILower(cc)) { m_temporaryBuffer.append(static_cast<LChar>(cc)); - addToPossibleEndTag(cc); + addToPossibleEndTag(static_cast<LChar>(cc)); HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState); } else { if (isTokenizerWhitespace(cc)) { @@ -1611,7 +1611,7 @@ inline bool HTMLTokenizer::temporaryBufferIs(const String& expectedString) return vectorEqualsString(m_temporaryBuffer, expectedString); } -inline void HTMLTokenizer::addToPossibleEndTag(UChar cc) +inline void HTMLTokenizer::addToPossibleEndTag(LChar cc) { ASSERT(isEndTagBufferingState(m_state)); m_bufferedEndTagName.append(cc); @@ -1619,7 +1619,17 @@ inline void HTMLTokenizer::addToPossibleEndTag(UChar cc) inline bool HTMLTokenizer::isAppropriateEndTag() { - return m_bufferedEndTagName == m_appropriateEndTagName; + if (m_bufferedEndTagName.size() != m_appropriateEndTagName.size()) + return false; + + size_t numCharacters = m_bufferedEndTagName.size(); + + for (size_t i = 0; i < numCharacters; i++) { + if (m_bufferedEndTagName[i] != m_appropriateEndTagName[i]) + return false; + } + + return true; } inline void HTMLTokenizer::parseError() diff --git a/Source/WebCore/html/parser/HTMLTokenizer.h b/Source/WebCore/html/parser/HTMLTokenizer.h index 4c665f7a3..d8b536d53 100644 --- a/Source/WebCore/html/parser/HTMLTokenizer.h +++ b/Source/WebCore/html/parser/HTMLTokenizer.h @@ -194,7 +194,7 @@ private: // Sometimes we speculatively consume input characters and we don't // know whether they represent end tags or RCDATA, etc. These // functions help manage these state. - inline void addToPossibleEndTag(UChar cc); + inline void addToPossibleEndTag(LChar cc); inline void saveEndTagNameIfNeeded() { @@ -214,7 +214,7 @@ private: // We occationally want to emit both a character token and an end tag // token (e.g., when lexing script). We buffer the name of the end tag // token here so we remember it next time we re-enter the tokenizer. - Vector<UChar, 32> m_bufferedEndTagName; + Vector<LChar, 32> m_bufferedEndTagName; bool m_usePreHTML5ParserQuirks; }; diff --git a/Source/WebCore/html/parser/HTMLTreeBuilder.cpp b/Source/WebCore/html/parser/HTMLTreeBuilder.cpp index 940800ef8..c78562b33 100644 --- a/Source/WebCore/html/parser/HTMLTreeBuilder.cpp +++ b/Source/WebCore/html/parser/HTMLTreeBuilder.cpp @@ -256,6 +256,8 @@ private: skipLeading<characterPredicate>(); if (start == m_current) return String(); + if (isAll8BitData()) + return String::make8BitFrom16BitSource(start, m_current - start); return String(start, m_current - start); } diff --git a/Source/WebCore/html/shadow/DateTimeEditElement.cpp b/Source/WebCore/html/shadow/DateTimeEditElement.cpp index 1b644d4c9..b6f0a0af7 100644 --- a/Source/WebCore/html/shadow/DateTimeEditElement.cpp +++ b/Source/WebCore/html/shadow/DateTimeEditElement.cpp @@ -92,8 +92,9 @@ bool DateTimeEditBuilder::needMillisecondField() const void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int count) { - // In LDML, M and MM are numeric, and MMM, MMMM, and MMMMM are symbolic. - const int symbolicMonthThreshold = 3; + const int countForAbbreviatedMonth = 3; + const int countForFullMonth = 4; + const int countForNarrowMonth = 5; Document* const document = m_editElement.document(); switch (fieldType) { @@ -126,19 +127,33 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co } case DateTimeFormat::FieldTypeMonth: - if (count >= symbolicMonthThreshold) { - // We always use abbreviations. + switch (count) { + case countForNarrowMonth: // Fallthrough. + case countForAbbreviatedMonth: m_editElement.addField(DateTimeSymbolicMonthFieldElement::create(document, m_editElement, m_parameters.localizer.shortMonthLabels())); - } else + break; + case countForFullMonth: + m_editElement.addField(DateTimeSymbolicMonthFieldElement::create(document, m_editElement, m_parameters.localizer.monthLabels())); + break; + default: m_editElement.addField(DateTimeMonthFieldElement::create(document, m_editElement, m_parameters.placeholderForMonth)); + break; + } return; case DateTimeFormat::FieldTypeMonthStandAlone: - if (count >= symbolicMonthThreshold) { - // We always use abbreviations. + switch (count) { + case countForNarrowMonth: // Fallthrough. + case countForAbbreviatedMonth: m_editElement.addField(DateTimeSymbolicMonthFieldElement::create(document, m_editElement, m_parameters.localizer.shortStandAloneMonthLabels())); - } else + break; + case countForFullMonth: + m_editElement.addField(DateTimeSymbolicMonthFieldElement::create(document, m_editElement, m_parameters.localizer.standAloneMonthLabels())); + break; + default: m_editElement.addField(DateTimeMonthFieldElement::create(document, m_editElement, m_parameters.placeholderForMonth)); + break; + } return; case DateTimeFormat::FieldTypePeriod: diff --git a/Source/WebCore/html/shadow/HTMLContentElement.cpp b/Source/WebCore/html/shadow/HTMLContentElement.cpp index 6c063c1b6..dec9e08f7 100644 --- a/Source/WebCore/html/shadow/HTMLContentElement.cpp +++ b/Source/WebCore/html/shadow/HTMLContentElement.cpp @@ -40,7 +40,7 @@ namespace WebCore { using HTMLNames::selectAttr; -static const QualifiedName& contentTagName(Document*) +const QualifiedName& HTMLContentElement::contentTagName(Document*) { #if ENABLE(SHADOW_DOM) if (!RuntimeEnabledFeatures::shadowDOMEnabled()) diff --git a/Source/WebCore/html/shadow/HTMLContentElement.h b/Source/WebCore/html/shadow/HTMLContentElement.h index 6be48669d..ea7fb89a5 100644 --- a/Source/WebCore/html/shadow/HTMLContentElement.h +++ b/Source/WebCore/html/shadow/HTMLContentElement.h @@ -38,6 +38,7 @@ namespace WebCore { class HTMLContentElement : public InsertionPoint { public: + static const QualifiedName& contentTagName(Document*); static PassRefPtr<HTMLContentElement> create(const QualifiedName&, Document*); static PassRefPtr<HTMLContentElement> create(Document*); @@ -59,7 +60,7 @@ private: inline bool isHTMLContentElement(const Node* node) { ASSERT(node); - return node->hasTagName(HTMLNames::contentTag); + return node->hasTagName(HTMLContentElement::contentTagName(node->document())); } } diff --git a/Source/WebCore/html/shadow/InsertionPoint.cpp b/Source/WebCore/html/shadow/InsertionPoint.cpp index 092077467..d34a07953 100644 --- a/Source/WebCore/html/shadow/InsertionPoint.cpp +++ b/Source/WebCore/html/shadow/InsertionPoint.cpp @@ -69,6 +69,11 @@ void InsertionPoint::detach() HTMLElement::detach(); } +bool InsertionPoint::shouldUseFallbackElements() const +{ + return isActive() && !hasDistribution(); +} + bool InsertionPoint::isShadowBoundary() const { return treeScope()->rootNode()->isShadowRoot() && isActive(); diff --git a/Source/WebCore/html/shadow/InsertionPoint.h b/Source/WebCore/html/shadow/InsertionPoint.h index 95f7995d7..aef9813f5 100644 --- a/Source/WebCore/html/shadow/InsertionPoint.h +++ b/Source/WebCore/html/shadow/InsertionPoint.h @@ -62,6 +62,8 @@ public: virtual void detach(); virtual bool isInsertionPoint() const OVERRIDE { return true; } + bool shouldUseFallbackElements() const; + size_t indexOf(Node* node) const { return m_distribution.find(node); } bool contains(const Node* node) const { return m_distribution.contains(const_cast<Node*>(node)) || (node->isShadowRoot() && toShadowRoot(node)->assignedTo() == this); } size_t size() const { return m_distribution.size(); } @@ -118,6 +120,19 @@ inline bool isLowerEncapsulationBoundary(Node* node) return toInsertionPoint(node)->isShadowBoundary(); } +inline Element* parentElementForDistribution(const Node* node) +{ + ASSERT(node); + if (Element* parent = node->parentElement()) { + if (isInsertionPoint(parent) && toInsertionPoint(parent)->shouldUseFallbackElements()) + return parent->parentElement(); + + return parent; + } + + return 0; +} + } // namespace WebCore #endif // InsertionPoint_h |