Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: chrome/browser/extensions/extension_host.cc

Issue 8520036: Revert 110262 - Have ExtensionHost use TabContents instead of RenderViewHost. Try #2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/extension_host.h ('k') | chrome/browser/extensions/extension_host_mac.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_host.cc
===================================================================
--- chrome/browser/extensions/extension_host.cc (revision 110269)
+++ chrome/browser/extensions/extension_host.cc (working copy)
@@ -16,12 +16,17 @@
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/file_select_helper.h"
+#include "chrome/browser/platform_util.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/renderer_preferences_util.h"
+#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/ui/app_modal_dialogs/message_box_handler.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
+#include "chrome/browser/ui/webui/chrome_web_ui_factory.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
@@ -34,18 +39,24 @@
#include "content/browser/renderer_host/browser_render_process_host.h"
#include "content/browser/renderer_host/render_process_host.h"
#include "content/browser/renderer_host/render_view_host.h"
+#include "content/browser/renderer_host/render_widget_host.h"
+#include "content/browser/renderer_host/render_widget_host_view.h"
+#include "content/browser/site_instance.h"
+#include "content/browser/tab_contents/popup_menu_helper_mac.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/browser/tab_contents/tab_contents_view.h"
#include "content/public/browser/notification_service.h"
#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/native_web_keyboard_event.h"
+#include "content/public/common/bindings_policy.h"
#include "grit/browser_resources.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
+#include "webkit/glue/context_menu.h"
#if defined(TOOLKIT_VIEWS)
#include "views/widget/widget.h"
@@ -54,6 +65,9 @@
using WebKit::WebDragOperation;
using WebKit::WebDragOperationsMask;
+// static
+bool ExtensionHost::enable_dom_automation_ = false;
+
// Helper class that rate-limits the creation of renderer processes for
// ExtensionHosts, to avoid blocking the UI.
class ExtensionHost::ProcessCreationQueue {
@@ -124,16 +138,15 @@
site_instance->browsing_instance()->browser_context())),
did_stop_loading_(false),
document_element_available_(false),
- initial_url_(url),
+ url_(url),
ALLOW_THIS_IN_INITIALIZER_LIST(
extension_function_dispatcher_(profile_, this)),
extension_host_type_(host_type),
associated_tab_contents_(NULL) {
- host_contents_.reset(new TabContents(
- profile_, site_instance, MSG_ROUTING_NONE, NULL, NULL));
- TabContentsObserver::Observe(host_contents_.get());
- host_contents_->set_delegate(this);
- host_contents_->set_view_type(host_type);
+ render_view_host_ = new RenderViewHost(site_instance, this, MSG_ROUTING_NONE,
+ NULL);
+ if (enable_dom_automation_)
+ render_view_host_->AllowBindings(content::BINDINGS_POLICY_DOM_AUTOMATION);
// Listen for when an extension is unloaded from the same profile, as it may
// be the same extension that this points to.
@@ -147,9 +160,10 @@
: extension_(extension),
extension_id_(extension->id()),
profile_(NULL),
+ render_view_host_(NULL),
did_stop_loading_(false),
document_element_available_(false),
- initial_url_(GURL()),
+ url_(GURL()),
ALLOW_THIS_IN_INITIALIZER_LIST(
extension_function_dispatcher_(profile_, this)),
extension_host_type_(host_type),
@@ -162,6 +176,10 @@
content::Source<Profile>(profile_),
content::Details<ExtensionHost>(this));
ProcessCreationQueue::GetInstance()->Remove(this);
+ GetJavaScriptDialogCreatorInstance()->ResetJavaScriptState(this);
+ // render_view_host_ may be NULL in unit tests.
+ if (render_view_host_)
+ render_view_host_->Shutdown(); // deletes render_view_host
}
void ExtensionHost::CreateView(Browser* browser) {
@@ -187,20 +205,20 @@
}
RenderProcessHost* ExtensionHost::render_process_host() const {
- return host_contents()->GetRenderProcessHost();
+ return render_view_host_->process();
}
-RenderViewHost* ExtensionHost::render_view_host() const {
- // TODO(mpcomplete): This can be NULL. How do we handle that?
- return host_contents()->render_view_host();
+SiteInstance* ExtensionHost::site_instance() const {
+ return render_view_host_->site_instance();
}
bool ExtensionHost::IsRenderViewLive() const {
- return render_view_host()->IsRenderViewLive();
+ return render_view_host_->IsRenderViewLive();
}
-void ExtensionHost::CreateRenderViewSoon() {
- if (render_process_host()->HasConnection()) {
+void ExtensionHost::CreateRenderViewSoon(RenderWidgetHostView* host_view) {
+ render_view_host_->SetView(host_view);
+ if (render_view_host_->process()->HasConnection()) {
// If the process is already started, go ahead and initialize the RenderView
// synchronously. The process creation is the real meaty part that we want
// to defer.
@@ -211,11 +229,25 @@
}
void ExtensionHost::CreateRenderViewNow() {
- LoadInitialURL();
- if (is_background_page()) {
- DCHECK(IsRenderViewLive());
- profile_->GetExtensionService()->DidCreateRenderViewForBackgroundPage(this);
+ render_view_host_->CreateRenderView(string16());
+ if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
+ extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG ||
+ extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) {
+ // If the host is bound to a browser, then extract its window id.
+ // Extensions hosted in ExternalTabContainer objects may not have
+ // an associated browser.
+ const Browser* browser = GetBrowser();
+ if (browser && render_view_host_) {
+ render_view_host_->Send(new ExtensionMsg_UpdateBrowserWindowId(
+ render_view_host_->routing_id(),
+ ExtensionTabUtil::GetWindowId(browser)));
+ }
}
+ NavigateToURL(url_);
+ DCHECK(IsRenderViewLive());
+ if (is_background_page())
+ profile_->GetExtensionService()->DidCreateRenderViewForBackgroundPage(
+ this);
}
const Browser* ExtensionHost::GetBrowser() const {
@@ -230,11 +262,17 @@
return view() ? view()->native_view() : NULL;
}
-const GURL& ExtensionHost::GetURL() const {
- return host_contents()->GetURL();
-}
+void ExtensionHost::NavigateToURL(const GURL& url) {
+ // Prevent explicit navigation to another extension id's pages.
+ // This method is only called by some APIs, so we still need to protect
+ // DidNavigate below (location = "").
+ if (url.SchemeIs(chrome::kExtensionScheme) && url.host() != extension_id()) {
+ // TODO(erikkay) communicate this back to the caller?
+ return;
+ }
-void ExtensionHost::LoadInitialURL() {
+ url_ = url;
+
if (!is_background_page() &&
!profile_->GetExtensionService()->IsBackgroundPageReady(extension_)) {
// Make sure the background page loads before any others.
@@ -243,8 +281,7 @@
return;
}
- host_contents_->controller().LoadURL(
- initial_url_, GURL(), content::PAGE_TRANSITION_LINK, std::string());
+ render_view_host_->NavigateToURL(url_);
}
void ExtensionHost::Observe(int type,
@@ -254,7 +291,7 @@
case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY:
DCHECK(profile_->GetExtensionService()->
IsBackgroundPageReady(extension_));
- LoadInitialURL();
+ NavigateToURL(url_);
break;
case chrome::NOTIFICATION_EXTENSION_UNLOADED:
// The extension object will be deleted after this notification has been
@@ -272,13 +309,14 @@
}
}
-void ExtensionHost::UpdatePreferredSize(TabContents* source,
- const gfx::Size& pref_size) {
+void ExtensionHost::UpdatePreferredSize(const gfx::Size& new_size) {
if (view_.get())
- view_->UpdatePreferredSize(pref_size);
+ view_->UpdatePreferredSize(new_size);
}
-void ExtensionHost::RenderViewGone(base::TerminationStatus status) {
+void ExtensionHost::RenderViewGone(RenderViewHost* render_view_host,
+ base::TerminationStatus status,
+ int error_code) {
// During browser shutdown, we may use sudden termination on an extension
// process, so it is expected to lose our connection to the render view.
// Do nothing.
@@ -297,12 +335,22 @@
// TODO(aa): This is suspicious. There can be multiple views in an extension,
// and they aren't all going to use ExtensionHost. This should be in someplace
// more central, like EPM maybe.
+ DCHECK_EQ(render_view_host_, render_view_host);
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
content::Source<Profile>(profile_),
content::Details<ExtensionHost>(this));
}
+void ExtensionHost::DidNavigate(RenderViewHost* render_view_host,
+ const ViewHostMsg_FrameNavigate_Params& params) {
+ // We only care when the outer frame changes.
+ if (!content::PageTransitionIsMainFrame(params.transition))
+ return;
+
+ url_ = params.url;
+}
+
void ExtensionHost::InsertInfobarCSS() {
DCHECK(!is_background_page());
@@ -324,7 +372,7 @@
if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG ||
extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) {
-#if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX)
+#if defined(TOOLKIT_VIEWS)
if (view_.get())
view_->DidStopLoading();
#endif
@@ -350,7 +398,7 @@
}
}
-void ExtensionHost::DocumentAvailableInMainFrame() {
+void ExtensionHost::DocumentAvailableInMainFrame(RenderViewHost* rvh) {
// If the document has already been marked as available for this host, then
// bail. No need for the redundant setup. http://crbug.com/31170
if (document_element_available_)
@@ -370,7 +418,77 @@
}
}
-void ExtensionHost::CloseContents(TabContents* contents) {
+void ExtensionHost::DocumentOnLoadCompletedInMainFrame(RenderViewHost* rvh,
+ int32 page_id) {
+ if (chrome::VIEW_TYPE_EXTENSION_POPUP == GetRenderViewType()) {
+ content::NotificationService::current()->Notify(
+ chrome::NOTIFICATION_EXTENSION_POPUP_VIEW_READY,
+ content::Source<Profile>(profile_),
+ content::Details<ExtensionHost>(this));
+ }
+}
+
+void ExtensionHost::RunJavaScriptMessage(const RenderViewHost* rvh,
+ const string16& message,
+ const string16& default_prompt,
+ const GURL& frame_url,
+ const int flags,
+ IPC::Message* reply_msg,
+ bool* did_suppress_message) {
+ bool suppress_this_message = false;
+
+ string16 title;
+ if (extension_->location() == Extension::COMPONENT)
+ title = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
+ else
+ title = UTF8ToUTF16(extension_->name());
+
+ GetJavaScriptDialogCreatorInstance()->RunJavaScriptDialog(
+ this,
+ content::JavaScriptDialogCreator::DIALOG_TITLE_PLAIN_STRING,
+ title,
+ flags,
+ message,
+ default_prompt,
+ reply_msg,
+ &suppress_this_message);
+
+ if (suppress_this_message) {
+ // If we are suppressing messages, just reply as if the user immediately
+ // pressed "Cancel".
+ OnDialogClosed(reply_msg, false, string16());
+ }
+
+ *did_suppress_message = suppress_this_message;
+}
+
+gfx::NativeWindow ExtensionHost::GetDialogRootWindow() {
+ // If we have a view, use that.
+ gfx::NativeView native_view = GetNativeViewOfHost();
+ if (native_view)
+ return platform_util::GetTopLevel(native_view);
+
+ // Otherwise, try the active tab's view.
+ Browser* browser = extension_function_dispatcher_.GetCurrentBrowser(
+ render_view_host_, true);
+ if (browser) {
+ TabContents* active_tab = browser->GetSelectedTabContents();
+ if (active_tab)
+ return active_tab->view()->GetTopLevelNativeWindow();
+ }
+
+ return NULL;
+}
+
+void ExtensionHost::OnDialogClosed(IPC::Message* reply_msg,
+ bool success,
+ const string16& user_input) {
+ render_view_host()->JavaScriptDialogClosed(reply_msg,
+ success,
+ user_input);
+}
+
+void ExtensionHost::Close(RenderViewHost* render_view_host) {
if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG ||
extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE ||
@@ -382,6 +500,40 @@
}
}
+content::RendererPreferences ExtensionHost::GetRendererPrefs(
+ content::BrowserContext* browser_context) const {
+ Profile* profile = Profile::FromBrowserContext(browser_context);
+ content::RendererPreferences preferences;
+
+ TabContents* associated_contents = GetAssociatedTabContents();
+ if (associated_contents)
+ preferences =
+ static_cast<RenderViewHostDelegate*>(associated_contents)->
+ GetRendererPrefs(profile);
+
+ renderer_preferences_util::UpdateFromSystemSettings(&preferences, profile);
+ return preferences;
+}
+
+WebPreferences ExtensionHost::GetWebkitPrefs() {
+ WebPreferences webkit_prefs =
+ RenderViewHostDelegateHelper::GetWebkitPrefs(render_view_host());
+
+ // Disable anything that requires the GPU process for background pages.
+ // See http://crbug.com/64512 and http://crbug.com/64841.
+ if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
+ webkit_prefs.experimental_webgl_enabled = false;
+ webkit_prefs.accelerated_compositing_enabled = false;
+ webkit_prefs.accelerated_2d_canvas_enabled = false;
+ }
+
+ return webkit_prefs;
+}
+
+RenderViewHostDelegate::View* ExtensionHost::GetViewDelegate() {
+ return this;
+}
+
bool ExtensionHost::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) {
if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP &&
@@ -407,52 +559,85 @@
UnhandledKeyboardEvent(event);
}
-bool ExtensionHost::OnMessageReceived(const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message)
- IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
+void ExtensionHost::HandleMouseMove() {
+#if defined(OS_WIN)
+ if (view_.get())
+ view_->HandleMouseMove();
+#endif
}
-void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) {
- extension_function_dispatcher_.Dispatch(params, render_view_host());
+void ExtensionHost::HandleMouseDown() {
}
-void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) {
+void ExtensionHost::HandleMouseLeave() {
+#if defined(OS_WIN)
if (view_.get())
- view_->RenderViewCreated();
+ view_->HandleMouseLeave();
+#endif
+}
- if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
- extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) {
- render_view_host->EnablePreferredSizeMode(
- kPreferredSizeWidth | kPreferredSizeHeightThisIsSlow);
- }
+void ExtensionHost::HandleMouseUp() {
+}
- // If the host is bound to a browser, then extract its window id.
- // Extensions hosted in ExternalTabContainer objects may not have
- // an associated browser.
- const Browser* browser = GetBrowser();
- if (browser) {
- render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId(
- render_view_host->routing_id(),
- ExtensionTabUtil::GetWindowId(browser)));
- }
+void ExtensionHost::HandleMouseActivate() {
}
-content::JavaScriptDialogCreator* ExtensionHost::GetJavaScriptDialogCreator() {
- return GetJavaScriptDialogCreatorInstance();
+void ExtensionHost::RunFileChooser(
+ RenderViewHost* render_view_host,
+ const ViewHostMsg_RunFileChooser_Params& params) {
+ // FileSelectHelper adds a reference to itself and only releases it after
+ // sending the result message. It won't be destroyed when this reference
+ // goes out of scope.
+ scoped_refptr<FileSelectHelper> file_select_helper(
+ new FileSelectHelper(profile()));
+ file_select_helper->RunFileChooser(render_view_host,
+ GetAssociatedTabContents(),
+ params);
}
-void ExtensionHost::AddNewContents(TabContents* source,
- TabContents* new_contents,
- WindowOpenDisposition disposition,
- const gfx::Rect& initial_pos,
- bool user_gesture) {
- // TODO(mpcomplete): is all this necessary? Maybe we can just call the
- // brower's delegate, and fall back to browser::Navigate if browser is NULL.
- TabContents* contents = new_contents;
+void ExtensionHost::CreateNewWindow(
+ int route_id,
+ const ViewHostMsg_CreateWindow_Params& params) {
+ // TODO(aa): Use the browser's profile if the extension is split mode
+ // incognito.
+ Profile* profile = Profile::FromBrowserContext(
+ render_view_host()->process()->browser_context());
+ TabContents* new_contents = delegate_view_helper_.CreateNewWindow(
+ route_id,
+ profile,
+ site_instance(),
+ ChromeWebUIFactory::GetInstance()->GetWebUIType(
+ render_view_host()->process()->browser_context(), url_),
+ this,
+ params.window_container_type,
+ params.frame_name);
+
+ TabContents* associated_contents = GetAssociatedTabContents();
+ if (associated_contents && associated_contents->delegate())
+ associated_contents->delegate()->TabContentsCreated(new_contents);
+}
+
+void ExtensionHost::CreateNewWidget(int route_id,
+ WebKit::WebPopupType popup_type) {
+ CreateNewWidgetInternal(route_id, popup_type);
+}
+
+void ExtensionHost::CreateNewFullscreenWidget(int route_id) {
+ NOTREACHED()
+ << "ExtensionHost does not support showing full screen popups yet.";
+}
+
+RenderWidgetHostView* ExtensionHost::CreateNewWidgetInternal(
+ int route_id, WebKit::WebPopupType popup_type) {
+ return delegate_view_helper_.CreateNewWidget(route_id, popup_type,
+ site_instance()->GetProcess());
+}
+
+void ExtensionHost::ShowCreatedWindow(int route_id,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture) {
+ TabContents* contents = delegate_view_helper_.GetCreatedWindow(route_id);
if (!contents)
return;
Profile* profile = Profile::FromBrowserContext(contents->browser_context());
@@ -478,6 +663,10 @@
return;
}
+ // If the tab contents isn't a popup, it's a normal tab. We need to find a
+ // home for it. This is typically a Browser, but it can also be some other
+ // TabContentsDelegate in the case of ChromeFrame.
+
// First, if the creating extension view was associated with a tab contents,
// use that tab content's delegate. We must be careful here that the
// associated tab contents has the same profile as the new tab contents. In
@@ -496,7 +685,7 @@
// profile, try finding an open window. Again, we must make sure to find a
// window with the correct profile.
Browser* browser = BrowserList::FindTabbedBrowser(
- profile, false); // Match incognito exactly.
+ profile, false); // Match incognito exactly.
// If there's no Browser open with the right profile, create a new one.
if (!browser) {
@@ -506,8 +695,112 @@
browser->AddTabContents(contents, disposition, initial_pos, user_gesture);
}
+void ExtensionHost::ShowCreatedWidget(int route_id,
+ const gfx::Rect& initial_pos) {
+ ShowCreatedWidgetInternal(delegate_view_helper_.GetCreatedWidget(route_id),
+ initial_pos);
+}
-void ExtensionHost::RenderViewReady() {
+void ExtensionHost::ShowCreatedFullscreenWidget(int route_id) {
+ NOTREACHED()
+ << "ExtensionHost does not support showing full screen popups yet.";
+}
+
+void ExtensionHost::ShowCreatedWidgetInternal(
+ RenderWidgetHostView* widget_host_view,
+ const gfx::Rect& initial_pos) {
+ Browser *browser = GetBrowser();
+ DCHECK(browser);
+ if (!browser)
+ return;
+ browser->BrowserRenderWidgetShowing();
+ // TODO(erikkay): These two lines could be refactored with TabContentsView.
+ widget_host_view->InitAsPopup(render_view_host()->view(), initial_pos);
+ widget_host_view->GetRenderWidgetHost()->Init();
+}
+
+void ExtensionHost::ShowContextMenu(const ContextMenuParams& params) {
+ // TODO(erikkay) Show a default context menu.
+}
+
+void ExtensionHost::ShowPopupMenu(const gfx::Rect& bounds,
+ int item_height,
+ double item_font_size,
+ int selected_item,
+ const std::vector<WebMenuItem>& items,
+ bool right_aligned) {
+#if defined(OS_MACOSX)
+ PopupMenuHelper popup_menu_helper(render_view_host());
+ popup_menu_helper.ShowPopupMenu(bounds, item_height, item_font_size,
+ selected_item, items, right_aligned);
+#else
+ // Only on Mac are select popup menus external.
+ NOTREACHED();
+#endif
+}
+
+void ExtensionHost::StartDragging(const WebDropData& drop_data,
+ WebDragOperationsMask operation_mask,
+ const SkBitmap& image,
+ const gfx::Point& image_offset) {
+ // We're not going to do any drag & drop, but we have to tell the renderer the
+ // drag & drop ended, othewise the renderer thinks the drag operation is
+ // underway and mouse events won't work. See bug 34061.
+ // TODO(twiz) Implement drag & drop support for ExtensionHost instances.
+ // See feature issue 36288.
+ render_view_host()->DragSourceSystemDragEnded();
+}
+
+void ExtensionHost::UpdateDragCursor(WebDragOperation operation) {
+}
+
+void ExtensionHost::GotFocus() {
+#if defined(TOOLKIT_VIEWS) && !defined(TOUCH_UI)
+ // Request focus so that the FocusManager has a focused view and can perform
+ // normally its key event processing (so that it lets tab key events go to the
+ // renderer).
+ view()->RequestFocus();
+#else
+ // TODO(port)
+#endif
+}
+
+void ExtensionHost::TakeFocus(bool reverse) {
+}
+
+content::ViewType ExtensionHost::GetRenderViewType() const {
+ return extension_host_type_;
+}
+
+bool ExtensionHost::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) {
+ extension_function_dispatcher_.Dispatch(params, render_view_host_);
+}
+
+const GURL& ExtensionHost::GetURL() const {
+ return url_;
+}
+
+void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) {
+ if (view_.get())
+ view_->RenderViewCreated();
+
+ if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
+ extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) {
+ render_view_host->EnablePreferredSizeMode(
+ kPreferredSizeWidth | kPreferredSizeHeightThisIsSlow);
+ }
+}
+
+void ExtensionHost::RenderViewReady(RenderViewHost* render_view_host) {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_EXTENSION_HOST_CREATED,
content::Source<Profile>(profile_),
Property changes on: chrome/browser/extensions/extension_host.cc
___________________________________________________________________
Added: svn:mergeinfo
« no previous file with comments | « chrome/browser/extensions/extension_host.h ('k') | chrome/browser/extensions/extension_host_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698