15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/defaults.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/aura/tab_contents/web_drag_bookmark_handler_aura.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sad_tab_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/sad_tab_view.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/web_modal/popup_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_AURA)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/views/link_disambiguation/link_disambiguation_popup.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeWebContentsViewDelegateViews::ChromeWebContentsViewDelegateViews(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents)
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : ContextMenuDelegate(web_contents),
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      web_contents_(web_contents) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_focused_view_storage_id_ =
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::ViewStorage::GetInstance()->CreateStorageID();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeWebContentsViewDelegateViews::~ChromeWebContentsViewDelegateViews() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure to remove any stored view we may still have in the ViewStorage.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is possible the view went away before us, so we only do this if the
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // view is registered.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ViewStorage* view_storage = views::ViewStorage::GetInstance();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_storage->RetrieveView(last_focused_view_storage_id_) != NULL)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_storage->RemoveView(last_focused_view_storage_id_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebDragDestDelegate*
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeWebContentsViewDelegateViews::GetDragDestDelegate() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We install a chrome specific handler to intercept bookmark drags for the
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark manager/extension API.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_handler_.reset(new WebDragBookmarkHandlerAura);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bookmark_handler_.get();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeWebContentsViewDelegateViews::Focus() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SadTabHelper* sad_tab_helper = SadTabHelper::FromWebContents(web_contents_);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sad_tab_helper) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SadTabView* sad_tab = static_cast<SadTabView*>(sad_tab_helper->sad_tab());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sad_tab) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sad_tab->RequestFocus();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_modal::PopupManager* popup_manager =
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_modal::PopupManager::FromWebContents(web_contents_);
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (popup_manager)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    popup_manager->WasFocused(web_contents_);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeWebContentsViewDelegateViews::TakeFocus(bool reverse) {
7458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  views::FocusManager* focus_manager = GetFocusManager();
7558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (focus_manager)
7658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    focus_manager->AdvanceFocus(reverse);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeWebContentsViewDelegateViews::StoreFocus() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ViewStorage* view_storage = views::ViewStorage::GetInstance();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_storage->RetrieveView(last_focused_view_storage_id_) != NULL)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_storage->RemoveView(last_focused_view_storage_id_);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetFocusManager())
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* focused_view = GetFocusManager()->GetFocusedView();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focused_view)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_storage->StoreView(last_focused_view_storage_id_, focused_view);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeWebContentsViewDelegateViews::RestoreFocus() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ViewStorage* view_storage = views::ViewStorage::GetInstance();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* last_focused_view =
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_storage->RetrieveView(last_focused_view_storage_id_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!last_focused_view) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInitialFocus();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (last_focused_view->IsFocusable() &&
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetFocusManager()->ContainsView(last_focused_view)) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_focused_view->RequestFocus();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The focused view may not belong to the same window hierarchy (e.g.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // if the location bar was focused and the tab is dragged out), or it may
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // no longer be focusable (e.g. if the location bar was focused and then
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // we switched to fullscreen mode).  In that case we default to the
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // default focus.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInitialFocus();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_storage->RemoveView(last_focused_view_storage_id_);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochscoped_ptr<RenderViewContextMenu> ChromeWebContentsViewDelegateViews::BuildMenu(
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    content::WebContents* web_contents,
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const content::ContextMenuParams& params) {
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<RenderViewContextMenu> menu;
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  content::RenderFrameHost* focused_frame = web_contents->GetFocusedFrame();
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // If the frame tree does not have a focused frame at this point, do not
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // bother creating RenderViewContextMenuViews.
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // This happens if the frame has navigated to a different page before
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // ContextMenu message was received by the current RenderFrameHost.
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (focused_frame) {
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    menu.reset(RenderViewContextMenuViews::Create(focused_frame, params));
1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    menu->Init();
1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return menu.Pass();
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid ChromeWebContentsViewDelegateViews::ShowMenu(
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    scoped_ptr<RenderViewContextMenu> menu) {
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  context_menu_.reset(static_cast<RenderViewContextMenuViews*>(menu.release()));
1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!context_menu_.get())
1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Menus need a Widget to work. If we're not the active tab we won't
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessarily be in a widget.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* top_level_widget = GetTopLevelWidget();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!top_level_widget)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const content::ContextMenuParams& params = context_menu_->params();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't show empty menus.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (context_menu_->menu_model().GetItemCount() == 0)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_point(params.x, params.y);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Convert from target window coordinates to root window coordinates.
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::Window* target_window = GetActiveNativeView();
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::Window* root_window = target_window->GetRootWindow();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetScreenPositionClient(root_window);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_position_client) {
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    screen_position_client->ConvertPointToScreen(target_window,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &screen_point);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable recursive tasks on the message loop so we can get updates while
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the context menu is being displayed.
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::ScopedNestableTaskAllower allow(
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::MessageLoop::current());
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  context_menu_->RunMenuAt(top_level_widget, screen_point, params.source_type);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid ChromeWebContentsViewDelegateViews::ShowContextMenu(
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    content::RenderFrameHost* render_frame_host,
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const content::ContextMenuParams& params) {
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ShowMenu(
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      BuildMenu(content::WebContents::FromRenderFrameHost(render_frame_host),
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                params));
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeWebContentsViewDelegateViews::ShowDisambiguationPopup(
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Rect& target_rect,
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const SkBitmap& zoomed_bitmap,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::NativeView content,
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Callback<void(ui::GestureEvent*)>& gesture_cb,
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Callback<void(ui::MouseEvent*)>& mouse_cb) {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_AURA)
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  link_disambiguation_popup_.reset(new LinkDisambiguationPopup);
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  link_disambiguation_popup_->Show(
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      zoomed_bitmap, target_rect, content, gesture_cb, mouse_cb);
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeWebContentsViewDelegateViews::HideDisambiguationPopup() {
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  link_disambiguation_popup_.reset();
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeWebContentsViewDelegateViews::SizeChanged(const gfx::Size& size) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SadTabHelper* sad_tab_helper = SadTabHelper::FromWebContents(web_contents_);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sad_tab_helper)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SadTabView* sad_tab = static_cast<SadTabView*>(sad_tab_helper->sad_tab());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sad_tab)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sad_tab->GetWidget()->SetBounds(gfx::Rect(size));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)aura::Window* ChromeWebContentsViewDelegateViews::GetActiveNativeView() {
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return web_contents_->GetFullscreenRenderWidgetHostView() ?
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      web_contents_->GetFullscreenRenderWidgetHostView()->GetNativeView() :
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      web_contents_->GetNativeView();
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* ChromeWebContentsViewDelegateViews::GetTopLevelWidget() {
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return views::Widget::GetTopLevelWidgetForNativeView(GetActiveNativeView());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::FocusManager*
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeWebContentsViewDelegateViews::GetFocusManager() {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* toplevel_widget = GetTopLevelWidget();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return toplevel_widget ? toplevel_widget->GetFocusManager() : NULL;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeWebContentsViewDelegateViews::SetInitialFocus() {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->FocusLocationBarByDefault()) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (web_contents_->GetDelegate())
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetDelegate()->SetFocusToLocationBar(false);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    web_contents_->Focus();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContentsViewDelegate* CreateWebContentsViewDelegate(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ChromeWebContentsViewDelegateViews(web_contents);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
233