| Index: Source/core/dom/AttributeCollection.cpp | 
| diff --git a/Source/modules/webmidi/MIDIController.h b/Source/core/dom/AttributeCollection.cpp | 
| similarity index 51% | 
| copy from Source/modules/webmidi/MIDIController.h | 
| copy to Source/core/dom/AttributeCollection.cpp | 
| index 2aff8a39254987637d780d92baa29d0d79e64bf5..fb01fd30a2d686a8c1f9fdb8b0892888a2f8ebe5 100644 | 
| --- a/Source/modules/webmidi/MIDIController.h | 
| +++ b/Source/core/dom/AttributeCollection.cpp | 
| @@ -1,5 +1,7 @@ | 
| /* | 
| * Copyright (C) 2013 Google Inc. All rights reserved. | 
| + * Copyright (C) 2014 Apple Inc. All rights reserved. | 
| + * Copyright (C) 2014 Samsung Electronics. All rights reserved. | 
| * | 
| * Redistribution and use in source and binary forms, with or without | 
| * modification, are permitted provided that the following conditions are | 
| @@ -28,38 +30,45 @@ | 
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| */ | 
|  | 
| -#ifndef MIDIController_h | 
| -#define MIDIController_h | 
| +#include "config.h" | 
| +#include "core/dom/AttributeCollection.h" | 
|  | 
| -#include "core/frame/LocalFrame.h" | 
| -#include "platform/heap/Handle.h" | 
| +#include "core/dom/Attr.h" | 
|  | 
| namespace WebCore { | 
|  | 
| -class MIDIAccessInitializer; | 
| -class MIDIClient; | 
| +size_t AttributeCollection::findIndex(Attr* attr) const | 
| +{ | 
| +    // This relies on the fact that Attr's QualifiedName == the Attribute's name. | 
| +    const_iterator end = this->end(); | 
| +    unsigned index = 0; | 
| +    for (const_iterator it = begin(); it != end; ++it, ++index) { | 
| +        if (it->name() == attr->qualifiedName()) | 
| +            return index; | 
| +    } | 
| +    return kNotFound; | 
| +} | 
|  | 
| -class MIDIController FINAL : public NoBaseWillBeGarbageCollectedFinalized<MIDIController>, public WillBeHeapSupplement<LocalFrame> { | 
| -    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MIDIController); | 
| -public: | 
| -    virtual ~MIDIController(); | 
| - | 
| -    void requestSysexPermission(MIDIAccessInitializer*); | 
| -    void cancelSysexPermissionRequest(MIDIAccessInitializer*); | 
| - | 
| -    static PassOwnPtrWillBeRawPtr<MIDIController> create(PassOwnPtr<MIDIClient>); | 
| -    static const char* supplementName(); | 
| -    static MIDIController* from(LocalFrame* frame) { return static_cast<MIDIController*>(WillBeHeapSupplement<LocalFrame>::from(frame, supplementName())); } | 
| - | 
| -    virtual void trace(Visitor* visitor) OVERRIDE { WillBeHeapSupplement<LocalFrame>::trace(visitor); } | 
| - | 
| -protected: | 
| -    explicit MIDIController(PassOwnPtr<MIDIClient>); | 
| - | 
| -private: | 
| -    OwnPtr<MIDIClient> m_client; | 
| -}; | 
| +size_t AttributeCollection::findSlowCase(const AtomicString& name, bool shouldIgnoreAttributeCase) const | 
| +{ | 
| +    // Continue to checking case-insensitively and/or full namespaced names if necessary: | 
| +    const_iterator end = this->end(); | 
| +    unsigned index = 0; | 
| +    for (const_iterator it = begin(); it != end; ++it, ++index) { | 
| +        // FIXME: Why check the prefix? Namespace is all that should matter | 
| +        // and all HTML/SVG attributes have a null namespace! | 
| +        if (!it->name().hasPrefix()) { | 
| +            if (shouldIgnoreAttributeCase && equalIgnoringCase(name, it->localName())) | 
| +                return index; | 
| +        } else { | 
| +            // FIXME: Would be faster to do this comparison without calling toString, which | 
| +            // generates a temporary string by concatenation. But this branch is only reached | 
| +            // if the attribute name has a prefix, which is rare in HTML. | 
| +            if (equalPossiblyIgnoringCase(name, it->name().toString(), shouldIgnoreAttributeCase)) | 
| +                return index; | 
| +        } | 
| +    } | 
| +    return kNotFound; | 
| +} | 
|  | 
| } // namespace WebCore | 
| - | 
| -#endif // MIDIController_h | 
|  |