1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 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 "content/browser/android/content_view_core_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_array.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/metrics/histogram.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/layers/solid_color_layer.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/browser_accessibility_state_impl.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/android/gesture_event_type.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/interstitial_page_delegate_android.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/android/java/gin_java_bridge_dispatcher_host.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/load_url_params.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/browser/android/popup_touch_handle_drawable.h"
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/geolocation/geolocation_dispatcher_host.h"
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/media/media_web_contents_observer.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/compositor_impl_android.h"
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/renderer_host/input/motion_event_android.h"
30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_builders_android.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/renderer_host/input/web_input_event_util.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_android.h"
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/transition_request_manager.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_view_android.h"
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/common/frame_messages.h"
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/input/web_input_event_traits.h"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/screen_orientation_dispatcher_host.h"
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/ssl_host_state_delegate.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/menu_item.h"
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/user_agent.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentViewCore_jni.h"
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/view_android.h"
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/android/java_bitmap.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_f.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Describes the type and enabled state of a select popup item.
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace {
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum {
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define DEFINE_POPUP_ITEM_TYPE(name, value) POPUP_ITEM_TYPE_##name = value,
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/android/popup_item_type_list.h"
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#undef DEFINE_POPUP_ITEM_TYPE
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} //namespace
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* kContentViewUserDataKey = &kContentViewUserDataKey;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetRenderProcessIdFromRenderViewHost(RenderViewHost* host) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(host);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* render_process = host->GetProcess();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(render_process);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_process->HasConnection())
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return render_process->GetHandle();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedJavaLocalRef<jobject> CreateJavaRect(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& rect) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ScopedJavaLocalRef<jobject>(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_createRect(env,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.x()),
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.y()),
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.right()),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.bottom())));
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ToGestureEventType(WebInputEvent::Type type) {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (type) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollBegin:
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SCROLL_START;
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollEnd:
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SCROLL_END;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollUpdate:
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SCROLL_BY;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureFlingStart:
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return FLING_START;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureFlingCancel:
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return FLING_CANCEL;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureShowPress:
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SHOW_PRESS;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureTap:
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SINGLE_TAP_CONFIRMED;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureTapUnconfirmed:
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SINGLE_TAP_UNCONFIRMED;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureTapDown:
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return TAP_DOWN;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureTapCancel:
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return TAP_CANCEL;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureDoubleTap:
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return DOUBLE_TAP;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureLongPress:
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return LONG_PRESS;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureLongTap:
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return LONG_TAP;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GesturePinchBegin:
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return PINCH_BEGIN;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GesturePinchEnd:
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return PINCH_END;
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GesturePinchUpdate:
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return PINCH_BY;
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureTwoFingerTap:
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollUpdateWithoutPropagation:
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NOTREACHED() << "Invalid source gesture type: "
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   << WebInputEventTraits::GetName(type);
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return -1;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)float GetPrimaryDisplayDeviceScaleFactor() {
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const gfx::Display& display =
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return display.device_scale_factor();
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enables a callback when the underlying WebContents is destroyed, to enable
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nulling the back-pointer.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentViewCoreImpl::ContentViewUserData
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::SupportsUserData::Data {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ContentViewUserData(ContentViewCoreImpl* content_view_core)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : content_view_core_(content_view_core) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentViewUserData() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(joth): When chrome has finished removing the TabContents class (see
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // crbug.com/107201) consider inverting relationship, so ContentViewCore
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // would own WebContents. That effectively implies making the WebContents
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // destructor private on Android.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete content_view_core_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* get() const { return content_view_core_; }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not using scoped_ptr as ContentViewCoreImpl destructor is private.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* content_view_core_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(ContentViewUserData);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCoreImpl* ContentViewCoreImpl::FromWebContents(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl::ContentViewUserData* data =
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<ContentViewCoreImpl::ContentViewUserData*>(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents->GetUserData(kContentViewUserDataKey));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data ? data->get() : NULL;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCore* ContentViewCore::FromWebContents(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ContentViewCoreImpl::FromWebContents(web_contents);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCore* ContentViewCore::GetNativeContentViewCore(JNIEnv* env,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           jobject obj) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<ContentViewCore*>(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getNativeContentViewCore(env, obj));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ContentViewCoreImpl::ContentViewCoreImpl(
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    JNIEnv* env,
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jobject obj,
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebContents* web_contents,
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::ViewAndroid* view_android,
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::WindowAndroid* window_android,
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jobject java_bridge_retained_object_set)
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : WebContentsObserver(web_contents),
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      java_ref_(env, obj),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_(static_cast<WebContentsImpl*>(web_contents)),
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      root_layer_(cc::SolidColorLayer::Create()),
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      dpi_scale_(GetPrimaryDisplayDeviceScaleFactor()),
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      view_android_(view_android),
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      window_android_(window_android),
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_orientation_(0),
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      accessibility_enabled_(false) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(web_contents) <<
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "A ContentViewCoreImpl should be created with a valid WebContents.";
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(view_android_);
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(window_android_);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetBackgroundColor(GetBackgroundColor(env, obj));
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size physical_size(
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingWidthPix(env, obj),
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingHeightPix(env, obj));
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetBounds(physical_size);
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetIsDrawable(true);
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, the only use case we have for overriding a user agent involves
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // spoofing a desktop Linux user agent for "Request desktop site".
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Automatically set it for all WebContents so that it is available when a
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationEntry requires the user agent to be overridden.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kLinuxInfoStr[] = "X11; Linux x86_64";
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string product = content::GetContentClient()->GetProduct();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string spoofed_ua =
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      BuildUserAgentFromOSAndProduct(kLinuxInfoStr, product);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetUserAgentOverride(spoofed_ua);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245c64ad5c2e063cde757eba7f9499a8e748b57cbdcMikhail Naganov  java_bridge_dispatcher_host_ =
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new GinJavaBridgeDispatcherHost(web_contents,
247c64ad5c2e063cde757eba7f9499a8e748b57cbdcMikhail Naganov                                      java_bridge_retained_object_set);
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitWebContents();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCoreImpl::~ContentViewCoreImpl() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  java_ref_.reset();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!j_obj.is_null()) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Java_ContentViewCore_onNativeContentViewCoreDestroyed(
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        env, j_obj.obj(), reinterpret_cast<intptr_t>(this));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject>
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ContentViewCoreImpl::GetWebContentsAndroid(JNIEnv* env, jobject obj) {
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return web_contents_->GetJavaWebContents();
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnJavaContentViewCoreDestroyed(JNIEnv* env,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         jobject obj) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(env->IsSameObject(java_ref_.get(env).obj(), obj));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  java_ref_.reset();
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Java peer has gone, ContentViewCore is not functional and waits to
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // be destroyed with WebContents.
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We need to reset WebContentsViewAndroid's reference, otherwise, there
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // could have call in when swapping the WebContents,
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // see http://crbug.com/383939 .
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(web_contents_);
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static_cast<WebContentsViewAndroid*>(
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      static_cast<WebContentsImpl*>(web_contents_)->GetView())->
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          SetContentViewCore(NULL);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::InitWebContents() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(web_contents_);
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static_cast<WebContentsViewAndroid*>(
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<WebContentsImpl*>(web_contents_)->GetView())->
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          SetContentViewCore(this);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!web_contents_->GetUserData(kContentViewUserDataKey));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->SetUserData(kContentViewUserDataKey,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             new ContentViewUserData(this));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ContentViewCoreImpl::RenderViewReady() {
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!obj.is_null())
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Java_ContentViewCore_onRenderProcessChange(env, obj.obj());
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (device_orientation_ != 0)
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SendOrientationChangeEventInternal();
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ContentViewCoreImpl::RenderViewHostChanged(RenderViewHost* old_host,
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                RenderViewHost* new_host) {
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int old_pid = 0;
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (old_host) {
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    old_pid = GetRenderProcessIdFromRenderViewHost(old_host);
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderWidgetHostViewAndroid* view =
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        static_cast<RenderWidgetHostViewAndroid*>(old_host->GetView());
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (view)
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      view->SetContentViewCore(NULL);
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view = static_cast<RenderWidgetHostViewAndroid*>(new_host->GetView());
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (view)
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      view->SetContentViewCore(this);
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int new_pid = GetRenderProcessIdFromRenderViewHost(
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents_->GetRenderViewHost());
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (new_pid != old_pid) {
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Notify the Java side that the renderer process changed.
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    JNIEnv* env = AttachCurrentThread();
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!obj.is_null()) {
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Java_ContentViewCore_onRenderProcessChange(env, obj.obj());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetFocusInternal(HasFocus());
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetAccessibilityEnabledInternal(accessibility_enabled_);
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAndroid*
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentViewCoreImpl::GetRenderWidgetHostViewAndroid() {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv = NULL;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv = web_contents_->GetRenderWidgetHostView();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (web_contents_->ShowingInterstitialPage()) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rwhv = static_cast<InterstitialPageImpl*>(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_->GetInterstitialPage())->
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetRenderViewHost()->GetView();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<RenderWidgetHostViewAndroid*>(rwhv);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetJavaObject() {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return java_ref_.get(env);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jint ContentViewCoreImpl::GetBackgroundColor(JNIEnv* env, jobject obj) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhva)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SK_ColorWHITE;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rwhva->GetCachedBackgroundColor();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::PauseOrResumeGeolocation(bool should_pause) {
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_contents_->geolocation_dispatcher_host()->PauseOrResume(should_pause);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// All positions and sizes are in CSS pixels.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note that viewport_width/height is a best effort based.
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ContentViewCore has the actual information about the physical viewport size.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::UpdateFrameInfo(
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& scroll_offset,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& page_scale_factor_limits,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::SizeF& content_size,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::SizeF& viewport_size,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& controls_offset,
37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const gfx::Vector2dF& content_offset) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  window_android_->set_content_offset(
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::ScaleVector2d(content_offset, dpi_scale_));
3808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_updateFrameInfo(
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(),
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_offset.x(),
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_offset.y(),
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor,
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor_limits.x(),
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor_limits.y(),
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_size.width(),
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_size.height(),
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      viewport_size.width(),
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      viewport_size.height(),
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controls_offset.y(),
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content_offset.y());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ContentViewCoreImpl::SetTitle(const base::string16& title) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jtitle =
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ConvertUTF8ToJavaString(env, base::UTF16ToUTF8(title));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_setTitle(env, obj.obj(), jtitle.obj());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::OnBackgroundColorChanged(SkColor color) {
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetBackgroundColor(color);
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_onBackgroundColorChanged(env, obj.obj(), color);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentViewCoreImpl::ShowSelectPopupMenu(
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RenderFrameHost* frame,
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Rect& bounds,
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<MenuItem>& items,
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int selected_item,
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool multiple) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> bounds_rect(CreateJavaRect(env, bounds));
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For multi-select list popups we find the list of previous selections by
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // iterating through the items. But for single selection popups we take the
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given |selected_item| as is.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jintArray> selected_array;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (multiple) {
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<jint[]> native_selected_array(new jint[items.size()]);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t selected_count = 0;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < items.size(); ++i) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (items[i].checked)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        native_selected_array[selected_count++] = i;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    selected_array = ScopedJavaLocalRef<jintArray>(
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        env, env->NewIntArray(selected_count));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(selected_array.obj(), 0, selected_count,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           native_selected_array.get());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    selected_array = ScopedJavaLocalRef<jintArray>(env, env->NewIntArray(1));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint value = selected_item;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(selected_array.obj(), 0, 1, &value);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jintArray> enabled_array(env,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              env->NewIntArray(items.size()));
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> labels;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  labels.reserve(items.size());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < items.size(); ++i) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    labels.push_back(items[i].label);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint enabled =
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        (items[i].type == MenuItem::GROUP ? POPUP_ITEM_TYPE_GROUP :
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (items[i].enabled ? POPUP_ITEM_TYPE_ENABLED :
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                POPUP_ITEM_TYPE_DISABLED));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(enabled_array.obj(), i, 1, &enabled);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> items_array(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::android::ToJavaArrayOfStrings(env, labels));
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Java_ContentViewCore_showSelectPopup(env,
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       j_obj.obj(),
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       reinterpret_cast<intptr_t>(frame),
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       bounds_rect.obj(),
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       items_array.obj(),
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       enabled_array.obj(),
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       multiple,
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       selected_array.obj());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ContentViewCoreImpl::HideSelectPopupMenu() {
476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  JNIEnv* env = AttachCurrentThread();
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!j_obj.is_null())
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Java_ContentViewCore_hideSelectPopup(env, j_obj.obj());
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::OnGestureEventAck(const blink::WebGestureEvent& event,
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            InputEventAckState ack_result) {
484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (j_obj.is_null())
487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
4880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (event.type) {
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureFlingStart:
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED) {
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // The view expects the fling velocity in pixels/s.
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Java_ContentViewCore_onFlingStartEventConsumed(env, j_obj.obj(),
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            event.data.flingStart.velocityX * dpi_scale(),
495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            event.data.flingStart.velocityY * dpi_scale());
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      } else {
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // If a scroll ends with a fling, a SCROLL_END event is never sent.
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // However, if that fling went unconsumed, we still need to let the
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // listeners know that scrolling has ended.
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Java_ContentViewCore_onScrollEndEventAck(env, j_obj.obj());
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) {
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // The view expects the fling velocity in pixels/s.
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Java_ContentViewCore_onFlingStartEventHadNoConsumer(env, j_obj.obj(),
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            event.data.flingStart.velocityX * dpi_scale(),
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            event.data.flingStart.velocityY * dpi_scale());
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureFlingCancel:
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentViewCore_onFlingCancelEventAck(env, j_obj.obj());
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollBegin:
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentViewCore_onScrollBeginEventAck(env, j_obj.obj());
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollUpdate:
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Java_ContentViewCore_onScrollUpdateGestureConsumed(env, j_obj.obj());
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GestureScrollEnd:
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentViewCore_onScrollEndEventAck(env, j_obj.obj());
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GesturePinchBegin:
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentViewCore_onPinchBeginEventAck(env, j_obj.obj());
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WebInputEvent::GesturePinchEnd:
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentViewCore_onPinchEndEventAck(env, j_obj.obj());
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case WebInputEvent::GestureTap:
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Java_ContentViewCore_onSingleTapEventAck(
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          env,
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          j_obj.obj(),
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ack_result == INPUT_EVENT_ACK_STATE_CONSUMED,
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          event.x * dpi_scale(),
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          event.y * dpi_scale());
5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ContentViewCoreImpl::FilterInputEvent(const blink::WebInputEvent& event) {
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event.type != WebInputEvent::GestureTap &&
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event.type != WebInputEvent::GestureDoubleTap &&
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event.type != WebInputEvent::GestureLongTap &&
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event.type != WebInputEvent::GestureLongPress)
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const blink::WebGestureEvent& gesture =
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<const blink::WebGestureEvent&>(event);
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int gesture_type = ToGestureEventType(event.type);
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return Java_ContentViewCore_filterTapOrPressEvent(env,
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    j_obj.obj(),
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    gesture_type,
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                    gesture.x * dpi_scale(),
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                    gesture.y * dpi_scale());
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(jdduke): Also report double-tap UMA, crbug/347568.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentViewCoreImpl::HasFocus() {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Java_ContentViewCore_hasFocus(env, obj.obj());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnSelectionChanged(const std::string& text) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jtext = ConvertUTF8ToJavaString(env, text);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_onSelectionChanged(env, obj.obj(), jtext.obj());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ContentViewCoreImpl::OnSelectionEvent(SelectionEventType event,
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                           const gfx::PointF& position) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (j_obj.is_null())
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Java_ContentViewCore_onSelectionEvent(
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      env, j_obj.obj(), event, position.x(), position.y());
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<TouchHandleDrawable>
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ContentViewCoreImpl::CreatePopupTouchHandleDrawable() {
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (obj.is_null()) {
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED();
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return scoped_ptr<TouchHandleDrawable>();
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return scoped_ptr<TouchHandleDrawable>(new PopupTouchHandleDrawable(
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Java_ContentViewCore_createPopupTouchHandleDrawable(env, obj.obj()),
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dpi_scale_));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ShowPastePopup(int x_dip, int y_dip) {
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!view)
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  view->OnShowingPastePopup(gfx::PointF(x_dip, y_dip));
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Java_ContentViewCore_showPastePopupWithFeedback(env, obj.obj(),
61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                  static_cast<jint>(x_dip),
61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                  static_cast<jint>(y_dip));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::GetScaledContentBitmap(
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale,
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SkColorType color_type,
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect src_subrect,
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Callback<void(bool, const SkBitmap&)>& result_callback) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!view) {
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result_callback.Run(false, SkBitmap());
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view->GetScaledContentBitmap(scale, color_type, src_subrect,
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      result_callback);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::StartContentIntent(const GURL& content_url) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jcontent_url =
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, content_url.spec());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_startContentIntent(env,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          j_obj.obj(),
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          jcontent_url.obj());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ShowDisambiguationPopup(
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Rect& rect_pixels,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap& zoomed_bitmap) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> rect_object(CreateJavaRect(env, rect_pixels));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> java_bitmap =
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::ConvertToJavaBitmap(&zoomed_bitmap);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!java_bitmap.is_null());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_showDisambiguationPopup(env,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               obj.obj(),
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               rect_object.obj(),
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               java_bitmap.obj());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::CreateTouchEventSynthesizer() {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
675b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Java_ContentViewCore_createTouchEventSynthesizer(env, obj.obj());
67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetContentVideoViewClient() {
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (obj.is_null())
684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Java_ContentViewCore_getContentVideoViewClient(env, obj.obj());
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetContext() {
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (obj.is_null())
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Java_ContentViewCore_getContext(env, obj.obj());
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ContentViewCoreImpl::ShouldBlockMediaRequest(const GURL& url) {
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (obj.is_null())
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return true;
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Java_ContentViewCore_shouldBlockMediaRequest(env, obj.obj(),
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      j_url.obj());
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::DidStopFlinging() {
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!obj.is_null())
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_ContentViewCore_onNativeFlingStopped(env, obj.obj());
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochgfx::Size ContentViewCoreImpl::GetViewSize() const {
7190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Size size = GetViewportSizeDip();
72003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  size.Enlarge(0, -GetTopControlsLayoutHeightDip());
7210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return size;
7220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
7230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetPhysicalBackingSize() const {
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (j_obj.is_null())
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingWidthPix(env, j_obj.obj()),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingHeightPix(env, j_obj.obj()));
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizePix() const {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (j_obj.is_null())
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return gfx::Size(
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportWidthPix(env, j_obj.obj()),
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportHeightPix(env, j_obj.obj()));
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)int ContentViewCoreImpl::GetTopControlsLayoutHeightPix() const {
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (j_obj.is_null())
74803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return 0;
74903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return Java_ContentViewCore_getTopControlsLayoutHeightPix(env, j_obj.obj());
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizeDip() const {
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::ToCeiledSize(
754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::ScaleSize(GetViewportSizePix(), 1.0f / dpi_scale()));
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)float ContentViewCoreImpl::GetTopControlsLayoutHeightDip() const {
75803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return GetTopControlsLayoutHeightPix() / dpi_scale();
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::AttachLayer(scoped_refptr<cc::Layer> layer) {
7625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  root_layer_->InsertChild(layer, 0);
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetIsDrawable(false);
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::RemoveLayer(scoped_refptr<cc::Layer> layer) {
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->RemoveFromParent();
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!root_layer_->children().size())
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    root_layer_->SetIsDrawable(true);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ContentViewCoreImpl::SelectBetweenCoordinates(const gfx::PointF& start,
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                   const gfx::PointF& end) {
7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!web_contents_)
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Point start_point = gfx::Point(start.x(), start.y());
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Point end_point = gfx::Point(end.x(), end.y());
7805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (start_point == end_point)
7815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  web_contents_->SelectRange(start_point, end_point);
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ui::ViewAndroid* ContentViewCoreImpl::GetViewAndroid() const {
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return view_android_;
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::WindowAndroid* ContentViewCoreImpl::GetWindowAndroid() const {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_android_;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<cc::Layer> ContentViewCoreImpl::GetLayer() const {
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return root_layer_.get();
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Methods called from Java via JNI
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ContentViewCoreImpl::SelectPopupMenuItems(JNIEnv* env,
8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                               jobject obj,
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               jlong selectPopupSourceFrame,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               jintArray indices) {
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RenderFrameHostImpl* rfhi =
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reinterpret_cast<RenderFrameHostImpl*>(selectPopupSourceFrame);
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(rfhi);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (indices == NULL) {
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    rfhi->DidCancelPopupMenu();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int selected_count = env->GetArrayLength(indices);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> selected_indices;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint* indices_ptr = env->GetIntArrayElements(indices, NULL);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < selected_count; ++i)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_indices.push_back(indices_ptr[i]);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->ReleaseIntArrayElements(indices, indices_ptr, JNI_ABORT);
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rfhi->DidSelectPopupMenuItems(selected_indices);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* ContentViewCoreImpl::GetWebContents() const {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_contents_;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SetFocus(JNIEnv* env, jobject obj, jboolean focused) {
828d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetFocusInternal(focused);
829d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
830d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
831d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ContentViewCoreImpl::SetFocusInternal(bool focused) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderWidgetHostViewAndroid())
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focused)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderWidgetHostViewAndroid()->Focus();
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderWidgetHostViewAndroid()->Blur();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SendOrientationChangeEvent(JNIEnv* env,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     jobject obj,
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     jint orientation) {
8444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (device_orientation_ != orientation) {
8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    device_orientation_ = orientation;
8464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SendOrientationChangeEventInternal();
8474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)jboolean ContentViewCoreImpl::OnTouchEvent(JNIEnv* env,
851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jobject obj,
852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jobject motion_event,
853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jlong time_ms,
854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint android_action,
855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint pointer_count,
856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint history_size,
857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint action_index,
858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jfloat pos_x_0,
859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jfloat pos_y_0,
860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jfloat pos_x_1,
861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jfloat pos_y_1,
862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint pointer_id_0,
863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jint pointer_id_1,
864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           jfloat touch_major_0,
865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           jfloat touch_major_1,
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jfloat touch_minor_0,
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jfloat touch_minor_1,
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jfloat orientation_0,
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jfloat orientation_1,
870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           jfloat raw_pos_x,
871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           jfloat raw_pos_y,
872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           jint android_tool_type_0,
873116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           jint android_tool_type_1,
8745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                           jint android_button_state,
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jint android_meta_state,
8765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                           jboolean is_touch_handle_event) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
878effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Avoid synthesizing a touch event if it cannot be forwarded.
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!rwhv)
880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
882a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MotionEventAndroid event(1.f / dpi_scale(),
883a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                           env,
884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           motion_event,
885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           time_ms,
886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           android_action,
887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pointer_count,
888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           history_size,
889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           action_index,
890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pos_x_0,
891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pos_y_0,
892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pos_x_1,
893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pos_y_1,
894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pointer_id_0,
895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pointer_id_1,
896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           touch_major_0,
897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           touch_major_1,
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           touch_minor_0,
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           touch_minor_1,
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           orientation_0,
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           orientation_1,
902f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           raw_pos_x,
903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           raw_pos_y,
904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           android_tool_type_0,
905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           android_tool_type_1,
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           android_button_state,
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           android_meta_state);
908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return is_touch_handle_event ? rwhv->OnTouchHandleEvent(event)
9105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               : rwhv->OnTouchEvent(event);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float ContentViewCoreImpl::GetDpiScale() const {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dpi_scale_;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::SendMouseMoveEvent(JNIEnv* env,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 jobject obj,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 jlong time_ms,
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 jfloat x,
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 jfloat y) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhv)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent event = WebMouseEventBuilder::Build(
927bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      WebInputEvent::MouseMove,
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMouseEvent::ButtonNone,
929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      time_ms / 1000.0, x / dpi_scale(), y / dpi_scale(), 0, 1);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rwhv->SendMouseEvent(event);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::SendMouseWheelEvent(JNIEnv* env,
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jobject obj,
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jlong time_ms,
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  jfloat x,
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  jfloat y,
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jfloat vertical_axis) {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhv)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebMouseWheelEventBuilder::Direction direction;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (vertical_axis > 0) {
947bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    direction = WebMouseWheelEventBuilder::DIRECTION_UP;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (vertical_axis < 0) {
949bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    direction = WebMouseWheelEventBuilder::DIRECTION_DOWN;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent event = WebMouseWheelEventBuilder::Build(
954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      direction, time_ms / 1000.0, x / dpi_scale(), y / dpi_scale());
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rwhv->SendMouseWheelEvent(event);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGestureEvent ContentViewCoreImpl::MakeGestureEvent(
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebInputEvent::Type type, int64 time_ms, float x, float y) const {
962bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return WebGestureEventBuilder::Build(
963a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      type, time_ms / 1000.0, x / dpi_scale(), y / dpi_scale());
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::SendGestureEvent(
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebGestureEvent& event) {
968a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
969a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (rwhv)
970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    rwhv->SendGestureEvent(event);
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::ScrollBegin(JNIEnv* env,
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jobject obj,
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jlong time_ms,
9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jfloat x,
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jfloat y,
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jfloat hintx,
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      jfloat hinty) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollBegin, time_ms, x, y);
982a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.scrollBegin.deltaXHint = hintx / dpi_scale();
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.scrollBegin.deltaYHint = hinty / dpi_scale();
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollEnd(JNIEnv* env, jobject obj, jlong time_ms) {
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollEnd, time_ms, 0, 0);
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollBy(JNIEnv* env, jobject obj, jlong time_ms,
99558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   jfloat x, jfloat y, jfloat dx, jfloat dy) {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
997868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollUpdate, time_ms, x, y);
998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.scrollUpdate.deltaX = -dx / dpi_scale();
999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.scrollUpdate.deltaY = -dy / dpi_scale();
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::FlingStart(JNIEnv* env, jobject obj, jlong time_ms,
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     jfloat x, jfloat y, jfloat vx, jfloat vy) {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1007868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureFlingStart, time_ms, x, y);
1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.flingStart.velocityX = vx / dpi_scale();
1009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.flingStart.velocityY = vy / dpi_scale();
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::FlingCancel(JNIEnv* env, jobject obj, jlong time_ms) {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureFlingCancel, time_ms, 0, 0);
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SingleTap(JNIEnv* env, jobject obj, jlong time_ms,
1021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    jfloat x, jfloat y) {
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureTap, time_ms, x, y);
1024b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  event.data.tap.tapCount = 1;
1025b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
10261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SendGestureEvent(event);
10271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
10281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::DoubleTap(JNIEnv* env, jobject obj, jlong time_ms,
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureDoubleTap, time_ms, x, y);
1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Set the tap count to 1 even for DoubleTap, in order to be consistent with
1034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // double tap behavior on a mobile viewport. See crbug.com/234986 for context.
1035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event.data.tap.tapCount = 1;
1036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::LongPress(JNIEnv* env, jobject obj, jlong time_ms,
1041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    jfloat x, jfloat y) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureLongPress, time_ms, x, y);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchBegin(JNIEnv* env, jobject obj, jlong time_ms,
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     jfloat x, jfloat y) {
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchBegin, time_ms, x, y);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchEnd(JNIEnv* env, jobject obj, jlong time_ms) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchEnd, time_ms, 0, 0);
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchBy(JNIEnv* env, jobject obj, jlong time_ms,
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jfloat anchor_x, jfloat anchor_y,
106358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  jfloat delta) {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchUpdate, time_ms, anchor_x, anchor_y);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.data.pinchUpdate.scale = delta;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SelectBetweenCoordinates(JNIEnv* env, jobject obj,
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   jfloat x1, jfloat y1,
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   jfloat x2, jfloat y2) {
10745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SelectBetweenCoordinates(gfx::PointF(x1 / dpi_scale(), y1 / dpi_scale()),
10755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           gfx::PointF(x2 / dpi_scale(), y2 / dpi_scale()));
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::MoveCaret(JNIEnv* env, jobject obj,
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y) {
1080d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
1081d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  if (rwhv)
1082d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch    rwhv->MoveCaret(gfx::Point(x / dpi_scale_, y / dpi_scale_));
1083d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch}
1084d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch
1085d9512fb2dc45a909a2812842735be59e78b5171dBen Murdochvoid ContentViewCoreImpl::DismissTextHandles(JNIEnv* env, jobject obj) {
1086d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
1087d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  if (rwhv)
1088d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch    rwhv->DismissTextHandles();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1091d9512fb2dc45a909a2812842735be59e78b5171dBen Murdochvoid ContentViewCoreImpl::SetTextHandlesTemporarilyHidden(JNIEnv* env,
1092d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch                                                          jobject obj,
1093d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch                                                          jboolean hidden) {
1094d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
1095d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch  if (rwhv)
1096d9512fb2dc45a909a2812842735be59e78b5171dBen Murdoch    rwhv->SetTextHandlesTemporarilyHidden(hidden);
10975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
10985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ContentViewCoreImpl::ResetGestureDetection(JNIEnv* env, jobject obj) {
11000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
11010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (rwhv)
11020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    rwhv->ResetGestureDetection();
1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ContentViewCoreImpl::SetDoubleTapSupportEnabled(JNIEnv* env,
1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     jobject obj,
1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     jboolean enabled) {
11080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
11090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (rwhv)
11100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    rwhv->SetDoubleTapSupportEnabled(enabled);
1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ContentViewCoreImpl::SetMultiTouchZoomSupportEnabled(JNIEnv* env,
1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                          jobject obj,
1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                          jboolean enabled) {
11160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
11170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (rwhv)
11180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    rwhv->SetMultiTouchZoomSupportEnabled(enabled);
1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ContentViewCoreImpl::SetAllowJavascriptInterfacesInspection(
1122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    JNIEnv* env,
1123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    jobject obj,
1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    jboolean allow) {
1125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  java_bridge_dispatcher_host_->SetAllowObjectContentsInspection(allow);
1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::AddJavascriptInterface(
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject /* obj */,
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject object,
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring name,
1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jclass safe_annotation_clazz) {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_object(env, object);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jclass> scoped_clazz(env, safe_annotation_clazz);
1136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  java_bridge_dispatcher_host_->AddNamedObject(
1137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ConvertJavaStringToUTF8(env, name), scoped_object, scoped_clazz);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::RemoveJavascriptInterface(JNIEnv* env,
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    jobject /* obj */,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    jstring name) {
1143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  java_bridge_dispatcher_host_->RemoveNamedObject(
1144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ConvertJavaStringToUTF8(env, name));
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::WasResized(JNIEnv* env, jobject obj) {
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size physical_size(
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingWidthPix(env, obj),
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingHeightPix(env, obj));
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  root_layer_->SetBounds(physical_size);
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
11545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (view) {
11555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
11565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        view->GetRenderWidgetHost());
11575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    host->SendScreenRects();
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->WasResized();
11595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochlong ContentViewCoreImpl::GetNativeImeAdapter(JNIEnv* env, jobject obj) {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhva)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rwhva->GetNativeImeAdapter();
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(sgurun) add support for posting a frame whose name is known (only
11705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//               main frame is supported at this time, see crbug.com/389721)
11715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(sgurun) add support for passing message ports
11725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ContentViewCoreImpl::PostMessageToFrame(JNIEnv* env, jobject obj,
11735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    jstring frame_name, jstring message, jstring source_origin,
11745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    jstring target_origin) {
11755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
11765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
11775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!host)
11785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return;
11795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ViewMsg_PostMessage_Params params;
11805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.source_origin = ConvertJavaStringToUTF16(env, source_origin);
11815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.target_origin = ConvertJavaStringToUTF16(env, target_origin);
11825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.data = ConvertJavaStringToUTF16(env, message);
11835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.is_data_raw_string = true;
11845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.source_routing_id = MSG_ROUTING_NONE;
11855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  host->Send(new ViewMsg_PostMessageEvent(host->GetRoutingID(), params));
11865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
11875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ContentViewCoreImpl::UpdateImeAdapter(long native_ime_adapter,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int text_input_type,
11906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           int text_input_flags,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& text,
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int selection_start,
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int selection_end,
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int composition_start,
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int composition_end,
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                           bool show_ime_if_needed,
1197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                           bool is_non_ime_change) {
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_text = ConvertUTF8ToJavaString(env, text);
12046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Java_ContentViewCore_updateImeAdapter(env,
12056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        obj.obj(),
12066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        native_ime_adapter,
12076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        text_input_type,
12086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        text_input_flags,
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        jstring_text.obj(),
12106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        selection_start,
12116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        selection_end,
12126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        composition_start,
12136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        composition_end,
12146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        show_ime_if_needed,
12156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        is_non_ime_change);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentViewCoreImpl::SetAccessibilityEnabled(JNIEnv* env, jobject obj,
1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                  bool enabled) {
1220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetAccessibilityEnabledInternal(enabled);
1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1223116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ContentViewCoreImpl::IsFullscreenRequiredForOrientationLock() const {
1224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  JNIEnv* env = AttachCurrentThread();
1225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
1226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (obj.is_null())
1227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
1228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Java_ContentViewCore_isFullscreenRequiredForOrientationLock(env,
1229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                                     obj.obj());
1230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ContentViewCoreImpl::SetAccessibilityEnabledInternal(bool enabled) {
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  accessibility_enabled_ = enabled;
1234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserAccessibilityStateImpl* accessibility_state =
1235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      BrowserAccessibilityStateImpl::GetInstance();
1236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (enabled) {
12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // This enables accessibility globally unless it was explicitly disallowed
12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // by a command-line flag.
12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    accessibility_state->OnScreenReaderDetected();
12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // If it was actually enabled globally, enable it for this RenderWidget now.
1241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (accessibility_state->IsAccessibleBrowser() && web_contents_)
1242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents_->AddAccessibilityMode(AccessibilityModeComplete);
1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    accessibility_state->ResetAccessibilityMode();
1245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (web_contents_) {
1246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents_->SetAccessibilityMode(
1247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          accessibility_state->accessibility_mode());
1248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
1249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
12524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ContentViewCoreImpl::SendOrientationChangeEventInternal() {
12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (rwhv)
1255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    rwhv->UpdateScreenInfo(GetViewAndroid());
12565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static_cast<WebContentsImpl*>(web_contents())->
12585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      screen_orientation_dispatcher_host()->OnOrientationChange();
12594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
12604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::ExtractSmartClipData(JNIEnv* env,
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               jobject obj,
12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               jint x,
12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               jint y,
12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               jint width,
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               jint height) {
12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect rect(
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>(x / dpi_scale()),
1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>(y / dpi_scale()),
1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>((width > 0 && width < dpi_scale()) ?
1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          1 : (int)(width / dpi_scale())),
1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>((height > 0 && height < dpi_scale()) ?
1273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          1 : (int)(height / dpi_scale())));
12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetWebContents()->Send(new ViewMsg_ExtractSmartClipData(
12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetWebContents()->GetRoutingID(), rect));
12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochjint ContentViewCoreImpl::GetCurrentRenderProcessId(JNIEnv* env, jobject obj) {
1279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return GetRenderProcessIdFromRenderViewHost(
1280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      web_contents_->GetRenderViewHost());
1281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
128346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ContentViewCoreImpl::SetBackgroundOpaque(JNIEnv* env, jobject jobj,
128446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    jboolean opaque) {
128546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (GetRenderWidgetHostViewAndroid())
128646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GetRenderWidgetHostViewAndroid()->SetBackgroundOpaque(opaque);
128746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
128846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ContentViewCoreImpl::RequestTextSurroundingSelection(
12906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int max_length,
12916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const base::Callback<
12926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        void(const base::string16& content, int start_offset, int end_offset)>&
12936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        callback) {
12946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(!callback.is_null());
12956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RenderFrameHost* focused_frame = web_contents_->GetFocusedFrame();
12966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!focused_frame)
12976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return;
12986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (GetRenderWidgetHostViewAndroid()) {
12996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    GetRenderWidgetHostViewAndroid()->SetTextSurroundingSelectionCallback(
13006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        callback);
13016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    focused_frame->Send(new FrameMsg_TextSurroundingSelectionRequest(
13026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        focused_frame->GetRoutingID(), max_length));
13036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
13046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
13056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewCoreImpl::OnSmartClipDataExtracted(
1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16& text,
1308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16& html,
1309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const gfx::Rect& clip_rect) {
13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (obj.is_null())
13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedJavaLocalRef<jstring> jtext = ConvertUTF16ToJavaString(env, text);
1315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedJavaLocalRef<jstring> jhtml = ConvertUTF16ToJavaString(env, html);
1316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedJavaLocalRef<jobject> clip_rect_object(CreateJavaRect(env, clip_rect));
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Java_ContentViewCore_onSmartClipDataExtracted(
1318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      env, obj.obj(), jtext.obj(), jhtml.obj(), clip_rect_object.obj());
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ContentViewCoreImpl::WebContentsDestroyed() {
1322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  WebContentsViewAndroid* wcva = static_cast<WebContentsViewAndroid*>(
1323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<WebContentsImpl*>(web_contents())->GetView());
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(wcva);
13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wcva->SetContentViewCore(NULL);
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is called for each ContentView.
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)jlong Init(JNIEnv* env,
13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           jobject obj,
1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jlong native_web_contents,
1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jlong view_android,
1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           jlong window_android,
1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           jobject retained_objects_set) {
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* view = new ContentViewCoreImpl(
13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env, obj,
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<WebContents*>(native_web_contents),
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<ui::ViewAndroid*>(view_android),
1339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      reinterpret_cast<ui::WindowAndroid*>(window_android),
1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      retained_objects_set);
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(view);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterContentViewCore(JNIEnv* env) {
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1349