summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/html
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-23 10:25:11 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-23 10:25:11 +0200
commit5ea819f80c6840c492386bfafbffb059c7e2091f (patch)
tree42ad0b1d82eff090d14278a088ea0f4840a0f938 /Source/WebCore/html
parent43a42f108af6bcbd91f2672731c3047c26213af1 (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.cpp27
-rw-r--r--Source/WebCore/html/HTMLBaseElement.h3
-rw-r--r--Source/WebCore/html/HTMLBaseElement.idl3
-rw-r--r--Source/WebCore/html/HTMLInputElement.cpp6
-rw-r--r--Source/WebCore/html/HTMLLinkElement.cpp5
-rw-r--r--Source/WebCore/html/parser/HTMLToken.h2
-rw-r--r--Source/WebCore/html/parser/HTMLTokenizer.cpp50
-rw-r--r--Source/WebCore/html/parser/HTMLTokenizer.h4
-rw-r--r--Source/WebCore/html/parser/HTMLTreeBuilder.cpp2
-rw-r--r--Source/WebCore/html/shadow/DateTimeEditElement.cpp31
-rw-r--r--Source/WebCore/html/shadow/HTMLContentElement.cpp2
-rw-r--r--Source/WebCore/html/shadow/HTMLContentElement.h3
-rw-r--r--Source/WebCore/html/shadow/InsertionPoint.cpp5
-rw-r--r--Source/WebCore/html/shadow/InsertionPoint.h15
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