| Index: chrome/browser/extensions/extension_io_event_router.cc | 
| diff --git a/chrome/browser/extensions/extension_io_event_router.cc b/chrome/browser/extensions/extension_io_event_router.cc | 
| index 5beb4b8ffc59cec47dd3613d769a66f1e81bffea..38c4d31d2eb76affa6120636110eb6666beaf91e 100644 | 
| --- a/chrome/browser/extensions/extension_io_event_router.cc | 
| +++ b/chrome/browser/extensions/extension_io_event_router.cc | 
| @@ -27,6 +27,17 @@ void ExtensionIOEventRouter::DispatchEventToExtension( | 
| extension_id, event_name, event_args)); | 
| } | 
|  | 
| +void ExtensionIOEventRouter::DispatchEventToRenderers( | 
| +    const std::string& event_name, | 
| +    const std::string& event_args, | 
| +    const GURL& url) const { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| +  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 
| +      NewRunnableMethod(this, | 
| +          &ExtensionIOEventRouter::DispatchEventToRenderersOnUIThread, | 
| +          event_name, event_args, url)); | 
| +} | 
| + | 
| void ExtensionIOEventRouter::DispatchEventOnUIThread( | 
| const std::string& extension_id, | 
| const std::string& event_name, | 
| @@ -41,3 +52,18 @@ void ExtensionIOEventRouter::DispatchEventOnUIThread( | 
| profile_->GetExtensionEventRouter()->DispatchEventToExtension( | 
| extension_id, event_name, event_args, profile_, GURL()); | 
| } | 
| + | 
| +void ExtensionIOEventRouter::DispatchEventToRenderersOnUIThread( | 
| +    const std::string& event_name, | 
| +    const std::string& event_args, | 
| +    const GURL& url) const { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| + | 
| +  // If the profile has gone away, we're shutting down. If there's no event | 
| +  // router, the extension system hasn't been initialized. | 
| +  if (!profile_ || !profile_->GetExtensionEventRouter()) | 
| +    return; | 
| + | 
| +  profile_->GetExtensionEventRouter()->DispatchEventToRenderers( | 
| +      event_name, event_args, profile_, url); | 
| +} | 
|  |