Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "config.h" | |
| 6 #include "core/dom/CompositorProxy.h" | |
| 7 | |
| 8 #include "bindings/core/v8/ExceptionMessages.h" | |
| 9 #include "bindings/core/v8/ExceptionState.h" | |
| 10 #include "core/dom/DOMNodeIds.h" | |
| 11 #include "core/dom/ExecutionContext.h" | |
| 12 | |
| 13 namespace blink { | |
| 14 | |
| 15 struct AttributeFlagMapping { | |
| 16 const char* name; | |
| 17 unsigned length; | |
| 18 CompositorProxy::Attributes attribute; | |
| 19 }; | |
| 20 | |
| 21 static AttributeFlagMapping allowedAttributes[] = { | |
| 22 { "opacity", 7, CompositorProxy::Attributes::OPACITY }, | |
| 23 { "scrollleft", 10, CompositorProxy::Attributes::SCROLL_LEFT }, | |
| 24 { "scrolltop", 9, CompositorProxy::Attributes::SCROLL_TOP }, | |
| 25 { "touch", 5, CompositorProxy::Attributes::TOUCH }, | |
| 26 { "transform", 8, CompositorProxy::Attributes::TRANSFORM }, | |
| 27 }; | |
| 28 | |
| 29 static bool CompareAttributeName(const AttributeFlagMapping& attribute, StringIm pl* attributeLower) | |
| 30 { | |
| 31 ASSERT(attributeLower->is8Bit()); | |
| 32 return memcmp(attribute.name, attributeLower->characters8(), std::min(attrib ute.length, attributeLower->length())) < 0; | |
| 33 } | |
| 34 | |
| 35 static CompositorProxy::Attributes attributeFlagForName(const String& attributeN ame) | |
| 36 { | |
| 37 CompositorProxy::Attributes attributeFlag = CompositorProxy::Attributes::NON E; | |
| 38 const String attributeLower = attributeName.lower(); | |
| 39 const AttributeFlagMapping* start = allowedAttributes; | |
| 40 const AttributeFlagMapping* end = allowedAttributes + WTF_ARRAY_LENGTH(allow edAttributes); | |
| 41 if (attributeLower.impl()->is8Bit()) { | |
| 42 const AttributeFlagMapping* match = std::lower_bound(start, end, attribu teLower.impl(), CompareAttributeName); | |
| 43 if (match != end) | |
| 44 attributeFlag = match->attribute; | |
| 45 } | |
| 46 return attributeFlag; | |
| 47 } | |
| 48 | |
| 49 static CompositorProxy::AttributesBitfield attributesBitfieldFromNames(const Vec tor<String>& attributeArray) | |
| 50 { | |
| 51 CompositorProxy::AttributesBitfield attributesBitfield(0); | |
| 52 for (const auto& attribute : attributeArray) { | |
| 53 switch (attributeFlagForName(attribute)) { | |
| 54 case CompositorProxy::Attributes::OPACITY: | |
| 55 attributesBitfield.m_attributes.m_opacity = true; | |
|
esprehn
2015/03/27 23:48:42
Hmm this is a bit worse I guess since you need all
sadrul
2015/03/28 02:12:39
Done.
| |
| 56 break; | |
| 57 case CompositorProxy::Attributes::SCROLL_LEFT: | |
| 58 attributesBitfield.m_attributes.m_scrollLeft = true; | |
| 59 break; | |
| 60 case CompositorProxy::Attributes::SCROLL_TOP: | |
| 61 attributesBitfield.m_attributes.m_scrollTop = true; | |
| 62 break; | |
| 63 case CompositorProxy::Attributes::TOUCH: | |
| 64 attributesBitfield.m_attributes.m_touch = true; | |
| 65 break; | |
| 66 case CompositorProxy::Attributes::TRANSFORM: | |
| 67 attributesBitfield.m_attributes.m_transform = true; | |
| 68 break; | |
| 69 case CompositorProxy::Attributes::NONE: | |
| 70 break; | |
| 71 } | |
| 72 } | |
| 73 return attributesBitfield; | |
| 74 } | |
| 75 | |
| 76 #if ENABLE(ASSERT) | |
| 77 static bool sanityCheckAttributeFlags(uint32_t attributeFlags) | |
| 78 { | |
| 79 uint32_t sanityCheckAttributes = attributeFlags; | |
| 80 for (unsigned i = 0; i < arraysize(allowedAttributes); ++i) { | |
| 81 sanityCheckAttributes &= ~static_cast<uint32_t>(allowedAttributes[i].att ribute); | |
| 82 } | |
| 83 return !sanityCheckAttributes; | |
| 84 } | |
| 85 #endif | |
| 86 | |
| 87 CompositorProxy* CompositorProxy::create(ExecutionContext* context, Element* ele ment, const Vector<String>& attributeArray, ExceptionState& exceptionState) | |
| 88 { | |
| 89 if (!context->isDocument()) { | |
| 90 exceptionState.throwTypeError(ExceptionMessages::failedToConstruct("Comp ositorProxy", "Can only be created from the main context.")); | |
| 91 exceptionState.throwIfNeeded(); | |
| 92 return nullptr; | |
| 93 } | |
| 94 | |
| 95 return new CompositorProxy(*element, attributeArray); | |
| 96 } | |
| 97 | |
| 98 CompositorProxy* CompositorProxy::create(uint64_t elementId, uint32_t attributeF lags) | |
| 99 { | |
| 100 return new CompositorProxy(elementId, attributeFlags); | |
| 101 } | |
| 102 | |
| 103 CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attribu teArray) | |
| 104 : m_elementId(DOMNodeIds::idForNode(&element)) | |
| 105 , m_bitfieldsSupported(attributesBitfieldFromNames(attributeArray)) | |
| 106 { | |
| 107 ASSERT(isMainThread()); | |
| 108 ASSERT(m_bitfieldsSupported.m_flags); | |
| 109 ASSERT(sanityCheckAttributeFlags(m_bitfieldsSupported.m_flags)); | |
| 110 } | |
| 111 | |
| 112 CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t attributeFlags) | |
| 113 : m_elementId(elementId) | |
| 114 , m_bitfieldsSupported(attributeFlags) | |
| 115 { | |
| 116 ASSERT(!isMainThread()); | |
| 117 ASSERT(sanityCheckAttributeFlags(m_bitfieldsSupported.m_flags)); | |
| 118 } | |
| 119 | |
| 120 CompositorProxy::~CompositorProxy() | |
| 121 { | |
| 122 } | |
| 123 | |
| 124 bool CompositorProxy::supports(const String& attributeName) const | |
| 125 { | |
| 126 switch (attributeFlagForName(attributeName)) { | |
| 127 case CompositorProxy::Attributes::OPACITY: | |
| 128 return m_bitfieldsSupported.m_attributes.m_opacity; | |
| 129 case CompositorProxy::Attributes::SCROLL_LEFT: | |
| 130 return m_bitfieldsSupported.m_attributes.m_scrollLeft; | |
| 131 case CompositorProxy::Attributes::SCROLL_TOP: | |
| 132 return m_bitfieldsSupported.m_attributes.m_scrollTop; | |
| 133 case CompositorProxy::Attributes::TOUCH: | |
| 134 return m_bitfieldsSupported.m_attributes.m_touch; | |
| 135 case CompositorProxy::Attributes::TRANSFORM: | |
| 136 return m_bitfieldsSupported.m_attributes.m_transform; | |
| 137 case CompositorProxy::Attributes::NONE: | |
| 138 break; | |
| 139 } | |
| 140 return false; | |
| 141 } | |
| 142 | |
| 143 } // namespace blink | |
| OLD | NEW |