2 * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "core/html/HTMLSourceElement.h"
29 #include "HTMLNames.h"
30 #include "core/events/EventSender.h"
31 #include "core/html/HTMLMediaElement.h"
32 #include "platform/Logging.h"
38 using namespace HTMLNames;
40 static SourceEventSender& sourceErrorEventSender()
42 DEFINE_STATIC_LOCAL(SourceEventSender, sharedErrorEventSender, (EventTypeNames::error));
43 return sharedErrorEventSender;
46 inline HTMLSourceElement::HTMLSourceElement(Document& document)
47 : HTMLElement(sourceTag, document)
49 WTF_LOG(Media, "HTMLSourceElement::HTMLSourceElement - %p", this);
50 ScriptWrappable::init(this);
53 PassRefPtrWillBeRawPtr<HTMLSourceElement> HTMLSourceElement::create(Document& document)
55 return adoptRefWillBeRefCountedGarbageCollected(new HTMLSourceElement(document));
58 HTMLSourceElement::~HTMLSourceElement()
60 sourceErrorEventSender().cancelEvent(this);
63 Node::InsertionNotificationRequest HTMLSourceElement::insertedInto(ContainerNode* insertionPoint)
65 HTMLElement::insertedInto(insertionPoint);
66 Element* parent = parentElement();
67 if (isHTMLMediaElement(parent))
68 toHTMLMediaElement(parent)->sourceWasAdded(this);
72 void HTMLSourceElement::removedFrom(ContainerNode* removalRoot)
74 Element* parent = parentElement();
75 if (!parent && removalRoot->isElementNode())
76 parent = toElement(removalRoot);
77 if (isHTMLMediaElement(parent))
78 toHTMLMediaElement(parent)->sourceWasRemoved(this);
79 HTMLElement::removedFrom(removalRoot);
82 void HTMLSourceElement::setSrc(const String& url)
84 setAttribute(srcAttr, AtomicString(url));
87 const AtomicString& HTMLSourceElement::type() const
89 return getAttribute(typeAttr);
92 void HTMLSourceElement::setType(const AtomicString& type)
94 setAttribute(typeAttr, type);
97 void HTMLSourceElement::scheduleErrorEvent()
99 WTF_LOG(Media, "HTMLSourceElement::scheduleErrorEvent - %p", this);
100 sourceErrorEventSender().dispatchEventSoon(this);
103 void HTMLSourceElement::cancelPendingErrorEvent()
105 WTF_LOG(Media, "HTMLSourceElement::cancelPendingErrorEvent - %p", this);
106 sourceErrorEventSender().cancelEvent(this);
109 void HTMLSourceElement::dispatchPendingEvent(SourceEventSender* eventSender)
111 ASSERT_UNUSED(eventSender, eventSender == &sourceErrorEventSender());
112 WTF_LOG(Media, "HTMLSourceElement::dispatchPendingEvent - %p", this);
113 dispatchEvent(Event::createCancelable(EventTypeNames::error));
116 bool HTMLSourceElement::isURLAttribute(const Attribute& attribute) const
118 return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute);