| 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
|
|
|
|
|