Chromium Code Reviews| Index: extensions/browser/extension_function.cc |
| =================================================================== |
| --- extensions/browser/extension_function.cc (revision 242033) |
| +++ extensions/browser/extension_function.cc (working copy) |
| @@ -12,6 +12,7 @@ |
| #include "chrome/common/extensions/extension_messages.h" |
| #include "content/public/browser/notification_source.h" |
| #include "content/public/browser/notification_types.h" |
| +#include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/browser/web_contents_observer.h" |
| @@ -28,15 +29,18 @@ |
| x->Destruct(); |
| } |
| -// Helper class to track the lifetime of ExtensionFunction's RenderViewHost |
| -// pointer and NULL it out when it dies. It also allows us to filter IPC |
| -// messages coming from the RenderViewHost. |
| -class UIThreadExtensionFunction::RenderViewHostTracker |
| +// Helper class to track the lifetime of ExtensionFunction's RenderViewHost or |
| +// RenderFrameHost pointer and NULL it out when it dies. It also allows us to |
| +// filter IPC messages coming from the RenderViewHost/RenderFrameHost. |
| +class UIThreadExtensionFunction::RenderHostTracker |
| : public content::WebContentsObserver { |
| public: |
| - explicit RenderViewHostTracker(UIThreadExtensionFunction* function) |
| + explicit RenderHostTracker(UIThreadExtensionFunction* function) |
| : content::WebContentsObserver( |
| - WebContents::FromRenderViewHost(function->render_view_host())), |
| + function->render_view_host() ? |
| + WebContents::FromRenderViewHost(function->render_view_host()) : |
| + WebContents::FromRenderFrameHost( |
| + function->render_frame_host())), |
| function_(function) { |
| } |
| @@ -49,14 +53,21 @@ |
| function_->SetRenderViewHost(NULL); |
| } |
| + virtual void RenderFrameDeleted( |
| + content::RenderFrameHost* render_frame_host) OVERRIDE { |
| + if (render_frame_host != function_->render_frame_host()) |
| + return; |
| + function_->SetRenderFrameHost(NULL); |
| + } |
| + |
| virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
| - return function_->OnMessageReceivedFromRenderView(message); |
| + return function_->OnMessageReceived(message); |
| } |
| UIThreadExtensionFunction* function_; |
| - DISALLOW_COPY_AND_ASSIGN(RenderViewHostTracker); |
| + DISALLOW_COPY_AND_ASSIGN(RenderHostTracker); |
| }; |
| ExtensionFunction::ExtensionFunction() |
| @@ -146,7 +157,8 @@ |
| } |
| UIThreadExtensionFunction::UIThreadExtensionFunction() |
| - : render_view_host_(NULL), context_(NULL), delegate_(NULL) {} |
| + : render_view_host_(NULL), render_frame_host_(NULL), context_(NULL), |
| + delegate_(NULL) {} |
| UIThreadExtensionFunction::~UIThreadExtensionFunction() { |
| if (dispatcher() && render_view_host()) |
| @@ -158,8 +170,7 @@ |
| return this; |
| } |
| -bool UIThreadExtensionFunction::OnMessageReceivedFromRenderView( |
| - const IPC::Message& message) { |
| +bool UIThreadExtensionFunction::OnMessageReceived(const IPC::Message& message) { |
| return false; |
| } |
| @@ -170,9 +181,15 @@ |
| void UIThreadExtensionFunction::SetRenderViewHost( |
| RenderViewHost* render_view_host) { |
| render_view_host_ = render_view_host; |
| - tracker_.reset(render_view_host ? new RenderViewHostTracker(this) : NULL); |
| + tracker_.reset(render_view_host ? new RenderHostTracker(this) : NULL); |
| } |
| +void UIThreadExtensionFunction::SetRenderFrameHost( |
| + content::RenderFrameHost* render_frame_host) { |
| + render_frame_host_ = render_frame_host; |
|
nasko
2013/12/20 14:53:54
nit: Should we DCHECK somewhere that one or the ot
jam
2013/12/20 17:00:49
Done.
|
| + tracker_.reset(render_frame_host ? new RenderHostTracker(this) : NULL); |
| +} |
| + |
| content::WebContents* UIThreadExtensionFunction::GetAssociatedWebContents() { |
| content::WebContents* web_contents = NULL; |
| if (dispatcher()) |
| @@ -191,8 +208,13 @@ |
| void UIThreadExtensionFunction::WriteToConsole( |
| content::ConsoleMessageLevel level, |
| const std::string& message) { |
| - render_view_host_->Send(new ExtensionMsg_AddMessageToConsole( |
| - render_view_host_->GetRoutingID(), level, message)); |
| + if (render_view_host_) { |
| + render_view_host_->Send(new ExtensionMsg_AddMessageToConsole( |
| + render_view_host_->GetRoutingID(), level, message)); |
| + } else { |
| + render_frame_host_->Send(new ExtensionMsg_AddMessageToConsole( |
| + render_frame_host_->GetRoutingID(), level, message)); |
| + } |
| } |
| IOThreadExtensionFunction::IOThreadExtensionFunction() |