Bug 1342883 - part2: Once a MediaElement receive document unload event, remove all MediaElements in gElementTable with the same uri. r=jwwang
MozReview-Commit-ID: 7Z0ouKsebp8
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -3704,32 +3704,36 @@ HTMLMediaElement::AddMediaElementToURITa
}
MediaElementSetForURI* entry = gElementTable->PutEntry(mLoadingSrc);
entry->mElements.AppendElement(this);
NS_ASSERTION(MediaElementTableCount(this, mLoadingSrc) == 1,
"Should have a single entry for element in element table after addition");
}
void
-HTMLMediaElement::RemoveMediaElementFromURITable()
+HTMLMediaElement::RemoveMediaElementFromURITable(bool aRemoveSameURI)
{
if (!mDecoder || !mLoadingSrc || !gElementTable) {
return;
}
MediaElementSetForURI* entry = gElementTable->GetEntry(mLoadingSrc);
if (!entry) {
return;
}
- entry->mElements.RemoveElement(this);
- if (entry->mElements.IsEmpty()) {
+ if (aRemoveSameURI) {
gElementTable->RemoveEntry(entry);
- if (gElementTable->Count() == 0) {
- delete gElementTable;
- gElementTable = nullptr;
- }
+ } else {
+ entry->mElements.RemoveElement(this);
+ if (entry->mElements.IsEmpty()) {
+ gElementTable->RemoveEntry(entry);
+ }
+ }
+ if (gElementTable->Count() == 0) {
+ delete gElementTable;
+ gElementTable = nullptr;
}
NS_ASSERTION(MediaElementTableCount(this, mLoadingSrc) == 0,
"After remove, should no longer have an entry in element table");
}
HTMLMediaElement*
HTMLMediaElement::LookupMediaElementURITable(nsIURI* aURI)
{
@@ -6365,16 +6369,17 @@ void HTMLMediaElement::NotifyOwnerDocume
mMediaKeys->Shutdown();
mMediaKeys = nullptr;
if (mDecoder) {
ShutdownDecoder();
}
}
if (aDocumentUnload && mDecoder) {
+ RemoveMediaElementFromURITable(true);
ShutdownDecoder();
}
AddRemoveSelfReference();
}
void HTMLMediaElement::AddRemoveSelfReference()
{
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -981,17 +981,17 @@ protected:
/**
* Call this after setting up mLoadingSrc and mDecoder.
*/
void AddMediaElementToURITable();
/**
* Call this before modifying mLoadingSrc.
*/
- void RemoveMediaElementFromURITable();
+ void RemoveMediaElementFromURITable(bool aRemoveSameURI = false);
/**
* Call this to find a media element with the same NodePrincipal and mLoadingSrc
* set to aURI, and with a decoder on which Load() has been called.
*/
HTMLMediaElement* LookupMediaElementURITable(nsIURI* aURI);
/**
* Shutdown and clear mDecoder and maintain associated invariants.