diff --git a/extensions/metrics/src/nsUICommandCollector.cpp b/extensions/metrics/src/nsUICommandCollector.cpp index 691d7394e18a..99b5666ebcb9 100644 --- a/extensions/metrics/src/nsUICommandCollector.cpp +++ b/extensions/metrics/src/nsUICommandCollector.cpp @@ -59,6 +59,32 @@ NS_IMPL_ISUPPORTS3(nsUICommandCollector, nsIObserver, nsIDOMEventListener, nsIMetricsCollector) +/* static */ +PLDHashOperator PR_CALLBACK nsUICommandCollector::AddCommandEventListener( +const nsIDOMWindow* key, PRUint32 windowID, void* userArg) +{ + nsCOMPtr windowTarget = + do_QueryInterface(NS_CONST_CAST(nsIDOMWindow *, key)); + if (!windowTarget) { + MS_LOG(("Error casting domeventtarget")); + return PL_DHASH_NEXT; + } + + nsIDOMEventListener* listener = NS_STATIC_CAST(nsIDOMEventListener*, + userArg); + if (!listener) { + MS_LOG(("no event listener in userArg")); + return PL_DHASH_NEXT; + } + + nsresult rv = windowTarget->AddEventListener(NS_LITERAL_STRING("command"), + listener, PR_TRUE); + if (NS_FAILED(rv)) { + MS_LOG(("Warning: Adding event listener failed")); + } + return PL_DHASH_NEXT; +} + /* static */ PLDHashOperator PR_CALLBACK nsUICommandCollector::RemoveCommandEventListener( const nsIDOMWindow* key, PRUint32 windowID, void* userArg) @@ -106,6 +132,14 @@ nsUICommandCollector::OnAttach() // listener to each window rv = obsSvc->AddObserver(this, "domwindowopened", PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); + + // Attach to all existing windows + nsMetricsService *ms = nsMetricsService::get(); + NS_ENSURE_STATE(ms); + + ms->WindowMap().EnumerateRead(AddCommandEventListener, + NS_STATIC_CAST(nsIDOMEventListener*, this)); + return NS_OK; } diff --git a/extensions/metrics/src/nsUICommandCollector.h b/extensions/metrics/src/nsUICommandCollector.h index 404ef036d49f..1203b094c377 100644 --- a/extensions/metrics/src/nsUICommandCollector.h +++ b/extensions/metrics/src/nsUICommandCollector.h @@ -58,6 +58,9 @@ class nsUICommandCollector : public nsIObserver, NS_DECL_NSIDOMEVENTLISTENER NS_DECL_NSIMETRICSCOLLECTOR + static PLDHashOperator PR_CALLBACK AddCommandEventListener( + const nsIDOMWindow* key, PRUint32 windowID, void* userArg); + static PLDHashOperator PR_CALLBACK RemoveCommandEventListener( const nsIDOMWindow* key, PRUint32 windowID, void* userArg);