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