| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "chrome/browser/extensions/extension_host.h" |    5 #include "chrome/browser/extensions/extension_host.h" | 
|    6  |    6  | 
|    7 #include <list> |    7 #include <list> | 
|    8  |    8  | 
|    9 #include "base/bind.h" |    9 #include "base/bind.h" | 
|   10 #include "base/memory/singleton.h" |   10 #include "base/memory/singleton.h" | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   22 #include "chrome/browser/extensions/window_controller.h" |   22 #include "chrome/browser/extensions/window_controller.h" | 
|   23 #include "chrome/browser/file_select_helper.h" |   23 #include "chrome/browser/file_select_helper.h" | 
|   24 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |   24 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 
|   25 #include "chrome/browser/profiles/profile.h" |   25 #include "chrome/browser/profiles/profile.h" | 
|   26 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" |   26 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" | 
|   27 #include "chrome/browser/ui/browser.h" |   27 #include "chrome/browser/ui/browser.h" | 
|   28 #include "chrome/browser/ui/browser_finder.h" |   28 #include "chrome/browser/ui/browser_finder.h" | 
|   29 #include "chrome/browser/ui/browser_list.h" |   29 #include "chrome/browser/ui/browser_list.h" | 
|   30 #include "chrome/browser/ui/browser_window.h" |   30 #include "chrome/browser/ui/browser_window.h" | 
|   31 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |   31 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" | 
|   32 #include "chrome/browser/view_type_utils.h" |  | 
|   33 #include "chrome/common/chrome_constants.h" |   32 #include "chrome/common/chrome_constants.h" | 
|   34 #include "chrome/common/chrome_notification_types.h" |   33 #include "chrome/common/chrome_notification_types.h" | 
|   35 #include "chrome/common/extensions/background_info.h" |   34 #include "chrome/common/extensions/background_info.h" | 
|   36 #include "chrome/common/extensions/extension.h" |   35 #include "chrome/common/extensions/extension.h" | 
|   37 #include "chrome/common/extensions/extension_constants.h" |   36 #include "chrome/common/extensions/extension_constants.h" | 
|   38 #include "chrome/common/extensions/extension_messages.h" |   37 #include "chrome/common/extensions/extension_messages.h" | 
|   39 #include "chrome/common/extensions/feature_switch.h" |   38 #include "chrome/common/extensions/feature_switch.h" | 
|   40 #include "chrome/common/extensions/request_media_access_permission_helper.h" |   39 #include "chrome/common/extensions/request_media_access_permission_helper.h" | 
|   41 #include "chrome/common/render_messages.h" |   40 #include "chrome/common/render_messages.h" | 
|   42 #include "chrome/common/url_constants.h" |   41 #include "chrome/common/url_constants.h" | 
|   43 #include "content/public/browser/content_browser_client.h" |   42 #include "content/public/browser/content_browser_client.h" | 
|   44 #include "content/public/browser/native_web_keyboard_event.h" |   43 #include "content/public/browser/native_web_keyboard_event.h" | 
|   45 #include "content/public/browser/notification_service.h" |   44 #include "content/public/browser/notification_service.h" | 
|   46 #include "content/public/browser/render_process_host.h" |   45 #include "content/public/browser/render_process_host.h" | 
|   47 #include "content/public/browser/render_view_host.h" |   46 #include "content/public/browser/render_view_host.h" | 
|   48 #include "content/public/browser/site_instance.h" |   47 #include "content/public/browser/site_instance.h" | 
|   49 #include "content/public/browser/web_contents.h" |   48 #include "content/public/browser/web_contents.h" | 
|   50 #include "content/public/browser/web_contents_view.h" |   49 #include "content/public/browser/web_contents_view.h" | 
 |   50 #include "extensions/browser/view_type_utils.h" | 
|   51 #include "grit/browser_resources.h" |   51 #include "grit/browser_resources.h" | 
|   52 #include "grit/chromium_strings.h" |   52 #include "grit/chromium_strings.h" | 
|   53 #include "grit/generated_resources.h" |   53 #include "grit/generated_resources.h" | 
|   54 #include "ui/base/keycodes/keyboard_codes.h" |   54 #include "ui/base/keycodes/keyboard_codes.h" | 
|   55 #include "ui/base/l10n/l10n_util.h" |   55 #include "ui/base/l10n/l10n_util.h" | 
|   56 #include "ui/base/resource/resource_bundle.h" |   56 #include "ui/base/resource/resource_bundle.h" | 
|   57  |   57  | 
|   58 using WebKit::WebDragOperation; |   58 using WebKit::WebDragOperation; | 
|   59 using WebKit::WebDragOperationsMask; |   59 using WebKit::WebDragOperationsMask; | 
|   60 using content::NativeWebKeyboardEvent; |   60 using content::NativeWebKeyboardEvent; | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  121   bool pending_create_; |  121   bool pending_create_; | 
|  122   base::WeakPtrFactory<ProcessCreationQueue> ptr_factory_; |  122   base::WeakPtrFactory<ProcessCreationQueue> ptr_factory_; | 
|  123 }; |  123 }; | 
|  124  |  124  | 
|  125 //////////////// |  125 //////////////// | 
|  126 // ExtensionHost |  126 // ExtensionHost | 
|  127  |  127  | 
|  128 ExtensionHost::ExtensionHost(const Extension* extension, |  128 ExtensionHost::ExtensionHost(const Extension* extension, | 
|  129                              SiteInstance* site_instance, |  129                              SiteInstance* site_instance, | 
|  130                              const GURL& url, |  130                              const GURL& url, | 
|  131                              chrome::ViewType host_type) |  131                              ViewType host_type) | 
|  132     : extension_(extension), |  132     : extension_(extension), | 
|  133       extension_id_(extension->id()), |  133       extension_id_(extension->id()), | 
|  134       profile_(Profile::FromBrowserContext( |  134       profile_(Profile::FromBrowserContext( | 
|  135           site_instance->GetBrowserContext())), |  135           site_instance->GetBrowserContext())), | 
|  136       render_view_host_(NULL), |  136       render_view_host_(NULL), | 
|  137       did_stop_loading_(false), |  137       did_stop_loading_(false), | 
|  138       document_element_available_(false), |  138       document_element_available_(false), | 
|  139       initial_url_(url), |  139       initial_url_(url), | 
|  140       ALLOW_THIS_IN_INITIALIZER_LIST( |  140       ALLOW_THIS_IN_INITIALIZER_LIST( | 
|  141           extension_function_dispatcher_(profile_, this)), |  141           extension_function_dispatcher_(profile_, this)), | 
|  142       extension_host_type_(host_type), |  142       extension_host_type_(host_type), | 
|  143       associated_web_contents_(NULL) { |  143       associated_web_contents_(NULL) { | 
|  144   host_contents_.reset(WebContents::Create( |  144   host_contents_.reset(WebContents::Create( | 
|  145       WebContents::CreateParams(profile_, site_instance))), |  145       WebContents::CreateParams(profile_, site_instance))), | 
|  146   content::WebContentsObserver::Observe(host_contents_.get()); |  146   content::WebContentsObserver::Observe(host_contents_.get()); | 
|  147   host_contents_->SetDelegate(this); |  147   host_contents_->SetDelegate(this); | 
|  148   chrome::SetViewType(host_contents_.get(), host_type); |  148   SetViewType(host_contents_.get(), host_type); | 
|  149  |  149  | 
|  150   PrefsTabHelper::CreateForWebContents(host_contents()); |  150   PrefsTabHelper::CreateForWebContents(host_contents()); | 
|  151  |  151  | 
|  152   render_view_host_ = host_contents_->GetRenderViewHost(); |  152   render_view_host_ = host_contents_->GetRenderViewHost(); | 
|  153  |  153  | 
|  154   // Listen for when an extension is unloaded from the same profile, as it may |  154   // Listen for when an extension is unloaded from the same profile, as it may | 
|  155   // be the same extension that this points to. |  155   // be the same extension that this points to. | 
|  156   registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |  156   registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 
|  157                  content::Source<Profile>(profile_)); |  157                  content::Source<Profile>(profile_)); | 
|  158 } |  158 } | 
|  159  |  159  | 
|  160 ExtensionHost::~ExtensionHost() { |  160 ExtensionHost::~ExtensionHost() { | 
|  161   if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && |  161   if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && | 
|  162       extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { |  162       extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { | 
|  163     UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime", |  163     UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime", | 
|  164                              since_created_.Elapsed()); |  164                              since_created_.Elapsed()); | 
|  165   } |  165   } | 
|  166   // Clear the extension's renderer process out from any WebContents |  166   // Clear the extension's renderer process out from any WebContents | 
|  167   // that might have it in their back history. |  167   // that might have it in their back history. | 
|  168   // TODO(jyasskin): Remove this hack by making extension reloading |  168   // TODO(jyasskin): Remove this hack by making extension reloading | 
|  169   // wait for renderer shutdown. |  169   // wait for renderer shutdown. | 
|  170   content::NotificationService::current()->Notify( |  170   content::NotificationService::current()->Notify( | 
|  171       content::NOTIFICATION_RENDERER_PROCESS_CLOSING, |  171       content::NOTIFICATION_RENDERER_PROCESS_CLOSING, | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  231     CreateRenderViewNow(); |  231     CreateRenderViewNow(); | 
|  232   } else { |  232   } else { | 
|  233     ProcessCreationQueue::GetInstance()->CreateSoon(this); |  233     ProcessCreationQueue::GetInstance()->CreateSoon(this); | 
|  234   } |  234   } | 
|  235 } |  235 } | 
|  236  |  236  | 
|  237 void ExtensionHost::CreateRenderViewNow() { |  237 void ExtensionHost::CreateRenderViewNow() { | 
|  238   LoadInitialURL(); |  238   LoadInitialURL(); | 
|  239   if (is_background_page()) { |  239   if (is_background_page()) { | 
|  240     DCHECK(IsRenderViewLive()); |  240     DCHECK(IsRenderViewLive()); | 
|  241     extensions::ExtensionSystem::Get(profile_)->extension_service()-> |  241     ExtensionSystem::Get(profile_)->extension_service()-> | 
|  242         DidCreateRenderViewForBackgroundPage(this); |  242         DidCreateRenderViewForBackgroundPage(this); | 
|  243   } |  243   } | 
|  244 } |  244 } | 
|  245  |  245  | 
|  246 extensions::WindowController* |  246 WindowController* ExtensionHost::GetExtensionWindowController() const { | 
|  247 ExtensionHost::GetExtensionWindowController() const { |  | 
|  248   return view() && view()->browser() ? |  247   return view() && view()->browser() ? | 
|  249       view()->browser()->extension_window_controller() : NULL; |  248       view()->browser()->extension_window_controller() : NULL; | 
|  250 } |  249 } | 
|  251  |  250  | 
|  252 const GURL& ExtensionHost::GetURL() const { |  251 const GURL& ExtensionHost::GetURL() const { | 
|  253   return host_contents()->GetURL(); |  252   return host_contents()->GetURL(); | 
|  254 } |  253 } | 
|  255  |  254  | 
|  256 void ExtensionHost::LoadInitialURL() { |  255 void ExtensionHost::LoadInitialURL() { | 
|  257   if (!is_background_page() && |  256   if (!is_background_page() && | 
|  258       !extensions::ExtensionSystem::Get(profile_)->extension_service()-> |  257       !ExtensionSystem::Get(profile_)->extension_service()-> | 
|  259           IsBackgroundPageReady(extension_)) { |  258           IsBackgroundPageReady(extension_)) { | 
|  260     // Make sure the background page loads before any others. |  259     // Make sure the background page loads before any others. | 
|  261     registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY, |  260     registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY, | 
|  262                    content::Source<Extension>(extension_)); |  261                    content::Source<Extension>(extension_)); | 
|  263     return; |  262     return; | 
|  264   } |  263   } | 
|  265  |  264  | 
|  266   host_contents_->GetController().LoadURL( |  265   host_contents_->GetController().LoadURL( | 
|  267       initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, |  266       initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, | 
|  268       std::string()); |  267       std::string()); | 
|  269 } |  268 } | 
|  270  |  269  | 
|  271 void ExtensionHost::Close() { |  270 void ExtensionHost::Close() { | 
|  272   content::NotificationService::current()->Notify( |  271   content::NotificationService::current()->Notify( | 
|  273       chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |  272       chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 
|  274       content::Source<Profile>(profile_), |  273       content::Source<Profile>(profile_), | 
|  275       content::Details<ExtensionHost>(this)); |  274       content::Details<ExtensionHost>(this)); | 
|  276 } |  275 } | 
|  277  |  276  | 
|  278 void ExtensionHost::Observe(int type, |  277 void ExtensionHost::Observe(int type, | 
|  279                             const content::NotificationSource& source, |  278                             const content::NotificationSource& source, | 
|  280                             const content::NotificationDetails& details) { |  279                             const content::NotificationDetails& details) { | 
|  281   switch (type) { |  280   switch (type) { | 
|  282     case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY: |  281     case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY: | 
|  283       DCHECK(extensions::ExtensionSystem::Get(profile_)->extension_service()-> |  282       DCHECK(ExtensionSystem::Get(profile_)->extension_service()-> | 
|  284           IsBackgroundPageReady(extension_)); |  283           IsBackgroundPageReady(extension_)); | 
|  285       LoadInitialURL(); |  284       LoadInitialURL(); | 
|  286       break; |  285       break; | 
|  287     case chrome::NOTIFICATION_EXTENSION_UNLOADED: |  286     case chrome::NOTIFICATION_EXTENSION_UNLOADED: | 
|  288       // The extension object will be deleted after this notification has been |  287       // The extension object will be deleted after this notification has been | 
|  289       // sent. NULL it out so that dirty pointer issues don't arise in cases |  288       // sent. NULL it out so that dirty pointer issues don't arise in cases | 
|  290       // when multiple ExtensionHost objects pointing to the same Extension are |  289       // when multiple ExtensionHost objects pointing to the same Extension are | 
|  291       // present. |  290       // present. | 
|  292       if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> |  291       if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> | 
|  293           extension) { |  292           extension) { | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  343   static const base::StringPiece css( |  342   static const base::StringPiece css( | 
|  344       ResourceBundle::GetSharedInstance().GetRawDataResource( |  343       ResourceBundle::GetSharedInstance().GetRawDataResource( | 
|  345       IDR_EXTENSIONS_INFOBAR_CSS)); |  344       IDR_EXTENSIONS_INFOBAR_CSS)); | 
|  346  |  345  | 
|  347   render_view_host()->InsertCSS(string16(), css.as_string()); |  346   render_view_host()->InsertCSS(string16(), css.as_string()); | 
|  348 } |  347 } | 
|  349  |  348  | 
|  350 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) { |  349 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) { | 
|  351   bool notify = !did_stop_loading_; |  350   bool notify = !did_stop_loading_; | 
|  352   did_stop_loading_ = true; |  351   did_stop_loading_ = true; | 
|  353   if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |  352   if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP || | 
|  354       extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |  353       extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG || | 
|  355       extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |  354       extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR || | 
|  356       extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |  355       extension_host_type_ == VIEW_TYPE_PANEL) { | 
|  357 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) |  356 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) | 
|  358     if (view()) |  357     if (view()) | 
|  359       view()->DidStopLoading(); |  358       view()->DidStopLoading(); | 
|  360 #endif |  359 #endif | 
|  361   } |  360   } | 
|  362   if (notify) { |  361   if (notify) { | 
|  363     if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |  362     if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { | 
|  364       if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { |  363       if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { | 
|  365         UMA_HISTOGRAM_TIMES("Extensions.EventPageLoadTime", |  364         UMA_HISTOGRAM_TIMES("Extensions.EventPageLoadTime", | 
|  366                             since_created_.Elapsed()); |  365                             since_created_.Elapsed()); | 
|  367       } else { |  366       } else { | 
|  368         UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", |  367         UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", | 
|  369                             since_created_.Elapsed()); |  368                             since_created_.Elapsed()); | 
|  370       } |  369       } | 
|  371     } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { |  370     } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG) { | 
|  372       UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", |  371       UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", | 
|  373                           since_created_.Elapsed()); |  372                           since_created_.Elapsed()); | 
|  374     } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { |  373     } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) { | 
|  375       UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", |  374       UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", | 
|  376                           since_created_.Elapsed()); |  375                           since_created_.Elapsed()); | 
|  377     } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { |  376     } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR) { | 
|  378       UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", |  377       UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", | 
|  379         since_created_.Elapsed()); |  378         since_created_.Elapsed()); | 
|  380     } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |  379     } else if (extension_host_type_ == VIEW_TYPE_PANEL) { | 
|  381       UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); |  380       UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); | 
|  382     } |  381     } | 
|  383  |  382  | 
|  384     // Send the notification last, because it might result in this being |  383     // Send the notification last, because it might result in this being | 
|  385     // deleted. |  384     // deleted. | 
|  386     content::NotificationService::current()->Notify( |  385     content::NotificationService::current()->Notify( | 
|  387         chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |  386         chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, | 
|  388         content::Source<Profile>(profile_), |  387         content::Source<Profile>(profile_), | 
|  389         content::Details<ExtensionHost>(this)); |  388         content::Details<ExtensionHost>(this)); | 
|  390   } |  389   } | 
|  391 } |  390 } | 
|  392  |  391  | 
|  393 void ExtensionHost::DocumentAvailableInMainFrame() { |  392 void ExtensionHost::DocumentAvailableInMainFrame() { | 
|  394   // If the document has already been marked as available for this host, then |  393   // If the document has already been marked as available for this host, then | 
|  395   // bail. No need for the redundant setup. http://crbug.com/31170 |  394   // bail. No need for the redundant setup. http://crbug.com/31170 | 
|  396   if (document_element_available_) |  395   if (document_element_available_) | 
|  397     return; |  396     return; | 
|  398  |  397  | 
|  399   document_element_available_ = true; |  398   document_element_available_ = true; | 
|  400   if (is_background_page()) { |  399   if (is_background_page()) { | 
|  401     extensions::ExtensionSystem::Get(profile_)->extension_service()-> |  400     ExtensionSystem::Get(profile_)->extension_service()-> | 
|  402         SetBackgroundPageReady(extension_); |  401         SetBackgroundPageReady(extension_); | 
|  403   } else { |  402   } else { | 
|  404     switch (extension_host_type_) { |  403     switch (extension_host_type_) { | 
|  405       case chrome::VIEW_TYPE_EXTENSION_INFOBAR: |  404       case VIEW_TYPE_EXTENSION_INFOBAR: | 
|  406         InsertInfobarCSS(); |  405         InsertInfobarCSS(); | 
|  407         break; |  406         break; | 
|  408       default: |  407       default: | 
|  409         break;  // No style sheet for other types, at the moment. |  408         break;  // No style sheet for other types, at the moment. | 
|  410     } |  409     } | 
|  411   } |  410   } | 
|  412 } |  411 } | 
|  413  |  412  | 
|  414 void ExtensionHost::CloseContents(WebContents* contents) { |  413 void ExtensionHost::CloseContents(WebContents* contents) { | 
|  415   // TODO(mpcomplete): is this check really necessary? |  414   // TODO(mpcomplete): is this check really necessary? | 
|  416   if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |  415   if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP || | 
|  417       extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |  416       extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG || | 
|  418       extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || |  417       extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || | 
|  419       extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |  418       extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR || | 
|  420       extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |  419       extension_host_type_ == VIEW_TYPE_PANEL) { | 
|  421     Close(); |  420     Close(); | 
|  422   } |  421   } | 
|  423 } |  422 } | 
|  424  |  423  | 
|  425 void ExtensionHost::WillRunJavaScriptDialog() { |  424 void ExtensionHost::WillRunJavaScriptDialog() { | 
|  426   ExtensionProcessManager* pm = |  425   ExtensionProcessManager* pm = | 
|  427       ExtensionSystem::Get(profile_)->process_manager(); |  426       ExtensionSystem::Get(profile_)->process_manager(); | 
|  428   if (pm) |  427   if (pm) | 
|  429     pm->IncrementLazyKeepaliveCount(extension()); |  428     pm->IncrementLazyKeepaliveCount(extension()); | 
|  430 } |  429 } | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  453       return browser ? browser->OpenURL(params) : NULL; |  452       return browser ? browser->OpenURL(params) : NULL; | 
|  454     } |  453     } | 
|  455     default: |  454     default: | 
|  456       return NULL; |  455       return NULL; | 
|  457   } |  456   } | 
|  458 } |  457 } | 
|  459  |  458  | 
|  460 bool ExtensionHost::PreHandleKeyboardEvent(WebContents* source, |  459 bool ExtensionHost::PreHandleKeyboardEvent(WebContents* source, | 
|  461                                            const NativeWebKeyboardEvent& event, |  460                                            const NativeWebKeyboardEvent& event, | 
|  462                                            bool* is_keyboard_shortcut) { |  461                                            bool* is_keyboard_shortcut) { | 
|  463   if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP && |  462   if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP && | 
|  464       event.type == NativeWebKeyboardEvent::RawKeyDown && |  463       event.type == NativeWebKeyboardEvent::RawKeyDown && | 
|  465       event.windowsKeyCode == ui::VKEY_ESCAPE) { |  464       event.windowsKeyCode == ui::VKEY_ESCAPE) { | 
|  466     DCHECK(is_keyboard_shortcut != NULL); |  465     DCHECK(is_keyboard_shortcut != NULL); | 
|  467     *is_keyboard_shortcut = true; |  466     *is_keyboard_shortcut = true; | 
|  468     return false; |  467     return false; | 
|  469   } |  468   } | 
|  470  |  469  | 
|  471   // Handle higher priority browser shortcuts such as Ctrl-w. |  470   // Handle higher priority browser shortcuts such as Ctrl-w. | 
|  472   Browser* browser = view() ? view()->browser() : NULL; |  471   Browser* browser = view() ? view()->browser() : NULL; | 
|  473   if (browser) |  472   if (browser) | 
|  474     return browser->PreHandleKeyboardEvent(source, event, is_keyboard_shortcut); |  473     return browser->PreHandleKeyboardEvent(source, event, is_keyboard_shortcut); | 
|  475  |  474  | 
|  476   *is_keyboard_shortcut = false; |  475   *is_keyboard_shortcut = false; | 
|  477   return false; |  476   return false; | 
|  478 } |  477 } | 
|  479  |  478  | 
|  480 void ExtensionHost::HandleKeyboardEvent(WebContents* source, |  479 void ExtensionHost::HandleKeyboardEvent(WebContents* source, | 
|  481                                         const NativeWebKeyboardEvent& event) { |  480                                         const NativeWebKeyboardEvent& event) { | 
|  482   if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { |  481   if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) { | 
|  483     if (event.type == NativeWebKeyboardEvent::RawKeyDown && |  482     if (event.type == NativeWebKeyboardEvent::RawKeyDown && | 
|  484         event.windowsKeyCode == ui::VKEY_ESCAPE) { |  483         event.windowsKeyCode == ui::VKEY_ESCAPE) { | 
|  485       Close(); |  484       Close(); | 
|  486       return; |  485       return; | 
|  487     } |  486     } | 
|  488   } |  487   } | 
|  489   UnhandledKeyboardEvent(source, event); |  488   UnhandledKeyboardEvent(source, event); | 
|  490 } |  489 } | 
|  491  |  490  | 
|  492 bool ExtensionHost::OnMessageReceived(const IPC::Message& message) { |  491 bool ExtensionHost::OnMessageReceived(const IPC::Message& message) { | 
|  493   bool handled = true; |  492   bool handled = true; | 
|  494   IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message) |  493   IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message) | 
|  495     IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) |  494     IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) | 
|  496     IPC_MESSAGE_HANDLER(ExtensionHostMsg_EventAck, OnEventAck) |  495     IPC_MESSAGE_HANDLER(ExtensionHostMsg_EventAck, OnEventAck) | 
|  497     IPC_MESSAGE_HANDLER(ExtensionHostMsg_IncrementLazyKeepaliveCount, |  496     IPC_MESSAGE_HANDLER(ExtensionHostMsg_IncrementLazyKeepaliveCount, | 
|  498                         OnIncrementLazyKeepaliveCount) |  497                         OnIncrementLazyKeepaliveCount) | 
|  499     IPC_MESSAGE_HANDLER(ExtensionHostMsg_DecrementLazyKeepaliveCount, |  498     IPC_MESSAGE_HANDLER(ExtensionHostMsg_DecrementLazyKeepaliveCount, | 
|  500                         OnDecrementLazyKeepaliveCount) |  499                         OnDecrementLazyKeepaliveCount) | 
|  501     IPC_MESSAGE_UNHANDLED(handled = false) |  500     IPC_MESSAGE_UNHANDLED(handled = false) | 
|  502   IPC_END_MESSAGE_MAP() |  501   IPC_END_MESSAGE_MAP() | 
|  503   return handled; |  502   return handled; | 
|  504 } |  503 } | 
|  505  |  504  | 
|  506 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { |  505 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { | 
|  507   extension_function_dispatcher_.Dispatch(params, render_view_host()); |  506   extension_function_dispatcher_.Dispatch(params, render_view_host()); | 
|  508 } |  507 } | 
|  509  |  508  | 
|  510 void ExtensionHost::OnEventAck() { |  509 void ExtensionHost::OnEventAck() { | 
|  511   extensions::EventRouter* router = |  510   EventRouter* router = ExtensionSystem::Get(profile_)->event_router(); | 
|  512       ExtensionSystem::Get(profile_)->event_router(); |  | 
|  513   if (router) |  511   if (router) | 
|  514     router->OnEventAck(profile_, extension_id()); |  512     router->OnEventAck(profile_, extension_id()); | 
|  515 } |  513 } | 
|  516  |  514  | 
|  517 void ExtensionHost::OnIncrementLazyKeepaliveCount() { |  515 void ExtensionHost::OnIncrementLazyKeepaliveCount() { | 
|  518   ExtensionProcessManager* pm = |  516   ExtensionProcessManager* pm = | 
|  519       ExtensionSystem::Get(profile_)->process_manager(); |  517       ExtensionSystem::Get(profile_)->process_manager(); | 
|  520   if (pm) |  518   if (pm) | 
|  521     pm->IncrementLazyKeepaliveCount(extension()); |  519     pm->IncrementLazyKeepaliveCount(extension()); | 
|  522 } |  520 } | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  548 } |  546 } | 
|  549  |  547  | 
|  550 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { |  548 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { | 
|  551   render_view_host_ = render_view_host; |  549   render_view_host_ = render_view_host; | 
|  552  |  550  | 
|  553   if (view()) |  551   if (view()) | 
|  554     view()->RenderViewCreated(); |  552     view()->RenderViewCreated(); | 
|  555  |  553  | 
|  556   // If the host is bound to a window, then extract its id. Extensions hosted |  554   // If the host is bound to a window, then extract its id. Extensions hosted | 
|  557   // in ExternalTabContainer objects may not have an associated window. |  555   // in ExternalTabContainer objects may not have an associated window. | 
|  558   extensions::WindowController* window = GetExtensionWindowController(); |  556   WindowController* window = GetExtensionWindowController(); | 
|  559   if (window) { |  557   if (window) { | 
|  560     render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( |  558     render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( | 
|  561         render_view_host->GetRoutingID(), window->GetWindowId())); |  559         render_view_host->GetRoutingID(), window->GetWindowId())); | 
|  562   } |  560   } | 
|  563 } |  561 } | 
|  564  |  562  | 
|  565 void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { |  563 void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { | 
|  566   // If our RenderViewHost is deleted, fall back to the host_contents' current |  564   // If our RenderViewHost is deleted, fall back to the host_contents' current | 
|  567   // RVH. There is sometimes a small gap between the pending RVH being deleted |  565   // RVH. There is sometimes a small gap between the pending RVH being deleted | 
|  568   // and RenderViewCreated being called, so we update it here. |  566   // and RenderViewCreated being called, so we update it here. | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  633       content::IsAudioMediaType(request.audio_type), |  631       content::IsAudioMediaType(request.audio_type), | 
|  634       content::IsVideoMediaType(request.video_type), |  632       content::IsVideoMediaType(request.video_type), | 
|  635       &devices); |  633       &devices); | 
|  636  |  634  | 
|  637   // For tab capture device, we require the tabCapture permission. |  635   // For tab capture device, we require the tabCapture permission. | 
|  638   RequestMediaAccessPermissionHelper::AuthorizeRequest( |  636   RequestMediaAccessPermissionHelper::AuthorizeRequest( | 
|  639       devices, request, callback, extension(), false); |  637       devices, request, callback, extension(), false); | 
|  640 } |  638 } | 
|  641  |  639  | 
|  642 }  // namespace extensions |  640 }  // namespace extensions | 
| OLD | NEW |