web_contents_view_android.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
16091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// Copyright (c) 2012 The Chromium Authors. All rights reserved. 26091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// Use of this source code is governed by a BSD-style license that can be 36091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// found in the LICENSE file. 46091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 56091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/web_contents/web_contents_view_android.h" 66091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 76091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "base/logging.h" 86091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/android/content_view_core_impl.h" 96091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/frame_host/interstitial_page_impl.h" 106091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/media/android/browser_media_player_manager.h" 116091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/renderer_host/render_widget_host_view_android.h" 126091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/renderer_host/render_view_host_factory.h" 136091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/renderer_host/render_view_host_impl.h" 146091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/browser/web_contents/web_contents_impl.h" 156091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "content/public/browser/web_contents_delegate.h" 166091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 176091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencernamespace content { 186091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid SpencerWebContentsViewPort* CreateWebContentsView( 196091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer WebContentsImpl* web_contents, 206091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer WebContentsViewDelegate* delegate, 216091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderViewHostDelegateView** render_view_host_delegate_view) { 226091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer WebContentsViewAndroid* rv = new WebContentsViewAndroid( 236091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents, delegate); 246091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer *render_view_host_delegate_view = rv; 256091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return rv; 266091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 276091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 286091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid SpencerWebContentsViewAndroid::WebContentsViewAndroid( 296091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer WebContentsImpl* web_contents, 306091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer WebContentsViewDelegate* delegate) 316091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer : web_contents_(web_contents), 326091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer content_view_core_(NULL), 336091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer delegate_(delegate) { 346091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 356091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 366091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid SpencerWebContentsViewAndroid::~WebContentsViewAndroid() { 376091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 386091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 396091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::SetContentViewCore( 406091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer ContentViewCoreImpl* content_view_core) { 416091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer content_view_core_ = content_view_core; 426091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>( 436091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->GetRenderWidgetHostView()); 446091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rwhv) 456091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer rwhv->SetContentViewCore(content_view_core_); 466091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 476091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (web_contents_->ShowingInterstitialPage()) { 486091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer rwhv = static_cast<RenderWidgetHostViewAndroid*>( 496091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer static_cast<InterstitialPageImpl*>( 506091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->GetInterstitialPage())-> 516091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer GetRenderViewHost()->GetView()); 526091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rwhv) 536091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer rwhv->SetContentViewCore(content_view_core_); 546091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer } 556091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 566091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 576091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencergfx::NativeView WebContentsViewAndroid::GetNativeView() const { 586091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return content_view_core_ ? content_view_core_->GetViewAndroid() : NULL; 596091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 606091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 616091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencergfx::NativeView WebContentsViewAndroid::GetContentNativeView() const { 626091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return content_view_core_ ? content_view_core_->GetViewAndroid() : NULL; 636091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 646091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 656091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencergfx::NativeWindow WebContentsViewAndroid::GetTopLevelNativeWindow() const { 666091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return content_view_core_ ? content_view_core_->GetWindowAndroid() : NULL; 676091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 686091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 696091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::GetContainerBounds(gfx::Rect* out) const { 706091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 716091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rwhv) 726091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer *out = rwhv->GetViewBounds(); 736091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 746091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 756091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::SetPageTitle(const base::string16& title) { 766091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (content_view_core_) 776091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer content_view_core_->SetTitle(title); 786091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 796091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 806091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::OnTabCrashed(base::TerminationStatus status, 816091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer int error_code) { 826091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 836091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->GetRenderViewHost()); 846091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rvh->media_player_manager()) 856091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer rvh->media_player_manager()->DestroyAllMediaPlayers(); 866091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (content_view_core_) 876091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer content_view_core_->OnTabCrashed(); 886091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 896091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 906091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::SizeContents(const gfx::Size& size) { 916091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // TODO(klobag): Do we need to do anything else? 926091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 936091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rwhv) 946091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer rwhv->SetSize(size); 956091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 966091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 976091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::Focus() { 986091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (web_contents_->ShowingInterstitialPage()) 996091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->GetInterstitialPage()->Focus(); 1006091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer else 1016091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->GetRenderWidgetHostView()->Focus(); 1026091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1036091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1046091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::SetInitialFocus() { 1056091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (web_contents_->FocusLocationBarByDefault()) 1066091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer web_contents_->SetFocusToLocationBar(false); 1076091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer else 1086091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer Focus(); 1096091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1106091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1116091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::StoreFocus() { 1126091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer NOTIMPLEMENTED(); 1136091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1146091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1156091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::RestoreFocus() { 1166091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer NOTIMPLEMENTED(); 1176091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1186091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1196091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid SpencerDropData* WebContentsViewAndroid::GetDropData() const { 1206091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer NOTIMPLEMENTED(); 1216091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return NULL; 1226091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1236091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1246091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencergfx::Rect WebContentsViewAndroid::GetViewBounds() const { 1256091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 1266091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (rwhv) 1276091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return rwhv->GetViewBounds(); 1286091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer else 1296091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return gfx::Rect(); 1306091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1316091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1326091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencervoid WebContentsViewAndroid::CreateView( 1336091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer const gfx::Size& initial_size, gfx::NativeView context) { 1346091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer} 1356091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 1366091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid SpencerRenderWidgetHostView* WebContentsViewAndroid::CreateViewForWidget( 1376091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer RenderWidgetHost* render_widget_host) { 1386091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer if (render_widget_host->GetView()) { 1396091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // During testing, the view will already be set up in most cases to the 1406091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // test view, so we don't want to clobber it with a real one. To verify that 1416091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // this actually is happening (and somebody isn't accidentally creating the 1426091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // view twice), we check for the RVH Factory, which will be set when we're 1436091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // making special ones (which go along with the special views). 1446091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer DCHECK(RenderViewHostFactory::has_factory()); 1456091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer return render_widget_host->GetView(); 1466091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer } 1476091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // Note that while this instructs the render widget host to reference 1486091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer // |native_view_|, this has no effect without also instructing the 149 // native view (i.e. ContentView) how to obtain a reference to this widget in 150 // order to paint it. See ContentView::GetRenderWidgetHostViewAndroid for an 151 // example of how this is achieved for InterstitialPages. 152 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(render_widget_host); 153 RenderWidgetHostView* view = new RenderWidgetHostViewAndroid( 154 rwhi, content_view_core_); 155 return view; 156} 157 158RenderWidgetHostView* WebContentsViewAndroid::CreateViewForPopupWidget( 159 RenderWidgetHost* render_widget_host) { 160 return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host); 161} 162 163void WebContentsViewAndroid::RenderViewCreated(RenderViewHost* host) { 164} 165 166void WebContentsViewAndroid::RenderViewSwappedIn(RenderViewHost* host) { 167} 168 169void WebContentsViewAndroid::SetOverscrollControllerEnabled(bool enabled) { 170} 171 172void WebContentsViewAndroid::ShowContextMenu( 173 RenderFrameHost* render_frame_host, const ContextMenuParams& params) { 174 if (delegate_) 175 delegate_->ShowContextMenu(render_frame_host, params); 176} 177 178void WebContentsViewAndroid::ShowPopupMenu( 179 const gfx::Rect& bounds, 180 int item_height, 181 double item_font_size, 182 int selected_item, 183 const std::vector<MenuItem>& items, 184 bool right_aligned, 185 bool allow_multiple_selection) { 186 if (content_view_core_) { 187 content_view_core_->ShowSelectPopupMenu( 188 items, selected_item, allow_multiple_selection); 189 } 190} 191 192void WebContentsViewAndroid::HidePopupMenu() { 193 // TODO(tkent): implement 194} 195 196void WebContentsViewAndroid::StartDragging( 197 const DropData& drop_data, 198 blink::WebDragOperationsMask allowed_ops, 199 const gfx::ImageSkia& image, 200 const gfx::Vector2d& image_offset, 201 const DragEventSourceInfo& event_info) { 202 NOTIMPLEMENTED(); 203} 204 205void WebContentsViewAndroid::UpdateDragCursor(blink::WebDragOperation op) { 206 NOTIMPLEMENTED(); 207} 208 209void WebContentsViewAndroid::GotFocus() { 210 // This is only used in the views FocusManager stuff but it bleeds through 211 // all subclasses. http://crbug.com/21875 212} 213 214// This is called when we the renderer asks us to take focus back (i.e., it has 215// iterated past the last focusable element on the page). 216void WebContentsViewAndroid::TakeFocus(bool reverse) { 217 if (web_contents_->GetDelegate() && 218 web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse)) 219 return; 220 web_contents_->GetRenderWidgetHostView()->Focus(); 221} 222 223} // namespace content 224