Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Unified Diff: Source/core/dom/CompositorProxy.cpp

Issue 1024233002: compositor-worker: Introduce CompositorProxy. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: . Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/dom/CompositorProxy.cpp
diff --git a/Source/core/dom/CompositorProxy.cpp b/Source/core/dom/CompositorProxy.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..088ee933df679f4246e048335c280b1375a8c8f8
--- /dev/null
+++ b/Source/core/dom/CompositorProxy.cpp
@@ -0,0 +1,120 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "core/dom/CompositorProxy.h"
+
+#include "bindings/core/v8/ExceptionMessages.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "core/dom/ExecutionContext.h"
+
+namespace blink {
+
+typedef WTF::HashMap<uint64_t, Element*> ElementMap;
+static ElementMap* gElementMap = 0;
+
+typedef WTF::HashMap<Element*, uint64_t> ElementIdMap;
+static ElementIdMap* gElementIdMap = 0;
+
+static uint64_t nextCompositorProxyId()
+{
+ static uint64_t s_nextId = 0;
+ return ++s_nextId;
+}
+
+static uint64_t compositorProxyIdForElement(Element* element)
+{
+ ASSERT(gElementIdMap);
+ if (!gElementIdMap->contains(element))
+ gElementIdMap->add(element, nextCompositorProxyId());
+ return gElementIdMap->get(element);
+}
+
+static struct {
+ const char* name;
+ CompositorProxy::Attributes attribute;
+} allowedAttributes[] = {
+ { "opacity", CompositorProxy::Attributes::OPACITY },
+ { "scrolltop", CompositorProxy::Attributes::SCROLL_TOP },
+ { "touch", CompositorProxy::Attributes::TOUCH },
+ { "transform", CompositorProxy::Attributes::TRANSFORM },
+};
+
+CompositorProxy* CompositorProxy::create(ExecutionContext* context, Element* element, Vector<String>& attributeArray, ExceptionState& exceptionState)
+{
+ if (!context->isDocument()) {
+ exceptionState.throwTypeError(ExceptionMessages::failedToConstruct("CompositorProxy", "Can only be created from the main context."));
+ exceptionState.throwIfNeeded();
+ return nullptr;
+ }
+
+ uint32_t attributeFlags = 0;
+ for (const auto& attribute : attributeArray) {
+ Attributes currentAttribute = Attributes::NONE;
+ for (unsigned i = 0; i < arraysize(allowedAttributes); ++i) {
+ if (attribute.lower() == allowedAttributes[i].name) {
+ currentAttribute = allowedAttributes[i].attribute;
+ }
+ }
+ if (currentAttribute == Attributes::NONE) {
+ exceptionState.throwTypeError("Unknown attribute'" + attribute + "'");
+ exceptionState.throwIfNeeded();
+ return nullptr;
+ }
+ attributeFlags |= static_cast<uint32_t>(currentAttribute);
+ }
+
+ ASSERT(attributeFlags);
+ if (!gElementMap) {
+ ASSERT(!gElementIdMap);
+ gElementMap = new ElementMap;
+ gElementIdMap = new ElementIdMap;
+ } else {
+ ASSERT(gElementIdMap);
+ }
+ return new CompositorProxy(element, attributeFlags);
+}
+
+CompositorProxy* CompositorProxy::create(uint64_t elementId, uint32_t attributeFlags)
+{
+ ASSERT(!isMainThread());
+#ifndef NDEBUG
+ uint32_t sanityCheckAttributes = attributeFlags;
+ for (unsigned i = 0; i < arraysize(allowedAttributes); ++i) {
+ sanityCheckAttributes &= ~static_cast<uint32_t>(allowedAttributes[i].attribute);
+ }
+ ASSERT(!sanityCheckAttributes);
+#endif
+ return new CompositorProxy(elementId, attributeFlags);
+}
+
+CompositorProxy::CompositorProxy(Element* element, uint32_t attributeFlags)
+ : m_elementId(compositorProxyIdForElement(element))
+ , m_attributes(attributeFlags)
+{
+ ASSERT(isMainThread());
+ ASSERT(gElementMap);
+ gElementMap->add(m_elementId, element);
+}
+
+CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t attributeFlags)
+ : m_elementId(elementId)
+ , m_attributes(attributeFlags)
+{
+}
+
+CompositorProxy::~CompositorProxy()
+{
+}
+
+void CompositorProxy::notifyElementGone(Element* element)
+{
+ ASSERT(isMainThread());
+ if (!gElementMap)
+ return;
+
+ gElementMap->remove(gElementIdMap->take(element));
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698