| Index: chrome/browser/views/app_launcher.cc
|
| ===================================================================
|
| --- chrome/browser/views/app_launcher.cc (revision 41617)
|
| +++ chrome/browser/views/app_launcher.cc (working copy)
|
| @@ -2,49 +2,47 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/chromeos/app_launcher.h"
|
| +#include "chrome/browser/views/app_launcher.h"
|
|
|
| #include <string>
|
| #include <vector>
|
|
|
| -#include "app/gfx/canvas.h"
|
| -#include "app/gfx/insets.h"
|
| #include "app/resource_bundle.h"
|
| #include "base/command_line.h"
|
| #include "base/message_loop.h"
|
| #include "base/string_util.h"
|
| +#include "base/task.h"
|
| #include "chrome/browser/autocomplete/autocomplete_edit.h"
|
| -#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h"
|
| +#include "chrome/browser/autocomplete/autocomplete_edit_view.h"
|
| #include "chrome/browser/browser.h"
|
| -#include "chrome/browser/browser_list.h"
|
| #include "chrome/browser/browser_window.h"
|
| #include "chrome/browser/bubble_positioner.h"
|
| -#include "chrome/browser/chromeos/frame/browser_view.h"
|
| -#include "chrome/browser/chromeos/status/status_area_view.h"
|
| -#include "chrome/browser/chromeos/wm_ipc.h"
|
| -#include "chrome/browser/in_process_webkit/dom_storage_context.h"
|
| #include "chrome/browser/in_process_webkit/webkit_context.h"
|
| #include "chrome/browser/profile.h"
|
| #include "chrome/browser/renderer_host/render_view_host.h"
|
| #include "chrome/browser/renderer_host/render_view_host_factory.h"
|
| #include "chrome/browser/renderer_host/render_widget_host_view.h"
|
| -#include "chrome/browser/renderer_host/render_widget_host_view_gtk.h"
|
| #include "chrome/browser/renderer_host/site_instance.h"
|
| #include "chrome/browser/renderer_preferences_util.h"
|
| #include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
|
| #include "chrome/browser/tab_contents/tab_contents.h"
|
| -#include "chrome/browser/views/bubble_border.h"
|
| -#include "grit/app_resources.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/theme_resources.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -#include "views/background.h"
|
| +#include "chrome/browser/views/info_bubble.h"
|
| +#include "chrome/browser/views/frame/browser_view.h"
|
| #include "views/controls/native/native_view_host.h"
|
| -#include "views/painter.h"
|
| -#include "views/screen.h"
|
| #include "views/widget/root_view.h"
|
| -#include "views/widget/widget_gtk.h"
|
| +#include "views/widget/widget.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include "chrome/browser/autocomplete/autocomplete_edit_view_win.h"
|
| +#include "chrome/browser/renderer_host/render_widget_host_view_win.h"
|
| +#elif defined(OS_LINUX)
|
| +#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h"
|
| +#include "chrome/browser/renderer_host/render_widget_host_view_gtk.h"
|
| +#endif
|
| +#if defined(OS_CHROMEOS)
|
| +#include "chrome/browser/chromeos/status/status_area_view.h"
|
| +#endif
|
| +
|
| namespace {
|
|
|
| // Padding & margins for the navigation entry.
|
| @@ -55,17 +53,12 @@
|
| // NavigationBar size.
|
| const int kNavigationBarHeight = 25;
|
|
|
| -// Padding for the bubble info window.
|
| -const int kBubbleWindowXPadding = 6;
|
| -const int kBubbleWindowYPadding = 16;
|
| +// The delta applied to the default font size for the omnibox.
|
| +const int kAutocompleteEditFontDelta = 3;
|
|
|
| // Command line switch for specifying url of the page.
|
| const wchar_t kURLSwitch[] = L"main-menu-url";
|
|
|
| -// Command line switch for specifying the size of the main menu. The default is
|
| -// full screen.
|
| -const wchar_t kMenuSizeSwitch[] = L"main-menu-size";
|
| -
|
| // URL of the page to load. This is ignored if kURLSwitch is specified.
|
| const char kMenuURL[] = "http://goto.ext.google.com/crux-home";
|
|
|
| @@ -92,10 +85,60 @@
|
| DISALLOW_COPY_AND_ASSIGN(RWHVNativeViewHost);
|
| };
|
|
|
| -} // namspace
|
| +} // namespace
|
|
|
| -namespace chromeos {
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsDelegateImpl
|
| +//
|
| +// TabContentsDelegate and RenderViewHostDelegate::View have some methods
|
| +// in common (with differing signatures). The TabContentsDelegate methods are
|
| +// implemented by this class.
|
|
|
| +class TabContentsDelegateImpl : public TabContentsDelegate {
|
| + public:
|
| + explicit TabContentsDelegateImpl(AppLauncher* app_launcher);
|
| +
|
| + // TabContentsDelegate.
|
| + virtual void OpenURLFromTab(TabContents* source,
|
| + const GURL& url, const GURL& referrer,
|
| + WindowOpenDisposition disposition,
|
| + PageTransition::Type transition);
|
| + virtual void NavigationStateChanged(const TabContents* source,
|
| + unsigned changed_flags) {}
|
| + virtual void AddNewContents(TabContents* source,
|
| + TabContents* new_contents,
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture) {}
|
| + virtual void ActivateContents(TabContents* contents) {}
|
| + virtual void LoadingStateChanged(TabContents* source) {}
|
| + virtual void CloseContents(TabContents* source) {}
|
| + virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
|
| + virtual bool IsPopup(TabContents* source) { return false; }
|
| + virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {}
|
| + virtual void URLStarredChanged(TabContents* source, bool starred) {}
|
| + virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
|
| +
|
| + private:
|
| + AppLauncher* app_launcher_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TabContentsDelegateImpl);
|
| +};
|
| +
|
| +TabContentsDelegateImpl::TabContentsDelegateImpl(AppLauncher* app_launcher)
|
| + : app_launcher_(app_launcher) {
|
| +}
|
| +
|
| +void TabContentsDelegateImpl::OpenURLFromTab(TabContents* source,
|
| + const GURL& url,
|
| + const GURL& referrer,
|
| + WindowOpenDisposition disposition,
|
| + PageTransition::Type transition) {
|
| + app_launcher_->browser()->OpenURL(url, referrer, NEW_FOREGROUND_TAB,
|
| + PageTransition::LINK);
|
| + app_launcher_->Hide();
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // NavigationBar
|
| //
|
| @@ -107,12 +150,12 @@
|
| public BubblePositioner {
|
| public:
|
| explicit NavigationBar(AppLauncher* app_launcher)
|
| - : views::View(),
|
| - app_launcher_(app_launcher),
|
| + : app_launcher_(app_launcher),
|
| location_entry_view_(NULL) {
|
| SetFocusable(true);
|
| location_entry_view_ = new views::NativeViewHost;
|
| AddChildView(location_entry_view_);
|
| + set_border(views::Border::CreateSolidBorder(1, SK_ColorGRAY));
|
| }
|
|
|
| virtual ~NavigationBar() {
|
| @@ -126,33 +169,54 @@
|
| location_entry_->SelectAll(true);
|
| }
|
|
|
| + virtual void ViewHierarchyChanged(bool is_add,
|
| + views::View* parent,
|
| + views::View* child) {
|
| + if (!is_add || child != this)
|
| + return;
|
| +
|
| + DCHECK(!location_entry_.get());
|
| +
|
| + Browser* browser = app_launcher_->browser();
|
| +#if defined (OS_WIN)
|
| + gfx::Font font;
|
| + font = font.DeriveFont(kAutocompleteEditFontDelta);
|
| + AutocompleteEditViewWin* autocomplete_view =
|
| + new AutocompleteEditViewWin(font, this, browser->toolbar_model(),
|
| + this, GetWidget()->GetNativeView(),
|
| + browser->profile(),
|
| + browser->command_updater(), false, this);
|
| + location_entry_.reset(autocomplete_view);
|
| + autocomplete_view->Update(NULL);
|
| + // The Update call above sets the autocomplete text to the current one in
|
| + // the location bar, make sure to clear it.
|
| + autocomplete_view->SetUserText(std::wstring());
|
| +#elif defined(OS_LINUX) && defined(TOOLKIT_VIEWS)
|
| + AutocompleteEditViewGtk* autocomplete_view =
|
| + new AutocompleteEditViewGtk(this, browser->toolbar_model(),
|
| + browser->profile(),
|
| + browser->command_updater(), false, this);
|
| + autocomplete_view->Init();
|
| + gtk_widget_show_all(autocomplete_view->widget());
|
| + gtk_widget_hide(autocomplete_view->widget());
|
| + location_entry_.reset(autocomplete_view);
|
| +#else
|
| + NOTIMPLEMENTED();
|
| +#endif
|
| + location_entry_view_->set_focus_view(this);
|
| + location_entry_view_->Attach(location_entry_->GetNativeView());
|
| + }
|
| +
|
| virtual void Layout() {
|
| gfx::Rect bounds = GetLocalBounds(false);
|
| -
|
| - const int vertical_margin =
|
| - kNavigationEntryPadding + kNavigationEntryYMargin;
|
| -
|
| location_entry_view_->SetBounds(
|
| bounds.x() + kNavigationEntryXMargin + kNavigationEntryPadding,
|
| - bounds.y() + vertical_margin,
|
| + bounds.y() + kNavigationEntryYMargin,
|
| bounds.width() - 2 * (kNavigationEntryPadding +
|
| kNavigationEntryXMargin),
|
| - bounds.height() - vertical_margin * 2);
|
| + bounds.height() - kNavigationEntryYMargin * 2);
|
| }
|
|
|
| - virtual void Paint(gfx::Canvas* canvas) {
|
| - const int padding = kNavigationEntryPadding;
|
| - canvas->FillRectInt(SK_ColorWHITE, 0, 0, width(), height());
|
| - // Draw border around the entry.
|
| - gfx::Rect bounds = location_entry_view_->GetBounds(
|
| - views::View::APPLY_MIRRORING_TRANSFORMATION);
|
| - canvas->DrawRectInt(SK_ColorGRAY,
|
| - bounds.x() - padding,
|
| - bounds.y() - padding,
|
| - bounds.width() + padding * 2,
|
| - bounds.height() + padding * 2);
|
| - }
|
| -
|
| // BubblePositioner implementation.
|
| virtual gfx::Rect GetLocationStackBounds() const {
|
| gfx::Rect bounds = location_entry_view_->GetBounds(
|
| @@ -194,225 +258,198 @@
|
| return std::wstring();
|
| }
|
|
|
| - // AutocompleteEditView depends on the browser instance.
|
| - // Create new one when the browser instance changes.
|
| - void Update(Browser* browser) {
|
| - // Detach the native view if any.
|
| - if (location_entry_view_ && location_entry_view_->native_view())
|
| - location_entry_view_->Detach();
|
| -
|
| - location_entry_.reset(new AutocompleteEditViewGtk(
|
| - this, browser->toolbar_model(), browser->profile(),
|
| - browser->command_updater(), false, this));
|
| - location_entry_->Init();
|
| - gtk_widget_show_all(location_entry_->widget());
|
| - gtk_widget_hide(location_entry_->widget());
|
| -
|
| - location_entry_view_->set_focus_view(this);
|
| - location_entry_view_->Attach(location_entry_->widget());
|
| - }
|
| -
|
| private:
|
| AppLauncher* app_launcher_;
|
| views::NativeViewHost* location_entry_view_;
|
| +#if defined(OS_WIN)
|
| + scoped_ptr<AutocompleteEditViewWin> location_entry_;
|
| +#elif defined(OS_LINUX) && defined(TOOLKIT_VIEWS)
|
| scoped_ptr<AutocompleteEditViewGtk> location_entry_;
|
| +#else
|
| + NOTIMPLEMENTED();
|
| +#endif
|
|
|
| DISALLOW_COPY_AND_ASSIGN(NavigationBar);
|
| };
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| -// TopContainer
|
| +// InfoBubbleContentsView
|
| //
|
| -// A view that grays-out the browser and contains the navigation bar and
|
| -// renderer view.
|
| +// The view that contains the navigation bar and render view.
|
| +// It is displayed in an info-bubble.
|
|
|
| -AppLauncher::TopContainer::TopContainer(AppLauncher* app_launcher)
|
| - : app_launcher_(app_launcher) {
|
| - // Use a transparent black background so the browser appears grayed-out.
|
| - set_background(views::Background::CreateSolidBackground(0, 0, 0, 100));
|
| -}
|
| +class InfoBubbleContentsView : public views::View {
|
| + public:
|
| + explicit InfoBubbleContentsView(AppLauncher* app_launcher);
|
| + ~InfoBubbleContentsView();
|
|
|
| -void AppLauncher::TopContainer::Layout() {
|
| - if (bounds().IsEmpty())
|
| - return;
|
| + // Sets the initial focus.
|
| + // Should be called when the bubble that contains us is shown.
|
| + void BubbleShown();
|
|
|
| - // We only expect to contain the BubbleContents.
|
| - DCHECK(GetChildViewCount() == 1);
|
| - GetChildViewAt(0)->SetBounds(kBubbleWindowXPadding, kBubbleWindowYPadding,
|
| - width() * 2 / 3, height() * 4 / 5);
|
| + // views::View override:
|
| + virtual gfx::Size GetPreferredSize();
|
| + virtual void Layout();
|
| + virtual void ViewHierarchyChanged(bool is_add,
|
| + views::View* parent,
|
| + views::View* child);
|
| +
|
| + private:
|
| + // The application launcher displaying this info bubble.
|
| + AppLauncher* app_launcher_;
|
| +
|
| + // The navigation bar.
|
| + NavigationBar* navigation_bar_;
|
| +
|
| + // The view containing the renderer view.
|
| + views::NativeViewHost* render_view_container_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(InfoBubbleContentsView);
|
| +};
|
| +
|
| +InfoBubbleContentsView::InfoBubbleContentsView(AppLauncher* app_launcher)
|
| + : app_launcher_(app_launcher),
|
| + navigation_bar_(NULL),
|
| + render_view_container_(NULL) {
|
| }
|
|
|
| -bool AppLauncher::TopContainer::OnMousePressed(const views::MouseEvent& event) {
|
| - // Clicking outside the bubble closes the bubble.
|
| - app_launcher_->Hide();
|
| - return false;
|
| +InfoBubbleContentsView::~InfoBubbleContentsView() {
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BubbleContainer
|
| -//
|
| -// The view that contains the navigation bar and render view. It has a bubble
|
| -// border.
|
| +void InfoBubbleContentsView::BubbleShown() {
|
| + navigation_bar_->RequestFocus();
|
| +}
|
|
|
| -AppLauncher::BubbleContainer::BubbleContainer(AppLauncher* app_launcher)
|
| - : app_launcher_(app_launcher) {
|
| - BubbleBorder* bubble_border = new BubbleBorder();
|
| - bubble_border->set_arrow_location(BubbleBorder::TOP_LEFT);
|
| - set_border(bubble_border);
|
| - set_background(new BubbleBackground(bubble_border));
|
| +void InfoBubbleContentsView::ViewHierarchyChanged(
|
| + bool is_add, views::View* parent, views::View* child) {
|
| + if (!is_add || child != this)
|
| + return;
|
| +
|
| + DCHECK(!render_view_container_);
|
| + render_view_container_ = new RWHVNativeViewHost;
|
| + AddChildView(render_view_container_);
|
| +#if defined(OS_WIN)
|
| + RenderWidgetHostViewWin* view_win =
|
| + static_cast<RenderWidgetHostViewWin*>(app_launcher_->rwhv_);
|
| + // Create the HWND now that we are parented.
|
| + HWND hwnd = view_win->Create(GetWidget()->GetNativeView());
|
| + view_win->ShowWindow(SW_SHOW);
|
| +#endif
|
| + render_view_container_->Attach(app_launcher_->rwhv_->GetNativeView());
|
| +
|
| + navigation_bar_ = new NavigationBar(app_launcher_);
|
| + AddChildView(navigation_bar_);
|
| }
|
|
|
| -void AppLauncher::BubbleContainer::Layout() {
|
| +gfx::Size InfoBubbleContentsView::GetPreferredSize() {
|
| + gfx::Rect bounds = app_launcher_->browser()->window()->GetRestoredBounds();
|
| + return gfx::Size(bounds.width() * 2 / 3, bounds.width() * 4 / 5);
|
| +}
|
| +
|
| +void InfoBubbleContentsView::Layout() {
|
| if (bounds().IsEmpty() || GetChildViewCount() == 0)
|
| return;
|
|
|
| - gfx::Rect bounds = GetLocalBounds(false);
|
| - // TODO(jcampan): figure-out why we need to inset for the contained view not
|
| - // to paint over the bubble border.
|
| - bounds.Inset(2, 2);
|
| -
|
| - app_launcher_->navigation_bar_->SetBounds(bounds.x(), bounds.y(),
|
| - bounds.width(),
|
| - kNavigationBarHeight);
|
| - int render_y = app_launcher_->navigation_bar_->bounds().bottom();
|
| + int navigation_bar_height =
|
| + kNavigationBarHeight + kNavigationEntryYMargin * 2;
|
| + const views::Border* border = navigation_bar_->border();
|
| + if (border) {
|
| + gfx::Insets insets;
|
| + border->GetInsets(&insets);
|
| + navigation_bar_height += insets.height();
|
| + }
|
| + navigation_bar_->SetBounds(x(), y(), width(), navigation_bar_height);
|
| + int render_y = navigation_bar_->bounds().bottom();
|
| gfx::Size rwhv_size =
|
| - gfx::Size(bounds.width(),
|
| - std::max(0, bounds.height() - render_y + bounds.y()));
|
| - app_launcher_->render_view_container_->SetBounds(bounds.x(), render_y,
|
| - rwhv_size.width(),
|
| - rwhv_size.height());
|
| + gfx::Size(width(), std::max(0, height() - render_y + y()));
|
| + render_view_container_->SetBounds(x(), render_y,
|
| + rwhv_size.width(), rwhv_size.height());
|
| app_launcher_->rwhv_->SetSize(rwhv_size);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // AppLauncher
|
|
|
| -AppLauncher::AppLauncher()
|
| - : browser_(NULL),
|
| - popup_(NULL),
|
| +AppLauncher::AppLauncher(Browser* browser)
|
| + : browser_(browser),
|
| + info_bubble_(NULL),
|
| site_instance_(NULL),
|
| contents_rvh_(NULL),
|
| rwhv_(NULL),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(tab_contents_delegate_(this)),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
|
| - top_container_(NULL),
|
| - bubble_container_(NULL),
|
| - navigation_bar_(NULL),
|
| - render_view_container_(NULL),
|
| - has_shown_(false) {
|
| - popup_ = new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
|
| - // The background image has transparency, so we make the window transparent.
|
| - popup_->MakeTransparent();
|
| - popup_->Init(NULL, gfx::Rect());
|
| - WmIpc::instance()->SetWindowType(
|
| - popup_->GetNativeView(),
|
| - WmIpc::WINDOW_TYPE_CHROME_INFO_BUBBLE,
|
| - NULL);
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + tab_contents_delegate_(new TabContentsDelegateImpl(this))) {
|
| + info_bubble_content_ = new InfoBubbleContentsView(this);
|
|
|
| - // Register Esc as an accelerator for closing the app launcher.
|
| - views::FocusManager* focus_manager = popup_->GetFocusManager();
|
| - focus_manager->RegisterAccelerator(views::Accelerator(base::VKEY_ESCAPE,
|
| - false, false, false),
|
| - this);
|
| -
|
| - top_container_ = new TopContainer(this);
|
| - popup_->SetContentsView(top_container_);
|
| -
|
| - bubble_container_ = new BubbleContainer(this);
|
| - top_container_->AddChildView(bubble_container_);
|
| - navigation_bar_ = new NavigationBar(this);
|
| - bubble_container_->AddChildView(navigation_bar_);
|
| -
|
| - GURL menu_url(GetMenuURL());
|
| - DCHECK(BrowserList::begin() != BrowserList::end());
|
| - // TODO(sky): this shouldn't pick a random profile to use.
|
| - Profile* profile = (*BrowserList::begin())->profile();
|
| + Profile* profile = browser_->profile();
|
| int64 session_storage_namespace_id = profile->GetWebKitContext()->
|
| dom_storage_context()->AllocateSessionStorageNamespaceId();
|
| - site_instance_ = SiteInstance::CreateSiteInstanceForURL(profile, menu_url);
|
| + site_instance_ = SiteInstance::CreateSiteInstanceForURL(profile,
|
| + GetMenuURL());
|
| contents_rvh_ = new RenderViewHost(site_instance_, this, MSG_ROUTING_NONE,
|
| session_storage_namespace_id);
|
| + rwhv_ = RenderWidgetHostView::CreateViewForWidget(contents_rvh_);
|
| + contents_rvh_->set_view(rwhv_);
|
|
|
| - rwhv_ = new RenderWidgetHostViewGtk(contents_rvh_);
|
| - rwhv_->InitAsChild();
|
| + // On Windows, we'll create the RWHV HWND once we are attached as we need
|
| + // to be parented for CreateWindow to work.
|
| +#if defined(OS_LINUX)
|
| + RenderWidgetHostViewGtk* view_gtk =
|
| + static_cast<RenderWidgetHostViewGtk*>(rwhv_);
|
| + view_gtk->InitAsChild();
|
| +#endif
|
| +
|
| contents_rvh_->CreateRenderView(profile->GetRequestContext());
|
| -
|
| - render_view_container_ = new RWHVNativeViewHost;
|
| - bubble_container_->AddChildView(render_view_container_);
|
| - render_view_container_->Attach(rwhv_->GetNativeView());
|
| - contents_rvh_->NavigateToURL(menu_url);
|
| -
|
| - ActiveWindowWatcherX::AddObserver(this);
|
| + DCHECK(contents_rvh_->IsRenderViewLive());
|
| + contents_rvh_->NavigateToURL(GetMenuURL());
|
| }
|
|
|
| AppLauncher::~AppLauncher() {
|
| contents_rvh_->Shutdown();
|
| - popup_->CloseNow();
|
| - ActiveWindowWatcherX::RemoveObserver(this);
|
| }
|
|
|
| -void AppLauncher::Update(Browser* browser) {
|
| - if (browser_ != browser) {
|
| - browser_ = browser;
|
| - navigation_bar_->Update(browser);
|
| - // Set the transient window so that ChromeOS WM treat this
|
| - // as if a popup window.
|
| - gtk_window_set_transient_for(
|
| - GTK_WINDOW(popup_->GetNativeView()),
|
| - GTK_WINDOW(browser_->window()->GetNativeHandle()));
|
| - }
|
| +// static
|
| +AppLauncher* AppLauncher::Show(Browser* browser) {
|
| + AppLauncher* app_launcher = new AppLauncher(browser);
|
|
|
| - popup_->SetBounds(browser_->window()->GetRestoredBounds());
|
| - top_container_->Layout();
|
| -}
|
| -
|
| -void AppLauncher::Show(Browser* browser) {
|
| - Cleanup();
|
| -
|
| - Update(browser);
|
| - popup_->Show();
|
| -
|
| - GtkWidget* rwhv_widget = rwhv_->GetNativeView();
|
| - if (!has_shown_) {
|
| - has_shown_ = true;
|
| - gtk_widget_realize(rwhv_widget);
|
| + BrowserView* browser_view = static_cast<BrowserView*>(browser->window());
|
| + TabStrip* tabstrip = browser_view->tabstrip()->AsTabStrip();
|
| + if (!tabstrip) {
|
| + delete app_launcher;
|
| + return NULL;
|
| }
|
| + gfx::Rect bounds = tabstrip->GetNewTabButtonBounds();
|
| + gfx::Point origin = bounds.origin();
|
| + views::RootView::ConvertPointToScreen(tabstrip, &origin);
|
| + bounds.set_origin(origin);
|
| + app_launcher->info_bubble_ =
|
| + InfoBubble::Show(browser_view->frame()->GetWindow(), bounds,
|
| + app_launcher->info_bubble_content_, app_launcher);
|
| + app_launcher->info_bubble_content_->BubbleShown();
|
| + return app_launcher;
|
| }
|
|
|
| -void AppLauncher::ActiveWindowChanged(GdkWindow* active_window) {
|
| - if (!popup_->IsActive())
|
| - Hide();
|
| - else
|
| - navigation_bar_->RequestFocus();
|
| +void AppLauncher::Hide() {
|
| + info_bubble_->Close();
|
| }
|
|
|
| -bool AppLauncher::AcceleratorPressed(const views::Accelerator& accelerator) {
|
| - DCHECK(accelerator.GetKeyCode() == base::VKEY_ESCAPE);
|
| - popup_->Hide();
|
| - return true;
|
| -}
|
| -
|
| -void AppLauncher::Hide() {
|
| - popup_->Hide();
|
| +void AppLauncher::InfoBubbleClosing(InfoBubble* info_bubble,
|
| + bool closed_by_escape) {
|
| // The stack may have pending_contents_ on it. Delay deleting the
|
| // pending_contents_ as TabContents doesn't deal well with being deleted
|
| // while on the stack.
|
| MessageLoop::current()->PostTask(FROM_HERE,
|
| - method_factory_.NewRunnableMethod(&AppLauncher::Cleanup));
|
| + new DeleteTask<AppLauncher>(this));
|
| }
|
|
|
| -void AppLauncher::Cleanup() {
|
| - pending_contents_.reset(NULL);
|
| - method_factory_.RevokeAll();
|
| -}
|
| -
|
| void AppLauncher::RequestMove(const gfx::Rect& new_bounds) {
|
| +#if defined(OS_LINUX)
|
| // Invoking PositionChild results in a gtk signal that triggers attempting to
|
| // to resize the window. We need to set the size request so that it resizes
|
| // correctly when this happens.
|
| - gtk_widget_set_size_request(popup_->GetNativeView(),
|
| + gtk_widget_set_size_request(info_bubble_->GetNativeView(),
|
| new_bounds.width(), new_bounds.height());
|
| - popup_->SetBounds(new_bounds);
|
| + info_bubble_->SetBounds(new_bounds);
|
| +#endif
|
| }
|
|
|
| RendererPreferences AppLauncher::GetRendererPrefs(Profile* profile) const {
|
| @@ -421,28 +458,6 @@
|
| return preferences;
|
| }
|
|
|
| -void AppLauncher::AddTabWithURL(const GURL& url,
|
| - PageTransition::Type transition) {
|
| - switch (StatusAreaView::GetOpenTabsMode()) {
|
| - case StatusAreaView::OPEN_TABS_ON_LEFT: {
|
| - // Add the new tab at the first non-pinned location.
|
| - int index = browser_->tabstrip_model()->IndexOfFirstNonMiniTab();
|
| - browser_->AddTabWithURL(url, GURL(), transition,
|
| - true, index, true, NULL);
|
| - break;
|
| - }
|
| - case StatusAreaView::OPEN_TABS_CLOBBER: {
|
| - browser_->GetSelectedTabContents()->controller().LoadURL(
|
| - url, GURL(), transition);
|
| - break;
|
| - }
|
| - case StatusAreaView::OPEN_TABS_ON_RIGHT: {
|
| - browser_->AddTabWithURL(url, GURL(), transition, true, -1, true, NULL);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| void AppLauncher::CreateNewWindow(int route_id) {
|
| if (pending_contents_.get()) {
|
| NOTREACHED();
|
| @@ -453,13 +468,13 @@
|
| DOMUIFactory::GetDOMUIType(GURL(GetMenuURL())),
|
| NULL);
|
| pending_contents_.reset(helper_.GetCreatedWindow(route_id));
|
| - pending_contents_->set_delegate(&tab_contents_delegate_);
|
| + pending_contents_->set_delegate(tab_contents_delegate_.get());
|
| }
|
|
|
| void AppLauncher::ShowCreatedWindow(int route_id,
|
| - WindowOpenDisposition disposition,
|
| - const gfx::Rect& initial_pos,
|
| - bool user_gesture) {
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture) {
|
| if (disposition == NEW_POPUP) {
|
| pending_contents_->set_delegate(NULL);
|
| browser_->GetSelectedTabContents()->AddNewContents(
|
| @@ -469,27 +484,37 @@
|
| }
|
|
|
| void AppLauncher::StartDragging(const WebDropData& drop_data,
|
| - WebKit::WebDragOperationsMask allowed_ops) {
|
| + WebKit::WebDragOperationsMask allowed_ops,
|
| + 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.
|
| contents_rvh_->DragSourceSystemDragEnded();
|
| }
|
|
|
| -AppLauncher::TabContentsDelegateImpl::TabContentsDelegateImpl(
|
| - AppLauncher* app_launcher)
|
| - : app_launcher_(app_launcher) {
|
| +void AppLauncher::AddTabWithURL(const GURL& url,
|
| + PageTransition::Type transition) {
|
| +#if defined(OS_CHROMEOS)
|
| + switch (chromeos::StatusAreaView::GetOpenTabsMode()) {
|
| + case chromeos::StatusAreaView::OPEN_TABS_ON_LEFT: {
|
| + // Add the new tab at the first non-pinned location.
|
| + int index = browser_->tabstrip_model()->IndexOfFirstNonMiniTab();
|
| + browser_->AddTabWithURL(url, GURL(), transition,
|
| + true, index, true, NULL);
|
| + break;
|
| + }
|
| + case chromeos::StatusAreaView::OPEN_TABS_CLOBBER: {
|
| + browser_->GetSelectedTabContents()->controller().LoadURL(
|
| + url, GURL(), transition);
|
| + break;
|
| + }
|
| + case chromeos::StatusAreaView::OPEN_TABS_ON_RIGHT: {
|
| + browser_->AddTabWithURL(url, GURL(), transition, true, -1, true, NULL);
|
| + break;
|
| + }
|
| + }
|
| +#else
|
| + browser_->AddTabWithURL(url, GURL(), transition, true, -1, true, NULL);
|
| +#endif
|
| }
|
| -
|
| -void AppLauncher::TabContentsDelegateImpl::OpenURLFromTab(
|
| - TabContents* source,
|
| - const GURL& url,
|
| - const GURL& referrer,
|
| - WindowOpenDisposition disposition,
|
| - PageTransition::Type transition) {
|
| - app_launcher_->browser_->OpenURL(url, referrer, NEW_FOREGROUND_TAB,
|
| - PageTransition::LINK);
|
| - app_launcher_->Hide();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|