Index: third_party/WebKit/Source/core/html/HTMLMeterElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp b/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp |
index d84e2ea9d99c7a2b996679a13459c363920b7a05..ad35299d849654315f3037b0326df0a9604b05be 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp |
@@ -24,8 +24,10 @@ |
#include "bindings/core/v8/ExceptionState.h" |
#include "bindings/core/v8/ExceptionStatePlaceholder.h" |
#include "core/HTMLNames.h" |
+#include "core/dom/NodeComputedStyle.h" |
#include "core/dom/shadow/ShadowRoot.h" |
#include "core/frame/UseCounter.h" |
+#include "core/html/HTMLContentElement.h" |
#include "core/html/HTMLDivElement.h" |
#include "core/html/parser/HTMLParserIdioms.h" |
#include "core/layout/LayoutObject.h" |
@@ -35,6 +37,70 @@ namespace blink { |
using namespace HTMLNames; |
+// ---------------------------------------------------------------- |
+ |
+class MeterFallbackElement final : public HTMLDivElement { |
+public: |
+ DECLARE_NODE_FACTORY(MeterFallbackElement); |
+ |
+private: |
+ explicit MeterFallbackElement(Document& doc) |
+ : HTMLDivElement(doc) |
+ { |
+ setHasCustomStyleCallbacks(); |
+ } |
+ |
+ PassRefPtr<ComputedStyle> customStyleForLayoutObject() override |
+ { |
+ // We can't use setInlineStyleProperty() because it updates the DOM |
+ // tree. We shouldn't do it during style calculation. |
+ // TODO(tkent): Injecting a CSS variable by host is a better approach? |
+ Element* host = shadowHost(); |
+ RefPtr<ComputedStyle> style = originalStyleForLayoutObject(); |
+ if (!host || !host->computedStyle() || host->computedStyle()->appearance() != MeterPart || style->display() == NONE) |
+ return style.release(); |
+ RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style); |
+ newStyle->setDisplay(NONE); |
+ newStyle->setUnique(); |
+ return newStyle.release(); |
+ } |
+}; |
+ |
+DEFINE_NODE_FACTORY(MeterFallbackElement) |
+ |
+// ---------------------------------------------------------------- |
+ |
+class MeterInnerElement final : public HTMLDivElement { |
+public: |
+ DECLARE_NODE_FACTORY(MeterInnerElement); |
+ |
+private: |
+ explicit MeterInnerElement(Document& doc) |
+ : HTMLDivElement(doc) |
+ { |
+ setHasCustomStyleCallbacks(); |
+ } |
+ |
+ PassRefPtr<ComputedStyle> customStyleForLayoutObject() override |
+ { |
+ // We can't use setInlineStyleProperty() because it updates the DOM |
+ // tree. We shouldn't do it during style calculation. |
+ // TODO(tkent): Injecting a CSS variable by host is a better approach? |
+ Element* host = shadowHost(); |
+ RefPtr<ComputedStyle> style = originalStyleForLayoutObject(); |
+ if (!host || !host->computedStyle() || host->computedStyle()->appearance() == MeterPart || style->display() == NONE) |
+ return style.release(); |
+ RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style); |
+ newStyle->setDisplay(NONE); |
+ newStyle->setUnique(); |
+ return newStyle.release(); |
+ } |
+}; |
+ |
+DEFINE_NODE_FACTORY(MeterInnerElement) |
+ |
+// ---------------------------------------------------------------- |
+ |
HTMLMeterElement::HTMLMeterElement(Document& document) |
: LabelableElement(meterTag, document) |
{ |
@@ -192,7 +258,7 @@ void HTMLMeterElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
{ |
ASSERT(!m_value); |
- HTMLDivElement* inner = HTMLDivElement::create(document()); |
+ MeterInnerElement* inner = MeterInnerElement::create(document()); |
inner->setShadowPseudoId(AtomicString("-webkit-meter-inner-element")); |
root.appendChild(inner); |
@@ -204,6 +270,10 @@ void HTMLMeterElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
bar->appendChild(m_value); |
inner->appendChild(bar); |
+ |
+ MeterFallbackElement* fallback = MeterFallbackElement::create(document()); |
+ fallback->appendChild(HTMLContentElement::create(document())); |
+ root.appendChild(fallback); |
} |
void HTMLMeterElement::updateValueAppearance(double percentage) |
@@ -226,6 +296,12 @@ void HTMLMeterElement::updateValueAppearance(double percentage) |
} |
} |
+bool HTMLMeterElement::canContainRangeEndPoint() const |
+{ |
+ document().updateLayoutTreeForNode(this); |
+ return computedStyle() && !computedStyle()->hasAppearance(); |
+} |
+ |
DEFINE_TRACE(HTMLMeterElement) |
{ |
visitor->trace(m_value); |