зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1195700 - Disconnect performance observer before being destroyed to avoid crash. r=baku
This commit is contained in:
Родитель
20d2ab1555
Коммит
1230305e9a
|
@ -38,6 +38,7 @@ PerformanceObserver::PerformanceObserver(nsPIDOMWindow* aOwner,
|
|||
PerformanceObserverCallback& aCb)
|
||||
: mOwner(aOwner)
|
||||
, mCallback(&aCb)
|
||||
, mConnected(false)
|
||||
{
|
||||
MOZ_ASSERT(mOwner);
|
||||
mPerformance = aOwner->GetPerformance();
|
||||
|
@ -46,6 +47,7 @@ PerformanceObserver::PerformanceObserver(nsPIDOMWindow* aOwner,
|
|||
PerformanceObserver::PerformanceObserver(WorkerPrivate* aWorkerPrivate,
|
||||
PerformanceObserverCallback& aCb)
|
||||
: mCallback(&aCb)
|
||||
, mConnected(false)
|
||||
{
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
mPerformance = aWorkerPrivate->GlobalScope()->GetPerformance();
|
||||
|
@ -53,6 +55,8 @@ PerformanceObserver::PerformanceObserver(WorkerPrivate* aWorkerPrivate,
|
|||
|
||||
PerformanceObserver::~PerformanceObserver()
|
||||
{
|
||||
Disconnect();
|
||||
MOZ_ASSERT(!mConnected);
|
||||
}
|
||||
|
||||
// static
|
||||
|
@ -145,10 +149,15 @@ PerformanceObserver::Observe(const PerformanceObserverInit& aOptions,
|
|||
mEntryTypes = validEntryTypes;
|
||||
|
||||
mPerformance->AddObserver(this);
|
||||
mConnected = true;
|
||||
}
|
||||
|
||||
void
|
||||
PerformanceObserver::Disconnect()
|
||||
{
|
||||
mPerformance->RemoveObserver(this);
|
||||
if (mConnected) {
|
||||
MOZ_ASSERT(mPerformance);
|
||||
mPerformance->RemoveObserver(this);
|
||||
mConnected = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,7 @@ private:
|
|||
nsRefPtr<PerformanceObserverCallback> mCallback;
|
||||
nsRefPtr<PerformanceBase> mPerformance;
|
||||
nsTArray<nsString> mEntryTypes;
|
||||
bool mConnected;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
|
|
@ -48,6 +48,7 @@ async_test(t => {
|
|||
observedEntryList = list;
|
||||
});
|
||||
observer.observe({entryTypes: ['resource']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
assert_equals(observedEntries.length, 0);
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ test(t => {
|
|||
list.getEntries().forEach(entry => observedEntries.push(entry));
|
||||
});
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
assert_equals(observedEntries.length, 0,
|
||||
"User timing entries should never be observed.");
|
||||
|
@ -107,6 +108,7 @@ test(t => {
|
|||
observedEntryList = list;
|
||||
});
|
||||
observer.observe({entryTypes: ['mark']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test");
|
||||
assert_array_equals(observedEntryList.getEntries({"entryType": "mark"}),
|
||||
|
@ -150,6 +152,7 @@ test(t => {
|
|||
observedEntryList = list;
|
||||
});
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test");
|
||||
assert_array_equals(observedEntryList.getEntriesByType("mark"),
|
||||
|
@ -169,6 +172,7 @@ test(t => {
|
|||
observedEntryList = list;
|
||||
});
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test");
|
||||
assert_array_equals(observedEntryList.getEntriesByName("test"),
|
||||
|
@ -190,6 +194,7 @@ test(t => {
|
|||
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test-start");
|
||||
performance.mark("test-end");
|
||||
|
@ -210,6 +215,7 @@ test(t => {
|
|||
|
||||
observer.observe({entryTypes: ['mark', 'measure']});
|
||||
observer.observe({entryTypes: ['mark']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test-start");
|
||||
performance.mark("test-end");
|
||||
|
@ -230,6 +236,7 @@ test(t => {
|
|||
|
||||
observer.observe({entryTypes: ['mark']});
|
||||
observer.observe({entryTypes: ['measure']});
|
||||
t.add_cleanup(() => observer.disconnect());
|
||||
|
||||
performance.mark("test-start");
|
||||
performance.mark("test-end");
|
||||
|
|
Загрузка…
Ссылка в новой задаче