| 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..7c346997c79c0e9b869c97a8afd73d2fc85ba667
|
| --- /dev/null
|
| +++ b/Source/core/dom/CompositorProxy.cpp
|
| @@ -0,0 +1,111 @@
|
| +// 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/DOMNodeIds.h"
|
| +#include "core/dom/ExecutionContext.h"
|
| +
|
| +namespace blink {
|
| +
|
| +struct AttributeFlagMapping {
|
| + const char* name;
|
| + unsigned length;
|
| + CompositorProxy::Attributes attribute;
|
| +};
|
| +
|
| +static AttributeFlagMapping allowedAttributes[] = {
|
| + { "opacity", 7, CompositorProxy::Attributes::OPACITY },
|
| + { "scrollleft", 10, CompositorProxy::Attributes::SCROLL_LEFT },
|
| + { "scrolltop", 9, CompositorProxy::Attributes::SCROLL_TOP },
|
| + { "touch", 5, CompositorProxy::Attributes::TOUCH },
|
| + { "transform", 8, CompositorProxy::Attributes::TRANSFORM },
|
| +};
|
| +
|
| +static bool CompareAttributeName(const AttributeFlagMapping& attribute, StringImpl* attributeLower)
|
| +{
|
| + ASSERT(attributeLower->is8Bit());
|
| + return memcmp(attribute.name, attributeLower->characters8(), std::min(attribute.length, attributeLower->length())) < 0;
|
| +}
|
| +
|
| +static CompositorProxy::Attributes attributeFlagForName(const String& attributeName)
|
| +{
|
| + CompositorProxy::Attributes attributeFlag = CompositorProxy::Attributes::NONE;
|
| + const String attributeLower = attributeName.lower();
|
| + const AttributeFlagMapping* start = allowedAttributes;
|
| + const AttributeFlagMapping* end = allowedAttributes + WTF_ARRAY_LENGTH(allowedAttributes);
|
| + if (attributeLower.impl()->is8Bit()) {
|
| + const AttributeFlagMapping* match = std::lower_bound(start, end, attributeLower.impl(), CompareAttributeName);
|
| + if (match != end)
|
| + attributeFlag = match->attribute;
|
| + }
|
| + return attributeFlag;
|
| +}
|
| +
|
| +static uint32_t attributesBitfieldFromNames(const Vector<String>& attributeArray)
|
| +{
|
| + uint32_t attributesBitfield = 0;
|
| + for (const auto& attribute : attributeArray) {
|
| + attributesBitfield |= static_cast<uint32_t>(attributeFlagForName(attribute));
|
| + }
|
| + return attributesBitfield;
|
| +}
|
| +
|
| +#if ENABLE(ASSERT)
|
| +static bool sanityCheckAttributeFlags(uint32_t attributeFlags)
|
| +{
|
| + uint32_t sanityCheckAttributes = attributeFlags;
|
| + for (unsigned i = 0; i < arraysize(allowedAttributes); ++i) {
|
| + sanityCheckAttributes &= ~static_cast<uint32_t>(allowedAttributes[i].attribute);
|
| + }
|
| + return !sanityCheckAttributes;
|
| +}
|
| +#endif
|
| +
|
| +CompositorProxy* CompositorProxy::create(ExecutionContext* context, Element* element, const 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;
|
| + }
|
| +
|
| + return new CompositorProxy(*element, attributeArray);
|
| +}
|
| +
|
| +CompositorProxy* CompositorProxy::create(uint64_t elementId, uint32_t attributeFlags)
|
| +{
|
| + return new CompositorProxy(elementId, attributeFlags);
|
| +}
|
| +
|
| +CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attributeArray)
|
| + : m_elementId(DOMNodeIds::idForNode(&element))
|
| + , m_bitfieldsSupported(attributesBitfieldFromNames(attributeArray))
|
| +{
|
| + ASSERT(isMainThread());
|
| + ASSERT(m_bitfieldsSupported);
|
| + ASSERT(sanityCheckAttributeFlags(m_bitfieldsSupported));
|
| +}
|
| +
|
| +CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t attributeFlags)
|
| + : m_elementId(elementId)
|
| + , m_bitfieldsSupported(attributeFlags)
|
| +{
|
| + ASSERT(!isMainThread());
|
| + ASSERT(sanityCheckAttributeFlags(m_bitfieldsSupported));
|
| +}
|
| +
|
| +CompositorProxy::~CompositorProxy()
|
| +{
|
| +}
|
| +
|
| +bool CompositorProxy::supports(const String& attributeName) const
|
| +{
|
| + return !!(m_bitfieldsSupported & static_cast<uint32_t>(attributeFlagForName(attributeName)));
|
| +}
|
| +
|
| +} // namespace blink
|
|
|