Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      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.
     12  *
     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.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/html/HTMLSourceElement.h"
     28 
     29 #include "core/HTMLNames.h"
     30 #include "core/events/Event.h"
     31 #include "core/events/EventSender.h"
     32 #include "core/html/HTMLMediaElement.h"
     33 #include "core/html/HTMLPictureElement.h"
     34 #include "platform/Logging.h"
     35 
     36 namespace WebCore {
     37 
     38 using namespace HTMLNames;
     39 
     40 static SourceEventSender& sourceErrorEventSender()
     41 {
     42     DEFINE_STATIC_LOCAL(SourceEventSender, sharedErrorEventSender, (EventTypeNames::error));
     43     return sharedErrorEventSender;
     44 }
     45 
     46 inline HTMLSourceElement::HTMLSourceElement(Document& document)
     47     : HTMLElement(sourceTag, document)
     48 {
     49     WTF_LOG(Media, "HTMLSourceElement::HTMLSourceElement - %p", this);
     50     ScriptWrappable::init(this);
     51 }
     52 
     53 DEFINE_NODE_FACTORY(HTMLSourceElement)
     54 
     55 HTMLSourceElement::~HTMLSourceElement()
     56 {
     57     sourceErrorEventSender().cancelEvent(this);
     58 }
     59 
     60 Node::InsertionNotificationRequest HTMLSourceElement::insertedInto(ContainerNode* insertionPoint)
     61 {
     62     HTMLElement::insertedInto(insertionPoint);
     63     Element* parent = parentElement();
     64     if (isHTMLMediaElement(parent))
     65         toHTMLMediaElement(parent)->sourceWasAdded(this);
     66     if (isHTMLPictureElement(parent))
     67         toHTMLPictureElement(parent)->sourceOrMediaChanged();
     68     return InsertionDone;
     69 }
     70 
     71 void HTMLSourceElement::removedFrom(ContainerNode* removalRoot)
     72 {
     73     Element* parent = parentElement();
     74     if (!parent && removalRoot->isElementNode())
     75         parent = toElement(removalRoot);
     76     if (isHTMLMediaElement(parent))
     77         toHTMLMediaElement(parent)->sourceWasRemoved(this);
     78     if (isHTMLPictureElement(parent))
     79         toHTMLPictureElement(parent)->sourceOrMediaChanged();
     80     HTMLElement::removedFrom(removalRoot);
     81 }
     82 
     83 void HTMLSourceElement::setSrc(const String& url)
     84 {
     85     setAttribute(srcAttr, AtomicString(url));
     86 }
     87 
     88 const AtomicString& HTMLSourceElement::type() const
     89 {
     90     return getAttribute(typeAttr);
     91 }
     92 
     93 void HTMLSourceElement::setType(const AtomicString& type)
     94 {
     95     setAttribute(typeAttr, type);
     96 }
     97 
     98 void HTMLSourceElement::scheduleErrorEvent()
     99 {
    100     WTF_LOG(Media, "HTMLSourceElement::scheduleErrorEvent - %p", this);
    101     sourceErrorEventSender().dispatchEventSoon(this);
    102 }
    103 
    104 void HTMLSourceElement::cancelPendingErrorEvent()
    105 {
    106     WTF_LOG(Media, "HTMLSourceElement::cancelPendingErrorEvent - %p", this);
    107     sourceErrorEventSender().cancelEvent(this);
    108 }
    109 
    110 void HTMLSourceElement::dispatchPendingEvent(SourceEventSender* eventSender)
    111 {
    112     ASSERT_UNUSED(eventSender, eventSender == &sourceErrorEventSender());
    113     WTF_LOG(Media, "HTMLSourceElement::dispatchPendingEvent - %p", this);
    114     dispatchEvent(Event::createCancelable(EventTypeNames::error));
    115 }
    116 
    117 bool HTMLSourceElement::isURLAttribute(const Attribute& attribute) const
    118 {
    119     return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute);
    120 }
    121 
    122 void HTMLSourceElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
    123 {
    124     HTMLElement::parseAttribute(name, value);
    125     if (name == srcsetAttr || name == sizesAttr || name == mediaAttr || name == typeAttr) {
    126         Element* parent = parentElement();
    127         if (isHTMLPictureElement(parent))
    128             toHTMLPictureElement(parent)->sourceOrMediaChanged();
    129     }
    130 }
    131 
    132 }
    133