| Index: Source/core/html/HTMLSourceElement.cpp | 
| diff --git a/Source/core/html/HTMLSourceElement.cpp b/Source/core/html/HTMLSourceElement.cpp | 
| index 6364f84b11dedffe5d31e7bb8772eb897f7bb789..dfe72c6fd8c49340ecea278f341bc721de932129 100644 | 
| --- a/Source/core/html/HTMLSourceElement.cpp | 
| +++ b/Source/core/html/HTMLSourceElement.cpp | 
| @@ -27,6 +27,10 @@ | 
| #include "core/html/HTMLSourceElement.h" | 
|  | 
| #include "core/HTMLNames.h" | 
| +#include "core/css/MediaList.h" | 
| +#include "core/css/MediaQueryList.h" | 
| +#include "core/css/MediaQueryMatcher.h" | 
| +#include "core/dom/Document.h" | 
| #include "core/events/Event.h" | 
| #include "core/events/EventSender.h" | 
| #include "core/html/HTMLMediaElement.h" | 
| @@ -43,8 +47,28 @@ static SourceEventSender& sourceErrorEventSender() | 
| return sharedErrorEventSender; | 
| } | 
|  | 
| +class HTMLSourceElement::Listener FINAL : public MediaQueryListListener { | 
| +public: | 
| +    explicit Listener(HTMLSourceElement* element) : m_element(element) { } | 
| +    virtual void call() OVERRIDE | 
| +    { | 
| +        if (m_element) | 
| +            m_element->notifyMediaQueryChanged(); | 
| +    } | 
| + | 
| +    void clearElement() { m_element = nullptr; } | 
| +    virtual void trace(Visitor* visitor) OVERRIDE | 
| +    { | 
| +        MediaQueryListListener::trace(visitor); | 
| +        visitor->trace(m_element); | 
| +    } | 
| +private: | 
| +    RawPtrWillBeMember<HTMLSourceElement> m_element; | 
| +}; | 
| + | 
| inline HTMLSourceElement::HTMLSourceElement(Document& document) | 
| : HTMLElement(sourceTag, document) | 
| +    , m_listener(adoptRefWillBeNoop(new Listener(this))) | 
| { | 
| WTF_LOG(Media, "HTMLSourceElement::HTMLSourceElement - %p", this); | 
| ScriptWrappable::init(this); | 
| @@ -55,6 +79,7 @@ DEFINE_NODE_FACTORY(HTMLSourceElement) | 
| HTMLSourceElement::~HTMLSourceElement() | 
| { | 
| sourceErrorEventSender().cancelEvent(this); | 
| +    m_listener->clearElement(); | 
| } | 
|  | 
| Node::InsertionNotificationRequest HTMLSourceElement::insertedInto(ContainerNode* insertionPoint) | 
| @@ -114,6 +139,14 @@ void HTMLSourceElement::dispatchPendingEvent(SourceEventSender* eventSender) | 
| dispatchEvent(Event::createCancelable(EventTypeNames::error)); | 
| } | 
|  | 
| +bool HTMLSourceElement::mediaQueryMatches() const | 
| +{ | 
| +    if (!m_mediaQueryList) | 
| +        return true; | 
| + | 
| +    return m_mediaQueryList->matches(); | 
| +} | 
| + | 
| bool HTMLSourceElement::isURLAttribute(const Attribute& attribute) const | 
| { | 
| return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute); | 
| @@ -122,6 +155,13 @@ bool HTMLSourceElement::isURLAttribute(const Attribute& attribute) const | 
| void HTMLSourceElement::parseAttribute(const QualifiedName& name, const AtomicString& value) | 
| { | 
| HTMLElement::parseAttribute(name, value); | 
| +    if (name == mediaAttr) { | 
| +        if (m_mediaQueryList) | 
| +            m_mediaQueryList->removeListener(m_listener); | 
| +        RefPtrWillBeRawPtr<MediaQuerySet> set = MediaQuerySet::create(value); | 
| +        m_mediaQueryList = MediaQueryList::create(&document().mediaQueryMatcher(), set.release()); | 
| +        m_mediaQueryList->addListener(m_listener); | 
| +    } | 
| if (name == srcsetAttr || name == sizesAttr || name == mediaAttr || name == typeAttr) { | 
| Element* parent = parentElement(); | 
| if (isHTMLPictureElement(parent)) | 
| @@ -129,4 +169,18 @@ void HTMLSourceElement::parseAttribute(const QualifiedName& name, const AtomicSt | 
| } | 
| } | 
|  | 
| +void HTMLSourceElement::notifyMediaQueryChanged() | 
| +{ | 
| +    Element* parent = parentElement(); | 
| +    if (isHTMLPictureElement(parent)) | 
| +        toHTMLPictureElement(parent)->sourceOrMediaChanged(); | 
| +} | 
| + | 
| +void HTMLSourceElement::trace(Visitor* visitor) | 
| +{ | 
| +    HTMLElement::trace(visitor); | 
| +    visitor->trace(m_mediaQueryList); | 
| +    visitor->trace(m_listener); | 
| +} | 
| + | 
| } | 
|  |