Index: Source/core/html/shadow/PluginPlaceholderElement.cpp |
diff --git a/Source/core/html/shadow/PluginPlaceholderElement.cpp b/Source/core/html/shadow/PluginPlaceholderElement.cpp |
index 74efd5581f3fba8c0eea153e418bf9210b437e95..f628ef58b0379742ccb6876da1c43a08c4edb8f2 100644 |
--- a/Source/core/html/shadow/PluginPlaceholderElement.cpp |
+++ b/Source/core/html/shadow/PluginPlaceholderElement.cpp |
@@ -6,33 +6,141 @@ |
#include "core/html/shadow/PluginPlaceholderElement.h" |
#include "bindings/core/v8/V8PluginPlaceholderElement.h" |
+#include "core/CSSPropertyNames.h" |
+#include "core/CSSValueKeywords.h" |
+#include "core/EventTypeNames.h" |
#include "core/dom/Document.h" |
+#include "core/events/Event.h" |
+#include "core/events/EventListener.h" |
+#include "core/html/HTMLStyleElement.h" |
+#include "platform/heap/Visitor.h" |
#include "wtf/Assertions.h" |
+#include "wtf/Functional.h" |
+#include "wtf/StdLibExtras.h" |
+#include "wtf/text/AtomicString.h" |
namespace blink { |
+namespace { |
+ |
+// FIXME: Move this into a resource and @import it. |
+const char kStyleSource[] = |
+ "#plugin-placeholder {" |
+ " all: initial;" |
+ " width: 100%;" |
+ " height: 100%;" |
+ " overflow: hidden;" |
+ " display: flex;" |
+ " align-items: center;" |
+ " background: gray;" |
+ " font: 12px -webkit-control;" |
+ "}" |
+ "#plugin-placeholder-content {" |
+ " text-align: center;" |
+ " margin: auto;" |
+ "}"; |
+ |
+// Invokes a closure when an event occurs. |
+// Take care to use a WeakPtr where necessary to avoid reference cycles. |
+class SimpleEventListener : public EventListener { |
+public: |
+ static PassRefPtr<SimpleEventListener> create(PassOwnPtr<Closure> closure) |
+ { |
+ return adoptRef(new SimpleEventListener(closure)); |
+ } |
+ |
+ ~SimpleEventListener() override { } |
+ |
+private: |
+ SimpleEventListener(PassOwnPtr<Closure> closure) |
+ : EventListener(CPPEventListenerType) |
+ , m_closure(closure) |
+ { |
+ } |
+ |
+ bool operator==(const EventListener& other) override { return this == &other; } |
+ |
+ void handleEvent(ExecutionContext*, Event*) override |
+ { |
+ (*m_closure)(); |
+ } |
+ |
+ OwnPtr<Closure> m_closure; |
+}; |
+ |
+} // namespace |
PluginPlaceholderElement::PluginPlaceholderElement(Document& document) |
: HTMLDivElement(document) |
+ , m_weakPtrFactory(this) |
{ |
} |
-PassRefPtrWillBeRawPtr<PluginPlaceholderElement> PluginPlaceholderElement::create(Document& document) |
+PluginPlaceholderElement::~PluginPlaceholderElement() |
{ |
- RefPtrWillBeRawPtr<PluginPlaceholderElement> element = adoptRefWillBeNoop(new PluginPlaceholderElement(document)); |
- bool success = V8PluginPlaceholderElement::PrivateScript::createdCallbackMethod(document.frame(), element.get()); |
- ASSERT_UNUSED(success, success); |
- return element.release(); |
+} |
+ |
+void PluginPlaceholderElement::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_messageElement); |
+ visitor->trace(m_closeButton); |
+ HTMLDivElement::trace(visitor); |
} |
void PluginPlaceholderElement::setMessage(const String& message) |
{ |
- bool success = V8PluginPlaceholderElement::PrivateScript::messageAttributeSetter(document().frame(), this, message); |
- ASSERT_UNUSED(success, success); |
+ m_messageElement->setTextContent(message); |
} |
void PluginPlaceholderElement::setIsCloseable(bool closeable) |
{ |
- bool success = V8PluginPlaceholderElement::PrivateScript::closeableAttributeSetter(document().frame(), this, closeable); |
+ if (closeable) |
+ m_closeButton->removeInlineStyleProperty(CSSPropertyDisplay); |
+ else |
+ m_closeButton->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); |
+} |
+ |
+void PluginPlaceholderElement::initialize() |
+{ |
+ DEFINE_STATIC_LOCAL(AtomicString, elementId, ("plugin-placeholder", AtomicString::ConstructFromLiteral)); |
+ setIdAttribute(elementId); |
+ |
+ RefPtrWillBeRawPtr<HTMLStyleElement> styleElement = HTMLStyleElement::create(document(), false); |
+ styleElement->setTextContent(kStyleSource); |
+ |
+ DEFINE_STATIC_LOCAL(AtomicString, contentElementId, ("plugin-placeholder-content", AtomicString::ConstructFromLiteral)); |
+ RefPtrWillBeRawPtr<HTMLDivElement> contentElement = HTMLDivElement::create(document()); |
+ contentElement->setIdAttribute(contentElementId); |
+ |
+ DEFINE_STATIC_LOCAL(AtomicString, messageElementId, ("plugin-placeholder-message", AtomicString::ConstructFromLiteral)); |
+ RefPtrWillBeRawPtr<HTMLDivElement> messageElement = HTMLDivElement::create(document()); |
+ messageElement->setIdAttribute(messageElementId); |
+ |
+ // FIXME: UI polish, l10n, etc. for the close button. |
+ DEFINE_STATIC_LOCAL(AtomicString, closeButtonId, ("plugin-placeholder-close-button", AtomicString::ConstructFromLiteral)); |
+ RefPtrWillBeRawPtr<HTMLButtonElement> closeButton = HTMLButtonElement::create(document(), nullptr); |
+ closeButton->setIdAttribute(closeButtonId); |
+ closeButton->setTextContent("Close"); |
+ closeButton->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); |
+ closeButton->addEventListener(EventTypeNames::click, createSimpleEventListener(&PluginPlaceholderElement::onCloseButtonClick)); |
+ |
+ contentElement->appendChild(messageElement); |
+ contentElement->appendChild(closeButton); |
+ appendChild(styleElement); |
+ appendChild(contentElement); |
+ |
+ m_messageElement = messageElement.release(); |
+ m_closeButton = closeButton.release(); |
+} |
+ |
+PassRefPtr<EventListener> PluginPlaceholderElement::createSimpleEventListener(void(PluginPlaceholderElement::*method)()) |
+{ |
+ return SimpleEventListener::create(bind(method, m_weakPtrFactory.createWeakPtr())); |
+} |
+ |
+void PluginPlaceholderElement::onCloseButtonClick() |
+{ |
+ // FIXME: Record UMA Plugin_Hide_Click or an equivalent UseCounter. |
+ bool success = V8PluginPlaceholderElement::PrivateScript::hideMethod(document().frame(), this); |
ASSERT_UNUSED(success, success); |
} |