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 "ui/views/controls/webview/webview.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/browser_accessibility_state.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessibility_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/accessibility/native_view_accessibility.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char WebView::kViewClassName[] = "WebView";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebView, public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebView::WebView(content::BrowserContext* browser_context)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : wcv_holder_(new NativeViewHost),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_(NULL),
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      embed_fullscreen_widget_mode_enabled_(false),
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      is_embedding_fullscreen_widget_(false),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context_(browser_context),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow_accelerators_(false) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(wcv_holder_);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NativeViewAccessibility::RegisterWebView(this);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebView::~WebView() {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NativeViewAccessibility::UnregisterWebView(this);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebView::GetWebContents() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateWebContentsWithSiteInstance(NULL);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_contents_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::CreateWebContentsWithSiteInstance(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::SiteInstance* site_instance) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents_) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wc_owner_.reset(CreateWebContents(browser_context_, site_instance));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_ = wc_owner_.get();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->SetDelegate(this);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttachWebContents();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::SetWebContents(content::WebContents* web_contents) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents == web_contents_)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetachWebContents();
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (wc_owner_ != web_contents)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    wc_owner_.reset();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_ = web_contents;
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (embed_fullscreen_widget_mode_enabled_) {
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    is_embedding_fullscreen_widget_ =
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        web_contents_ && web_contents_->GetFullscreenRenderWidgetHostView();
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    is_embedding_fullscreen_widget_ = false;
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AttachWebContents();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebView::SetEmbedFullscreenWidgetMode(bool enable) {
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool should_be_embedded = enable;
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!embed_fullscreen_widget_mode_enabled_ && enable) {
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(!is_embedding_fullscreen_widget_);
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    embed_fullscreen_widget_mode_enabled_ = true;
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    should_be_embedded =
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        web_contents_ && web_contents_->GetFullscreenRenderWidgetHostView();
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else if (embed_fullscreen_widget_mode_enabled_ && !enable) {
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    embed_fullscreen_widget_mode_enabled_ = false;
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (should_be_embedded != is_embedding_fullscreen_widget_)
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ReattachForFullscreenChange(should_be_embedded);
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::LoadInitialURL(const GURL& url) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWebContents()->GetController().LoadURL(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, content::Referrer(), content::PAGE_TRANSITION_AUTO_TOPLEVEL,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::SetFastResize(bool fast_resize) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wcv_holder_->set_fast_resize(fast_resize);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::OnWebContentsFocused(content::WebContents* web_contents) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FocusManager* focus_manager = GetFocusManager();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focus_manager)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focus_manager->SetFocusedView(this);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::SetPreferredSize(const gfx::Size& preferred_size) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preferred_size_ = preferred_size;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PreferredSizeChanged();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebView, View overrides:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* WebView::GetClassName() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wcv_holder_->SetSize(bounds().size());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void WebView::ViewHierarchyChanged(
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttachWebContents();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebView::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (allow_accelerators_)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FocusManager::IsTabTraversalKeyEvent(event);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't look-up accelerators or tab-traversal if we are showing a non-crashed
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TabContents.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We'll first give the page a chance to process the key events.  If it does
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not process them, they'll be returned to us and we'll treat them as
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // accelerators then.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_contents_ && !web_contents_->IsCrashed();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebView::IsFocusable() const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to be focusable when our contents is not a view hierarchy, as
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clicking on the contents needs to focus us.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!web_contents_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::OnFocus() {
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!web_contents_)
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (is_embedding_fullscreen_widget_) {
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    content::RenderWidgetHostView* const current_fs_view =
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        web_contents_->GetFullscreenRenderWidgetHostView();
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (current_fs_view)
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      current_fs_view->Focus();
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetView()->Focus();
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::AboutToRequestFocusFromTabTraversal(bool reverse) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->FocusThroughTabTraversal(reverse);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::GetAccessibleState(ui::AccessibleViewState* state) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->role = ui::AccessibilityTypes::ROLE_GROUPING;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeViewAccessible WebView::GetNativeViewAccessible() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RenderWidgetHostView* host_view =
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents_->GetRenderWidgetHostView();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (host_view)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return host_view->GetNativeViewAccessible();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return View::GetNativeViewAccessible();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebView::GetPreferredSize() {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (preferred_size_ == gfx::Size())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return View::GetPreferredSize();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return preferred_size_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebView, content::WebContentsDelegate implementation:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::WebContentsFocused(content::WebContents* web_contents) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(wc_owner_.get());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The WebView is only the delegate of WebContentses it creates itself.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnWebContentsFocused(web_contents_);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool WebView::EmbedsFullscreenWidget() const {
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(wc_owner_.get());
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return embed_fullscreen_widget_mode_enabled_;
198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// WebView, content::WebContentsObserver implementation:
202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebView::RenderViewHostChanged(content::RenderViewHost* old_host,
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    content::RenderViewHost* new_host) {
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FocusManager* const focus_manager = GetFocusManager();
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (focus_manager && focus_manager->GetFocusedView() == this)
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    OnFocus();
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebView::WebContentsDestroyed(content::WebContents* web_contents) {
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We watch for destruction of WebContents that we host but do not own. If we
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // own a WebContents that is being destroyed, we're doing the destroying, so
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // we don't want to recursively tear it down while it's being torn down.
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!wc_owner_.get())
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetWebContents(NULL);
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebView::DidShowFullscreenWidget(int routing_id) {
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (embed_fullscreen_widget_mode_enabled_)
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReattachForFullscreenChange(true);
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebView::DidDestroyFullscreenWidget(int routing_id) {
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (embed_fullscreen_widget_mode_enabled_)
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReattachForFullscreenChange(false);
226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebView, private:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::AttachWebContents() {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevents attachment if the WebView isn't already in a Widget, or it's
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already attached.
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!GetWidget() || !web_contents_)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const gfx::NativeView view_to_attach = is_embedding_fullscreen_widget_ ?
238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      web_contents_->GetFullscreenRenderWidgetHostView()->GetNativeView() :
239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      web_contents_->GetView()->GetNativeView();
240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (wcv_holder_->native_view() == view_to_attach)
241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  wcv_holder_->Attach(view_to_attach);
243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // The view will not be focused automatically when it is attached, so we need
245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // to pass on focus to it if the FocusManager thinks the view is focused. Note
246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // that not every Widget has a focus manager.
247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FocusManager* const focus_manager = GetFocusManager();
248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (focus_manager && focus_manager->GetFocusedView() == this)
249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    OnFocus();
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebContentsObserver::Observe(web_contents_);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!is_embedding_fullscreen_widget_) {
255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    web_contents_->SetParentNativeViewAccessible(
256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        parent()->GetNativeViewAccessible());
257d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebView::DetachWebContents() {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wcv_holder_->Detach();
264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN)
265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!is_embedding_fullscreen_widget_) {
266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if !defined(USE_AURA)
267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // TODO(beng): This should either not be necessary, or be done implicitly
268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // by NativeViewHostWin on Detach(). As it stands, this is needed so that
269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // the of the detached contents knows to tell the renderer it's been
270d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // hidden.
271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      //
272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // Moving this out of here would also mean we wouldn't be potentially
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // calling member functions on a half-destroyed WebContents.
274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ShowWindow(web_contents_->GetView()->GetNativeView(), SW_HIDE);
275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else
276d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      web_contents_->SetParentNativeViewAccessible(NULL);
277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebContentsObserver::Observe(NULL);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebView::ReattachForFullscreenChange(bool enter_fullscreen) {
285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DetachWebContents();
286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  is_embedding_fullscreen_widget_ = enter_fullscreen &&
287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      web_contents_ && web_contents_->GetFullscreenRenderWidgetHostView();
288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AttachWebContents();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebView::CreateWebContents(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserContext* browser_context,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::SiteInstance* site_instance) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* contents = NULL;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ViewsDelegate::views_delegate) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents = ViewsDelegate::views_delegate->CreateWebContents(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_context, site_instance);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!contents) {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents::CreateParams create_params(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser_context, site_instance);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return content::WebContents::Create(create_params);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
310