Home | History | Annotate | Download | only in web_contents
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/web_contents/web_contents_view_android.h"
      6 
      7 #include "base/logging.h"
      8 #include "content/browser/android/content_view_core_impl.h"
      9 #include "content/browser/frame_host/interstitial_page_impl.h"
     10 #include "content/browser/renderer_host/render_widget_host_view_android.h"
     11 #include "content/browser/renderer_host/render_view_host_factory.h"
     12 #include "content/browser/renderer_host/render_view_host_impl.h"
     13 #include "content/browser/web_contents/web_contents_impl.h"
     14 #include "content/public/browser/web_contents_delegate.h"
     15 
     16 namespace content {
     17 WebContentsView* CreateWebContentsView(
     18     WebContentsImpl* web_contents,
     19     WebContentsViewDelegate* delegate,
     20     RenderViewHostDelegateView** render_view_host_delegate_view) {
     21   WebContentsViewAndroid* rv = new WebContentsViewAndroid(
     22       web_contents, delegate);
     23   *render_view_host_delegate_view = rv;
     24   return rv;
     25 }
     26 
     27 WebContentsViewAndroid::WebContentsViewAndroid(
     28     WebContentsImpl* web_contents,
     29     WebContentsViewDelegate* delegate)
     30     : web_contents_(web_contents),
     31       content_view_core_(NULL),
     32       delegate_(delegate) {
     33 }
     34 
     35 WebContentsViewAndroid::~WebContentsViewAndroid() {
     36 }
     37 
     38 void WebContentsViewAndroid::SetContentViewCore(
     39     ContentViewCoreImpl* content_view_core) {
     40   content_view_core_ = content_view_core;
     41   RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
     42       web_contents_->GetRenderWidgetHostView());
     43   if (rwhv)
     44     rwhv->SetContentViewCore(content_view_core_);
     45 
     46   if (web_contents_->ShowingInterstitialPage()) {
     47     rwhv = static_cast<RenderWidgetHostViewAndroid*>(
     48         static_cast<InterstitialPageImpl*>(
     49             web_contents_->GetInterstitialPage())->
     50                 GetRenderViewHost()->GetView());
     51     if (rwhv)
     52       rwhv->SetContentViewCore(content_view_core_);
     53   }
     54 }
     55 
     56 gfx::NativeView WebContentsViewAndroid::GetNativeView() const {
     57   return content_view_core_ ? content_view_core_->GetViewAndroid() : NULL;
     58 }
     59 
     60 gfx::NativeView WebContentsViewAndroid::GetContentNativeView() const {
     61   return content_view_core_ ? content_view_core_->GetViewAndroid() : NULL;
     62 }
     63 
     64 gfx::NativeWindow WebContentsViewAndroid::GetTopLevelNativeWindow() const {
     65   return content_view_core_ ? content_view_core_->GetWindowAndroid() : NULL;
     66 }
     67 
     68 void WebContentsViewAndroid::GetContainerBounds(gfx::Rect* out) const {
     69   *out = content_view_core_ ? gfx::Rect(content_view_core_->GetViewSize())
     70                             : gfx::Rect();
     71 }
     72 
     73 void WebContentsViewAndroid::SetPageTitle(const base::string16& title) {
     74   if (content_view_core_)
     75     content_view_core_->SetTitle(title);
     76 }
     77 
     78 void WebContentsViewAndroid::SizeContents(const gfx::Size& size) {
     79   // TODO(klobag): Do we need to do anything else?
     80   RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
     81   if (rwhv)
     82     rwhv->SetSize(size);
     83 }
     84 
     85 void WebContentsViewAndroid::Focus() {
     86   if (web_contents_->ShowingInterstitialPage())
     87     web_contents_->GetInterstitialPage()->Focus();
     88   else
     89     web_contents_->GetRenderWidgetHostView()->Focus();
     90 }
     91 
     92 void WebContentsViewAndroid::SetInitialFocus() {
     93   if (web_contents_->FocusLocationBarByDefault())
     94     web_contents_->SetFocusToLocationBar(false);
     95   else
     96     Focus();
     97 }
     98 
     99 void WebContentsViewAndroid::StoreFocus() {
    100   NOTIMPLEMENTED();
    101 }
    102 
    103 void WebContentsViewAndroid::RestoreFocus() {
    104   NOTIMPLEMENTED();
    105 }
    106 
    107 DropData* WebContentsViewAndroid::GetDropData() const {
    108   NOTIMPLEMENTED();
    109   return NULL;
    110 }
    111 
    112 gfx::Rect WebContentsViewAndroid::GetViewBounds() const {
    113   if (content_view_core_)
    114     return gfx::Rect(content_view_core_->GetViewSize());
    115 
    116   return gfx::Rect();
    117 }
    118 
    119 void WebContentsViewAndroid::CreateView(
    120     const gfx::Size& initial_size, gfx::NativeView context) {
    121 }
    122 
    123 RenderWidgetHostViewBase* WebContentsViewAndroid::CreateViewForWidget(
    124     RenderWidgetHost* render_widget_host) {
    125   if (render_widget_host->GetView()) {
    126     // During testing, the view will already be set up in most cases to the
    127     // test view, so we don't want to clobber it with a real one. To verify that
    128     // this actually is happening (and somebody isn't accidentally creating the
    129     // view twice), we check for the RVH Factory, which will be set when we're
    130     // making special ones (which go along with the special views).
    131     DCHECK(RenderViewHostFactory::has_factory());
    132     return static_cast<RenderWidgetHostViewBase*>(
    133         render_widget_host->GetView());
    134   }
    135   // Note that while this instructs the render widget host to reference
    136   // |native_view_|, this has no effect without also instructing the
    137   // native view (i.e. ContentView) how to obtain a reference to this widget in
    138   // order to paint it. See ContentView::GetRenderWidgetHostViewAndroid for an
    139   // example of how this is achieved for InterstitialPages.
    140   RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(render_widget_host);
    141   return new RenderWidgetHostViewAndroid(rwhi, content_view_core_);
    142 }
    143 
    144 RenderWidgetHostViewBase* WebContentsViewAndroid::CreateViewForPopupWidget(
    145     RenderWidgetHost* render_widget_host) {
    146   RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(render_widget_host);
    147   return new RenderWidgetHostViewAndroid(rwhi, NULL);
    148 }
    149 
    150 void WebContentsViewAndroid::RenderViewCreated(RenderViewHost* host) {
    151 }
    152 
    153 void WebContentsViewAndroid::RenderViewSwappedIn(RenderViewHost* host) {
    154 }
    155 
    156 void WebContentsViewAndroid::SetOverscrollControllerEnabled(bool enabled) {
    157 }
    158 
    159 void WebContentsViewAndroid::ShowContextMenu(
    160     RenderFrameHost* render_frame_host, const ContextMenuParams& params) {
    161   if (delegate_)
    162     delegate_->ShowContextMenu(render_frame_host, params);
    163 }
    164 
    165 void WebContentsViewAndroid::ShowPopupMenu(
    166     const gfx::Rect& bounds,
    167     int item_height,
    168     double item_font_size,
    169     int selected_item,
    170     const std::vector<MenuItem>& items,
    171     bool right_aligned,
    172     bool allow_multiple_selection) {
    173   if (content_view_core_) {
    174     content_view_core_->ShowSelectPopupMenu(
    175         bounds, items, selected_item, allow_multiple_selection);
    176   }
    177 }
    178 
    179 void WebContentsViewAndroid::HidePopupMenu() {
    180   if (content_view_core_)
    181     content_view_core_->HideSelectPopupMenu();
    182 }
    183 
    184 void WebContentsViewAndroid::StartDragging(
    185     const DropData& drop_data,
    186     blink::WebDragOperationsMask allowed_ops,
    187     const gfx::ImageSkia& image,
    188     const gfx::Vector2d& image_offset,
    189     const DragEventSourceInfo& event_info) {
    190   NOTIMPLEMENTED();
    191 }
    192 
    193 void WebContentsViewAndroid::UpdateDragCursor(blink::WebDragOperation op) {
    194   NOTIMPLEMENTED();
    195 }
    196 
    197 void WebContentsViewAndroid::GotFocus() {
    198   // This is only used in the views FocusManager stuff but it bleeds through
    199   // all subclasses. http://crbug.com/21875
    200 }
    201 
    202 // This is called when we the renderer asks us to take focus back (i.e., it has
    203 // iterated past the last focusable element on the page).
    204 void WebContentsViewAndroid::TakeFocus(bool reverse) {
    205   if (web_contents_->GetDelegate() &&
    206       web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse))
    207     return;
    208   web_contents_->GetRenderWidgetHostView()->Focus();
    209 }
    210 
    211 } // namespace content
    212