Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(654)

Side by Side Diff: Source/core/html/HTMLMediaElement.cpp

Issue 59233014: Setting HTMLMediaElement.controller does not properly remove the 'mediagroup' content attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix bug found by Philipj Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 3705 matching lines...) Expand 10 before | Expand all | Expand 10 after
3716 3716
3717 AudioSourceProvider* HTMLMediaElement::audioSourceProvider() 3717 AudioSourceProvider* HTMLMediaElement::audioSourceProvider()
3718 { 3718 {
3719 if (m_player) 3719 if (m_player)
3720 return m_player->audioSourceProvider(); 3720 return m_player->audioSourceProvider();
3721 3721
3722 return 0; 3722 return 0;
3723 } 3723 }
3724 #endif 3724 #endif
3725 3725
3726 const String& HTMLMediaElement::mediaGroup() const 3726 const AtomicString& HTMLMediaElement::mediaGroup() const
3727 { 3727 {
3728 return m_mediaGroup; 3728 return fastGetAttribute(HTMLNames::mediagroupAttr);
3729 } 3729 }
3730 3730
3731 void HTMLMediaElement::setMediaGroup(const String& group) 3731 void HTMLMediaElement::setMediaGroup(const AtomicString& group)
3732 { 3732 {
3733 if (m_mediaGroup == group)
3734 return;
3735 m_mediaGroup = group;
3736
3737 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup 3733 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup
3738 // attribute is set, changed, or removed, the user agent must run the follow ing steps: 3734 // attribute is set, changed, or removed, the user agent must run the follow ing steps:
3739 // 1. Let m [this] be the media element in question. 3735 // 1. Let m [this] be the media element in question.
3740 // 2. Let m have no current media controller, if it currently has one. 3736 // 2. Let m have no current media controller, if it currently has one.
3741 setController(0); 3737 setControllerInternal(0);
3742 3738
3743 // 3. If m's mediagroup attribute is being removed, then abort these steps. 3739 // 3. If m's mediagroup attribute is being removed, then abort these steps.
3744 if (group.isNull() || group.isEmpty()) 3740 if (group.isNull() || group.isEmpty())
3745 return; 3741 return;
3746 3742
3747 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both 3743 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both
3748 // of these elements are not actually in the Document), 3744 // of these elements are not actually in the Document),
3749 HashSet<HTMLMediaElement*> elements = documentToElementSetMap().get(&documen t()); 3745 HashSet<HTMLMediaElement*> elements = documentToElementSetMap().get(&documen t());
3750 for (HashSet<HTMLMediaElement*>::iterator i = elements.begin(); i != element s.end(); ++i) { 3746 for (HashSet<HTMLMediaElement*>::iterator i = elements.begin(); i != element s.end(); ++i) {
3751 if (*i == this) 3747 if (*i == this)
3752 continue; 3748 continue;
3753 3749
3754 // and which also has a mediagroup attribute, and whose mediagroup attri bute has the same value as 3750 // and which also has a mediagroup attribute, and whose mediagroup attri bute has the same value as
3755 // the new value of m's mediagroup attribute, 3751 // the new value of m's mediagroup attribute,
3756 if ((*i)->mediaGroup() == group) { 3752 if ((*i)->mediaGroup() == group) {
3757 // then let controller be that media element's current media contro ller. 3753 // then let controller be that media element's current media contro ller.
3758 setController((*i)->controller()); 3754 setControllerInternal((*i)->controller());
3759 return; 3755 return;
3760 } 3756 }
3761 } 3757 }
3762 3758
3763 // Otherwise, let controller be a newly created MediaController. 3759 // Otherwise, let controller be a newly created MediaController.
3764 setController(MediaController::create(Node::executionContext())); 3760 setControllerInternal(MediaController::create(Node::executionContext()));
3765 } 3761 }
3766 3762
3767 MediaController* HTMLMediaElement::controller() const 3763 MediaController* HTMLMediaElement::controller() const
3768 { 3764 {
3769 return m_mediaController.get(); 3765 return m_mediaController.get();
3770 } 3766 }
3771 3767
3772 void HTMLMediaElement::setController(PassRefPtr<MediaController> controller) 3768 void HTMLMediaElement::setController(PassRefPtr<MediaController> controller)
3773 { 3769 {
3770 // 4.8.10.11.2 Media controllers: controller attribute.
3771 // On setting, it must first remove the element's mediagroup attribute, if a ny,
3772 removeAttribute(HTMLNames::mediagroupAttr);
philipj_slow 2013/11/08 19:58:04 Is the HTMLNames:: prefix needed? The vast majorit
Inactive 2013/11/08 20:12:06 Done.
3773 // and then set the current media controller to the given value.
3774 setControllerInternal(controller);
3775 }
3776
3777 void HTMLMediaElement::setControllerInternal(PassRefPtr<MediaController> control ler)
3778 {
3774 if (m_mediaController) 3779 if (m_mediaController)
3775 m_mediaController->removeMediaElement(this); 3780 m_mediaController->removeMediaElement(this);
3776 3781
3777 m_mediaController = controller; 3782 m_mediaController = controller;
3778 3783
3779 if (m_mediaController) 3784 if (m_mediaController)
3780 m_mediaController->addMediaElement(this); 3785 m_mediaController->addMediaElement(this);
3781 3786
3782 if (hasMediaControls()) 3787 if (hasMediaControls())
3783 mediaControls()->setMediaController(m_mediaController ? m_mediaControlle r.get() : static_cast<MediaControllerInterface*>(this)); 3788 mediaControls()->setMediaController(m_mediaController ? m_mediaControlle r.get() : static_cast<MediaControllerInterface*>(this));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
3871 { 3876 {
3872 scheduleLayerUpdate(); 3877 scheduleLayerUpdate();
3873 } 3878 }
3874 3879
3875 bool HTMLMediaElement::isInteractiveContent() const 3880 bool HTMLMediaElement::isInteractiveContent() const
3876 { 3881 {
3877 return fastHasAttribute(controlsAttr); 3882 return fastHasAttribute(controlsAttr);
3878 } 3883 }
3879 3884
3880 } 3885 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698