Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 115 // fair amount of overhead and logging. | 115 // fair amount of overhead and logging. |
| 116 #define LOG_CACHED_TIME_WARNINGS 0 | 116 #define LOG_CACHED_TIME_WARNINGS 0 |
| 117 #endif | 117 #endif |
| 118 | 118 |
| 119 // URL protocol used to signal that the media source API is being used. | 119 // URL protocol used to signal that the media source API is being used. |
| 120 static const char mediaSourceBlobProtocol[] = "blob"; | 120 static const char mediaSourceBlobProtocol[] = "blob"; |
| 121 | 121 |
| 122 using namespace HTMLNames; | 122 using namespace HTMLNames; |
| 123 using namespace std; | 123 using namespace std; |
| 124 | 124 |
| 125 typedef HashMap<Document*, HashSet<HTMLMediaElement*> > DocumentElementSetMap; | 125 typedef WillBeHeapHashSet<RawPtrWillBeWeakMember<HTMLMediaElement> > WeakMediaEl ementSet; |
| 126 typedef WillBeHeapHashMap<RawPtrWillBeWeakMember<Document>, WeakMediaElementSet> DocumentElementSetMap; | |
| 126 static DocumentElementSetMap& documentToElementSetMap() | 127 static DocumentElementSetMap& documentToElementSetMap() |
| 127 { | 128 { |
| 129 #if ENABLE(OILPAN) | |
| 130 DEFINE_STATIC_LOCAL(Persistent<DocumentElementSetMap>, map, (new DocumentEle mentSetMap())); | |
| 131 return *map; | |
| 132 #else | |
| 128 DEFINE_STATIC_LOCAL(DocumentElementSetMap, map, ()); | 133 DEFINE_STATIC_LOCAL(DocumentElementSetMap, map, ()); |
| 129 return map; | 134 return map; |
| 135 #endif | |
|
haraken
2014/04/25 14:30:32
Nit: We've been using #if for this pattern in a lo
Mads Ager (chromium)
2014/04/28 09:45:21
Yes, we should see what we can do with these. The
| |
| 130 } | 136 } |
| 131 | 137 |
| 132 static void addElementToDocumentMap(HTMLMediaElement* element, Document* documen t) | 138 static void addElementToDocumentMap(HTMLMediaElement* element, Document* documen t) |
| 133 { | 139 { |
| 134 DocumentElementSetMap& map = documentToElementSetMap(); | 140 DocumentElementSetMap& map = documentToElementSetMap(); |
| 135 HashSet<HTMLMediaElement*> set = map.take(document); | 141 WeakMediaElementSet set = map.take(document); |
| 136 set.add(element); | 142 set.add(element); |
| 137 map.add(document, set); | 143 map.add(document, set); |
| 138 } | 144 } |
| 139 | 145 |
| 140 static void removeElementFromDocumentMap(HTMLMediaElement* element, Document* do cument) | 146 static void removeElementFromDocumentMap(HTMLMediaElement* element, Document* do cument) |
| 141 { | 147 { |
| 142 DocumentElementSetMap& map = documentToElementSetMap(); | 148 DocumentElementSetMap& map = documentToElementSetMap(); |
| 143 HashSet<HTMLMediaElement*> set = map.take(document); | 149 WeakMediaElementSet set = map.take(document); |
| 144 set.remove(element); | 150 set.remove(element); |
| 145 if (!set.isEmpty()) | 151 if (!set.isEmpty()) |
| 146 map.add(document, set); | 152 map.add(document, set); |
| 147 } | 153 } |
| 148 | 154 |
| 149 class TrackDisplayUpdateScope { | 155 class TrackDisplayUpdateScope { |
| 150 public: | 156 public: |
| 151 TrackDisplayUpdateScope(HTMLMediaElement* mediaElement) | 157 TrackDisplayUpdateScope(HTMLMediaElement* mediaElement) |
| 152 { | 158 { |
| 153 m_mediaElement = mediaElement; | 159 m_mediaElement = mediaElement; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 311 m_textTracks->clearOwner(); | 317 m_textTracks->clearOwner(); |
| 312 #endif | 318 #endif |
| 313 | 319 |
| 314 if (m_mediaController) { | 320 if (m_mediaController) { |
| 315 m_mediaController->removeMediaElement(this); | 321 m_mediaController->removeMediaElement(this); |
| 316 m_mediaController = nullptr; | 322 m_mediaController = nullptr; |
| 317 } | 323 } |
| 318 | 324 |
| 319 closeMediaSource(); | 325 closeMediaSource(); |
| 320 | 326 |
| 327 #if !ENABLE(OILPAN) | |
| 321 removeElementFromDocumentMap(this, &document()); | 328 removeElementFromDocumentMap(this, &document()); |
| 329 #endif | |
| 322 | 330 |
| 323 // Destroying the player may cause a resource load to be canceled, | 331 // Destroying the player may cause a resource load to be canceled, |
| 324 // which could result in userCancelledLoad() being called back. | 332 // which could result in userCancelledLoad() being called back. |
| 325 // Setting m_completelyLoaded ensures that such a call will not cause | 333 // Setting m_completelyLoaded ensures that such a call will not cause |
| 326 // us to dispatch an abort event, which would result in a crash. | 334 // us to dispatch an abort event, which would result in a crash. |
| 327 // See http://crbug.com/233654 for more details. | 335 // See http://crbug.com/233654 for more details. |
| 328 m_completelyLoaded = true; | 336 m_completelyLoaded = true; |
| 329 | 337 |
| 338 // With Oilpan load events on the Document are always delayed during | |
| 339 // sweeping so we don't need to explicitly increment and decrement | |
| 340 // load event delay counts. | |
| 341 #if !ENABLE(OILPAN) | |
| 330 // Destroying the player may cause a resource load to be canceled, | 342 // Destroying the player may cause a resource load to be canceled, |
| 331 // which could result in Document::dispatchWindowLoadEvent() being | 343 // which could result in Document::dispatchWindowLoadEvent() being |
| 332 // called via ResourceFetch::didLoadResource() then | 344 // called via ResourceFetch::didLoadResource() then |
| 333 // FrameLoader::loadDone(). To prevent load event dispatching during | 345 // FrameLoader::loadDone(). To prevent load event dispatching during |
| 334 // object destruction, we use Document::incrementLoadEventDelayCount(). | 346 // object destruction, we use Document::incrementLoadEventDelayCount(). |
| 335 // See http://crbug.com/275223 for more details. | 347 // See http://crbug.com/275223 for more details. |
| 336 document().incrementLoadEventDelayCount(); | 348 document().incrementLoadEventDelayCount(); |
| 349 #endif | |
| 337 | 350 |
| 338 clearMediaPlayerAndAudioSourceProviderClient(); | 351 clearMediaPlayerAndAudioSourceProviderClient(); |
| 339 | 352 |
| 353 #if !ENABLE(OILPAN) | |
| 340 document().decrementLoadEventDelayCount(); | 354 document().decrementLoadEventDelayCount(); |
| 355 #endif | |
| 341 } | 356 } |
| 342 | 357 |
| 343 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) | 358 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) |
| 344 { | 359 { |
| 345 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument"); | 360 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument"); |
| 346 | 361 |
| 347 if (m_shouldDelayLoadEvent) { | 362 if (m_shouldDelayLoadEvent) { |
| 348 document().incrementLoadEventDelayCount(); | 363 document().incrementLoadEventDelayCount(); |
| 349 // Note: Keeping the load event delay count increment on oldDocument tha t was added | 364 // Note: Keeping the load event delay count increment on oldDocument tha t was added |
| 350 // when m_shouldDelayLoadEvent was set so that destruction of m_player c an not | 365 // when m_shouldDelayLoadEvent was set so that destruction of m_player c an not |
| (...skipping 3120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3471 // 1. Let m [this] be the media element in question. | 3486 // 1. Let m [this] be the media element in question. |
| 3472 // 2. Let m have no current media controller, if it currently has one. | 3487 // 2. Let m have no current media controller, if it currently has one. |
| 3473 setControllerInternal(nullptr); | 3488 setControllerInternal(nullptr); |
| 3474 | 3489 |
| 3475 // 3. If m's mediagroup attribute is being removed, then abort these steps. | 3490 // 3. If m's mediagroup attribute is being removed, then abort these steps. |
| 3476 if (group.isNull() || group.isEmpty()) | 3491 if (group.isNull() || group.isEmpty()) |
| 3477 return; | 3492 return; |
| 3478 | 3493 |
| 3479 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both | 3494 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both |
| 3480 // of these elements are not actually in the Document), | 3495 // of these elements are not actually in the Document), |
| 3481 HashSet<HTMLMediaElement*> elements = documentToElementSetMap().get(&documen t()); | 3496 WeakMediaElementSet elements = documentToElementSetMap().get(&document()); |
| 3482 for (HashSet<HTMLMediaElement*>::iterator i = elements.begin(); i != element s.end(); ++i) { | 3497 for (WeakMediaElementSet::iterator i = elements.begin(); i != elements.end() ; ++i) { |
| 3483 if (*i == this) | 3498 if (*i == this) |
| 3484 continue; | 3499 continue; |
| 3485 | 3500 |
| 3486 // and which also has a mediagroup attribute, and whose mediagroup attri bute has the same value as | 3501 // and which also has a mediagroup attribute, and whose mediagroup attri bute has the same value as |
| 3487 // the new value of m's mediagroup attribute, | 3502 // the new value of m's mediagroup attribute, |
| 3488 if ((*i)->mediaGroup() == group) { | 3503 if ((*i)->mediaGroup() == group) { |
| 3489 // then let controller be that media element's current media contro ller. | 3504 // then let controller be that media element's current media contro ller. |
| 3490 setControllerInternal((*i)->controller()); | 3505 setControllerInternal((*i)->controller()); |
| 3491 return; | 3506 return; |
| 3492 } | 3507 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3633 | 3648 |
| 3634 void HTMLMediaElement::trace(Visitor* visitor) | 3649 void HTMLMediaElement::trace(Visitor* visitor) |
| 3635 { | 3650 { |
| 3636 visitor->trace(m_textTracks); | 3651 visitor->trace(m_textTracks); |
| 3637 visitor->trace(m_textTracksWhenResourceSelectionBegan); | 3652 visitor->trace(m_textTracksWhenResourceSelectionBegan); |
| 3638 Supplementable<HTMLMediaElement>::trace(visitor); | 3653 Supplementable<HTMLMediaElement>::trace(visitor); |
| 3639 HTMLElement::trace(visitor); | 3654 HTMLElement::trace(visitor); |
| 3640 } | 3655 } |
| 3641 | 3656 |
| 3642 } | 3657 } |
| OLD | NEW |