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