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/json/json_writer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/metrics/histogram.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/interstitial_page_delegate_android.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/load_url_params.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/touch_point.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h"
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_controller_impl.h"
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h"
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/compositor_impl_android.h"
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_builders_android.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/java/java_bound_object.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_android.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/ssl/ssl_host_state.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_view_android.h"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_accessibility_state.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/menu_item.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentViewCore_jni.h"
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h"
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/view_android.h"
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/android/java_bitmap.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_f.h"
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/user_agent/user_agent_util.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaGlobalRef;
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)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const unsigned int kDefaultVSyncIntervalMicros = 16666u;
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(brianderson): Use adaptive draw-time estimation.
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const float kDefaultBrowserCompositeVSyncFraction = 1.0f / 3;
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* kContentViewUserDataKey = &kContentViewUserDataKey;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetRenderProcessIdFromRenderViewHost(RenderViewHost* host) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(host);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* render_process = host->GetProcess();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(render_process);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_process->HasConnection())
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return render_process->GetHandle();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedJavaLocalRef<jobject> CreateJavaRect(
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& rect) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ScopedJavaLocalRef<jobject>(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_createRect(env,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.x()),
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.y()),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.right()),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<int>(rect.bottom())));
110d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
111d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enables a callback when the underlying WebContents is destroyed, to enable
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nulling the back-pointer.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentViewCoreImpl::ContentViewUserData
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::SupportsUserData::Data {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ContentViewUserData(ContentViewCoreImpl* content_view_core)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : content_view_core_(content_view_core) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentViewUserData() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(joth): When chrome has finished removing the TabContents class (see
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // crbug.com/107201) consider inverting relationship, so ContentViewCore
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // would own WebContents. That effectively implies making the WebContents
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // destructor private on Android.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete content_view_core_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* get() const { return content_view_core_; }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not using scoped_ptr as ContentViewCoreImpl destructor is private.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* content_view_core_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(ContentViewUserData);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCoreImpl* ContentViewCoreImpl::FromWebContents(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl::ContentViewUserData* data =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<ContentViewCoreImpl::ContentViewUserData*>(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents->GetUserData(kContentViewUserDataKey));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data ? data->get() : NULL;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCore* ContentViewCore::FromWebContents(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ContentViewCoreImpl::FromWebContents(web_contents);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCore* ContentViewCore::GetNativeContentViewCore(JNIEnv* env,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           jobject obj) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<ContentViewCore*>(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getNativeContentViewCore(env, obj));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool hardware_accelerated,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         WebContents* web_contents,
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         ui::ViewAndroid* view_android,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ui::WindowAndroid* window_android)
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : WebContentsObserver(web_contents),
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      java_ref_(env, obj),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_(static_cast<WebContentsImpl*>(web_contents)),
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_layer_(cc::Layer::Create()),
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      vsync_interval_(base::TimeDelta::FromMicroseconds(
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          kDefaultVSyncIntervalMicros)),
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_browser_composite_time_(base::TimeDelta::FromMicroseconds(
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          kDefaultVSyncIntervalMicros * kDefaultBrowserCompositeVSyncFraction)),
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      view_android_(view_android),
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      window_android_(window_android),
177d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      device_orientation_(0),
178d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      geolocation_needs_pause_(false) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(web_contents) <<
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "A ContentViewCoreImpl should be created with a valid WebContents.";
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(leandrogracia): make use of the hardware_accelerated argument.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Display& display =
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dpi_scale_ = display.device_scale_factor();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, the only use case we have for overriding a user agent involves
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // spoofing a desktop Linux user agent for "Request desktop site".
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Automatically set it for all WebContents so that it is available when a
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationEntry requires the user agent to be overridden.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kLinuxInfoStr[] = "X11; Linux x86_64";
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string product = content::GetContentClient()->GetProduct();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string spoofed_ua =
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webkit_glue::BuildUserAgentFromOSAndProduct(kLinuxInfoStr, product);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetUserAgentOverride(spoofed_ua);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitWebContents();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentViewCoreImpl::~ContentViewCoreImpl() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  java_ref_.reset();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!j_obj.is_null()) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Java_ContentViewCore_onNativeContentViewCoreDestroyed(
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        env, j_obj.obj(), reinterpret_cast<intptr_t>(this));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure nobody calls back into this object while we are tearing things
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // down.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.RemoveAll();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject>
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ContentViewCoreImpl::GetWebContentsAndroid(JNIEnv* env, jobject obj) {
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return web_contents_->GetJavaWebContents();
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnJavaContentViewCoreDestroyed(JNIEnv* env,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         jobject obj) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(env->IsSameObject(java_ref_.get(env).obj(), obj));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  java_ref_.reset();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::InitWebContents() {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(web_contents_);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  notification_registrar_.Add(
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, NOTIFICATION_RENDER_VIEW_HOST_CHANGED,
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Source<WebContents>(web_contents_));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  notification_registrar_.Add(
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, NOTIFICATION_RENDERER_PROCESS_CREATED,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllBrowserContextsAndSources());
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  notification_registrar_.Add(
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, NOTIFICATION_WEB_CONTENTS_CONNECTED,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Source<WebContents>(web_contents_));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<WebContentsViewAndroid*>(web_contents_->GetView())->
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetContentViewCore(this);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!web_contents_->GetUserData(kContentViewUserDataKey));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->SetUserData(kContentViewUserDataKey,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             new ContentViewUserData(this));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::Observe(int type,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const NotificationSource& source,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const NotificationDetails& details) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NOTIFICATION_RENDER_VIEW_HOST_CHANGED: {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::pair<RenderViewHost*, RenderViewHost*>* switched_details =
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Details<std::pair<RenderViewHost*, RenderViewHost*> >(details).ptr();
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int old_pid = 0;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (switched_details->first) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        old_pid = GetRenderProcessIdFromRenderViewHost(
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            switched_details->first);
25533bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch
25633bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch        RenderWidgetHostViewAndroid* view =
25733bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch            static_cast<RenderWidgetHostViewAndroid*>(
25833bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch                switched_details->first->GetView());
25933bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch        if (view)
26033bff6d6e5e82ca5f2abf842074e33f4944cc250Ben Murdoch          view->SetContentViewCore(NULL);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int new_pid = GetRenderProcessIdFromRenderViewHost(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          web_contents_->GetRenderViewHost());
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (new_pid != old_pid) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Notify the Java side of the change of the current renderer process.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        JNIEnv* env = AttachCurrentThread();
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!obj.is_null()) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Java_ContentViewCore_onRenderProcessSwap(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              env, obj.obj(), old_pid, new_pid);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      SetFocusInternal(HasFocus());
274d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      if (geolocation_needs_pause_)
275d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        PauseOrResumeGeolocation(true);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NOTIFICATION_RENDERER_PROCESS_CREATED: {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Notify the Java side of the current renderer process.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderProcessHost* source_process_host =
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Source<RenderProcessHost>(source).ptr();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderProcessHost* current_process_host =
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          web_contents_->GetRenderViewHost()->GetProcess();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (source_process_host == current_process_host) {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int pid = GetRenderProcessIdFromRenderViewHost(
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            web_contents_->GetRenderViewHost());
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        JNIEnv* env = AttachCurrentThread();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!obj.is_null()) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Java_ContentViewCore_onRenderProcessSwap(env, obj.obj(), 0, pid);
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NOTIFICATION_WEB_CONTENTS_CONNECTED: {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      JNIEnv* env = AttachCurrentThread();
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!obj.is_null()) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Java_ContentViewCore_onWebContentsConnected(env, obj.obj());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ContentViewCoreImpl::RenderViewReady() {
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (device_orientation_ != 0)
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SendOrientationChangeEventInternal();
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostViewAndroid*
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentViewCoreImpl::GetRenderWidgetHostViewAndroid() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv = NULL;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv = web_contents_->GetRenderWidgetHostView();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (web_contents_->ShowingInterstitialPage()) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rwhv = static_cast<InterstitialPageImpl*>(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_->GetInterstitialPage())->
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetRenderViewHost()->GetView();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<RenderWidgetHostViewAndroid*>(rwhv);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetJavaObject() {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return java_ref_.get(env);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jint ContentViewCoreImpl::GetBackgroundColor(JNIEnv* env, jobject obj) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhva)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SK_ColorWHITE;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rwhva->GetCachedBackgroundColor();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnHide(JNIEnv* env, jobject obj) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Hide();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnShow(JNIEnv* env, jobject obj) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Show();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::Show() {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWebContents()->WasShown();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::Hide() {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWebContents()->WasHidden();
35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  PauseVideo();
35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewCoreImpl::PauseVideo() {
35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (host)
35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host->Send(new ViewMsg_PauseVideo(host->GetRoutingID()));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)void ContentViewCoreImpl::PauseOrResumeGeolocation(bool should_pause) {
362d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  geolocation_needs_pause_ = should_pause;
363d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  RenderViewHostImpl* rvh =
364d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(web_contents_->GetRenderViewHost());
365d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  if (rvh) {
366d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    scoped_refptr<GeolocationDispatcherHost> geolocation_dispatcher =
367d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        static_cast<RenderProcessHostImpl*>(
368d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)            web_contents_->GetRenderProcessHost())->
369d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)            geolocation_dispatcher_host();
370d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    if (geolocation_dispatcher.get()) {
371d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
372d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          base::Bind(&GeolocationDispatcherHost::PauseOrResume,
373d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          geolocation_dispatcher,
374d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          rvh->GetRoutingID(),
375d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          should_pause));
376d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      geolocation_needs_pause_ = false;
377d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    }
378d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  }
379d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
380d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnTabCrashed() {
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.is_null())
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Java_ContentViewCore_resetVSyncNotification(env, obj.obj());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// All positions and sizes are in CSS pixels.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note that viewport_width/height is a best effort based.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ContentViewCore has the actual information about the physical viewport size.
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::UpdateFrameInfo(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& scroll_offset,
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& page_scale_factor_limits,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::SizeF& content_size,
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::SizeF& viewport_size,
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2dF& controls_offset,
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Vector2dF& content_offset,
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float overdraw_bottom_height) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (window_android_) {
4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Vector2dF window_offset(
4088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Java_ContentViewCore_getLocationInWindowX(env, obj.obj()),
4098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Java_ContentViewCore_getLocationInWindowY(env, obj.obj()));
4108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    window_android_->set_content_offset(
4118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::ScaleVector2d(content_offset, dpi_scale_) + window_offset);
4128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_updateFrameInfo(
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(),
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_offset.x(),
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_offset.y(),
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor,
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor_limits.x(),
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor_limits.y(),
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_size.width(),
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_size.height(),
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      viewport_size.width(),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      viewport_size.height(),
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controls_offset.y(),
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content_offset.y(),
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      overdraw_bottom_height);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ContentViewCoreImpl::SetTitle(const base::string16& title) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jtitle =
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, UTF16ToUTF8(title));
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_setTitle(env, obj.obj(), jtitle.obj());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::OnBackgroundColorChanged(SkColor color) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_onBackgroundColorChanged(env, obj.obj(), color);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ShowSelectPopupMenu(
4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::vector<MenuItem>& items, int selected_item, bool multiple) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For multi-select list popups we find the list of previous selections by
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // iterating through the items. But for single selection popups we take the
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given |selected_item| as is.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jintArray> selected_array;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (multiple) {
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<jint[]> native_selected_array(new jint[items.size()]);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t selected_count = 0;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < items.size(); ++i) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (items[i].checked)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        native_selected_array[selected_count++] = i;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    selected_array = ScopedJavaLocalRef<jintArray>(
4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        env, env->NewIntArray(selected_count));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(selected_array.obj(), 0, selected_count,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           native_selected_array.get());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    selected_array = ScopedJavaLocalRef<jintArray>(env, env->NewIntArray(1));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint value = selected_item;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(selected_array.obj(), 0, 1, &value);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jintArray> enabled_array(env,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              env->NewIntArray(items.size()));
479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> labels;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  labels.reserve(items.size());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < items.size(); ++i) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    labels.push_back(items[i].label);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint enabled =
4847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        (items[i].type == MenuItem::GROUP ? POPUP_ITEM_TYPE_GROUP :
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (items[i].enabled ? POPUP_ITEM_TYPE_ENABLED :
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                POPUP_ITEM_TYPE_DISABLED));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env->SetIntArrayRegion(enabled_array.obj(), i, 1, &enabled);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> items_array(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::android::ToJavaArrayOfStrings(env, labels));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_showSelectPopup(env, j_obj.obj(),
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       items_array.obj(), enabled_array.obj(),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       multiple, selected_array.obj());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ConfirmTouchEvent(InputEventAckState ack_result) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_confirmTouchEvent(env, j_obj.obj(),
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         static_cast<jint>(ack_result));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContentViewCoreImpl::UnhandledFlingStartEvent() {
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (j_obj.is_null())
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Java_ContentViewCore_unhandledFlingStartEvent(env, j_obj.obj());
5110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
5120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void ContentViewCoreImpl::OnScrollUpdateGestureConsumed() {
5140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
5160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (j_obj.is_null())
5170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
5180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  Java_ContentViewCore_onScrollUpdateGestureConsumed(env, j_obj.obj());
519a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::HasTouchEventHandlers(bool need_touch_events) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_hasTouchEventHandlers(env,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             j_obj.obj(),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             need_touch_events);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentViewCoreImpl::HasFocus() {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Java_ContentViewCore_hasFocus(env, obj.obj());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnSelectionChanged(const std::string& text) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jtext = ConvertUTF8ToJavaString(env, text);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_onSelectionChanged(env, obj.obj(), jtext.obj());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::OnSelectionBoundsChanged(
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_SelectionBounds_Params& params) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> anchor_rect_dip(
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateJavaRect(env, params.anchor_rect));
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> focus_rect_dip(
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateJavaRect(env, params.focus_rect));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_onSelectionBoundsChanged(env, obj.obj(),
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                anchor_rect_dip.obj(),
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                params.anchor_dir,
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                focus_rect_dip.obj(),
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                params.focus_dir,
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                params.is_anchor_first);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ShowPastePopup(int x_dip, int y_dip) {
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;
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_showPastePopup(env, obj.obj(),
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<jint>(x_dip),
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      static_cast<jint>(y_dip));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int ContentViewCoreImpl::GetScaledContentTexture(
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale,
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size* out_size) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view->GetScaledContentTexture(scale, out_size);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::StartContentIntent(const GURL& content_url) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jcontent_url =
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, content_url.spec());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_startContentIntent(env,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          j_obj.obj(),
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          jcontent_url.obj());
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ShowDisambiguationPopup(
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& target_rect,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap& zoomed_bitmap) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> rect_object(CreateJavaRect(env, target_rect));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> java_bitmap =
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::ConvertToJavaBitmap(&zoomed_bitmap);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!java_bitmap.is_null());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_ContentViewCore_showDisambiguationPopup(env,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               obj.obj(),
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               rect_object.obj(),
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               java_bitmap.obj());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::CreateTouchEventSynthesizer() {
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Java_ContentViewCore_createTouchEventSynthesizer(env, obj.obj());
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ContentViewCoreImpl::NotifyExternalSurface(
629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int player_id, bool is_request, const gfx::RectF& rect) {
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.is_null())
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
636b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Java_ContentViewCore_notifyExternalSurface(
637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      env,
638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      obj.obj(),
639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jint>(player_id),
640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jboolean>(is_request),
641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jfloat>(rect.x()),
642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jfloat>(rect.y()),
643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jfloat>(rect.width()),
644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<jfloat>(rect.height()));
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetContentVideoViewClient() {
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (obj.is_null())
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Java_ContentViewCore_getContentVideoViewClient(env, obj.obj());
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetContext() {
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (obj.is_null())
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ScopedJavaLocalRef<jobject>();
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Java_ContentViewCore_getContext(env, obj.obj());
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ContentViewCoreImpl::ShouldBlockMediaRequest(const GURL& url) {
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (obj.is_null())
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return true;
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Java_ContentViewCore_shouldBlockMediaRequest(env, obj.obj(),
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      j_url.obj());
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetPhysicalBackingSize() const {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (j_obj.is_null())
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingWidthPix(env, j_obj.obj()),
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_ContentViewCore_getPhysicalBackingHeightPix(env, j_obj.obj()));
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizePix() const {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (j_obj.is_null())
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return gfx::Size(
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportWidthPix(env, j_obj.obj()),
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportHeightPix(env, j_obj.obj()));
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizeOffsetPix() const {
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (j_obj.is_null())
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Size();
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return gfx::Size(
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportSizeOffsetWidthPix(env, j_obj.obj()),
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Java_ContentViewCore_getViewportSizeOffsetHeightPix(env, j_obj.obj()));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizeDip() const {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::ToCeiledSize(
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScaleSize(GetViewportSizePix(), 1.0f / GetDpiScale()));
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size ContentViewCoreImpl::GetViewportSizeOffsetDip() const {
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return gfx::ToCeiledSize(
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::ScaleSize(GetViewportSizeOffsetPix(), 1.0f / GetDpiScale()));
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float ContentViewCoreImpl::GetOverdrawBottomHeightDip() const {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (j_obj.is_null())
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0.f;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Java_ContentViewCore_getOverdrawBottomHeightPix(env, j_obj.obj())
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      / GetDpiScale();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::AttachLayer(scoped_refptr<cc::Layer> layer) {
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_layer_->AddChild(layer);
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::RemoveLayer(scoped_refptr<cc::Layer> layer) {
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->RemoveFromParent();
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::LoadUrl(
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationController::LoadURLParams& params) {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWebContents()->GetController().LoadURLWithParams(params);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewCoreImpl::AddBeginFrameSubscriber() {
74168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
74268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
74368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (obj.is_null())
74468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
74568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Java_ContentViewCore_addVSyncSubscriber(env, obj.obj());
74668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
74768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
74868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewCoreImpl::RemoveBeginFrameSubscriber() {
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.is_null())
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
75368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Java_ContentViewCore_removeVSyncSubscriber(env, obj.obj());
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ContentViewCoreImpl::SetNeedsAnimate() {
75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (obj.is_null())
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Java_ContentViewCore_setNeedsAnimate(env, obj.obj());
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ui::ViewAndroid* ContentViewCoreImpl::GetViewAndroid() const {
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // view_android_ should never be null for Chrome.
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(view_android_);
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return view_android_;
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::WindowAndroid* ContentViewCoreImpl::GetWindowAndroid() const {
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This should never be NULL for Chrome, but will be NULL for WebView.
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(window_android_);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_android_;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<cc::Layer> ContentViewCoreImpl::GetLayer() const {
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return root_layer_.get();
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Methods called from Java via JNI
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SelectPopupMenuItems(JNIEnv* env, jobject obj,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               jintArray indices) {
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderViewHost());
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rvhi);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (indices == NULL) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvhi->DidCancelPopupMenu();
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int selected_count = env->GetArrayLength(indices);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> selected_indices;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint* indices_ptr = env->GetIntArrayElements(indices, NULL);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < selected_count; ++i)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_indices.push_back(indices_ptr[i]);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->ReleaseIntArrayElements(indices, indices_ptr, JNI_ABORT);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvhi->DidSelectPopupMenuItems(selected_indices);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::LoadUrl(
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env, jobject obj,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring url,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint load_url_type,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint transition_type,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jint ua_override_option,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring extra_headers,
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jbyteArray post_data,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring base_url_for_data_url,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring virtual_url_for_data_url,
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jboolean can_load_local_resources) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(url);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController::LoadURLParams params(
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(ConvertJavaStringToUTF8(env, url)));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.load_type = static_cast<NavigationController::LoadURLType>(
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_url_type);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.transition_type = PageTransitionFromInt(transition_type);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.override_user_agent =
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<NavigationController::UserAgentOverrideOption>(
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ua_override_option);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra_headers)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (post_data) {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<uint8> http_body_vector;
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::android::JavaByteArrayToByteVector(env, post_data, &http_body_vector);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.browser_initiated_post_data =
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::RefCountedBytes::TakeVector(&http_body_vector);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base_url_for_data_url) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.base_url_for_data_url =
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (virtual_url_for_data_url) {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.virtual_url_for_data_url =
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url));
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.can_load_local_resources = can_load_local_resources;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadUrl(params);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jint ContentViewCoreImpl::GetCurrentRenderProcessId(JNIEnv* env, jobject obj) {
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetRenderProcessIdFromRenderViewHost(
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderViewHost());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedJavaLocalRef<jstring> ContentViewCoreImpl::GetURL(
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env, jobject) const {
8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ConvertUTF8ToJavaString(env, GetWebContents()->GetURL().spec());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedJavaLocalRef<jstring> ContentViewCoreImpl::GetTitle(
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env, jobject obj) const {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertUTF16ToJavaString(env, GetWebContents()->GetTitle());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::IsIncognito(JNIEnv* env, jobject obj) {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWebContents()->GetBrowserContext()->IsOffTheRecord();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* ContentViewCoreImpl::GetWebContents() const {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_contents_;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SetFocus(JNIEnv* env, jobject obj, jboolean focused) {
874d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetFocusInternal(focused);
875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
876d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ContentViewCoreImpl::SetFocusInternal(bool focused) {
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetRenderWidgetHostViewAndroid())
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focused)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderWidgetHostViewAndroid()->Focus();
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRenderWidgetHostViewAndroid()->Blur();
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SendOrientationChangeEvent(JNIEnv* env,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     jobject obj,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     jint orientation) {
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (device_orientation_ != orientation) {
8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    device_orientation_ = orientation;
8924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SendOrientationChangeEventInternal();
8934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::SendTouchEvent(JNIEnv* env,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jobject obj,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jlong time_ms,
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jint type,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jobjectArray pts) {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv) {
903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    using blink::WebTouchEvent;
904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTouchEvent event;
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TouchPoint::BuildWebTouchEvent(env, type, time_ms, GetDpiScale(), pts,
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->SendTouchEvent(event);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float ContentViewCoreImpl::GetTouchPaddingDip() {
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 48.0f / GetDpiScale();
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float ContentViewCoreImpl::GetDpiScale() const {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dpi_scale_;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContentViewCoreImpl::RequestContentClipping(
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Rect& clipping,
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Size& content_size) {
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (rwhv)
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rwhv->RequestContentClipping(clipping, content_size);
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::SendMouseMoveEvent(JNIEnv* env,
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 jobject obj,
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 jlong time_ms,
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 jfloat x,
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 jfloat y) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhv)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent event = WebMouseEventBuilder::Build(
939bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      WebInputEvent::MouseMove,
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMouseEvent::ButtonNone,
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      time_ms / 1000.0, x / GetDpiScale(), y / GetDpiScale(), 0, 1);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rwhv->SendMouseEvent(event);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::SendMouseWheelEvent(JNIEnv* env,
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jobject obj,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jlong time_ms,
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  jfloat x,
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  jfloat y,
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jfloat vertical_axis) {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhv)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
957bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  WebMouseWheelEventBuilder::Direction direction;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (vertical_axis > 0) {
959bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    direction = WebMouseWheelEventBuilder::DIRECTION_UP;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (vertical_axis < 0) {
961bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    direction = WebMouseWheelEventBuilder::DIRECTION_DOWN;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseWheelEvent event = WebMouseWheelEventBuilder::Build(
966bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      direction, time_ms / 1000.0, x / GetDpiScale(), y / GetDpiScale());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rwhv->SendMouseWheelEvent(event);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGestureEvent ContentViewCoreImpl::MakeGestureEvent(
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebInputEvent::Type type, int64 time_ms, float x, float y) const {
974bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return WebGestureEventBuilder::Build(
975bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      type, time_ms / 1000.0, x / GetDpiScale(), y / GetDpiScale());
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::SendGestureEvent(
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebGestureEvent& event) {
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rwhv)
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rwhv->SendGestureEvent(event);
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollBegin(JNIEnv* env, jobject obj, jlong time_ms,
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      jfloat x, jfloat y) {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollBegin, time_ms, x, y);
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollEnd(JNIEnv* env, jobject obj, jlong time_ms) {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollEnd, time_ms, 0, 0);
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollBy(JNIEnv* env, jobject obj, jlong time_ms,
99958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   jfloat x, jfloat y, jfloat dx, jfloat dy) {
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1001868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureScrollUpdate, time_ms, x, y);
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.data.scrollUpdate.deltaX = -dx / GetDpiScale();
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.data.scrollUpdate.deltaY = -dy / GetDpiScale();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::FlingStart(JNIEnv* env, jobject obj, jlong time_ms,
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     jfloat x, jfloat y, jfloat vx, jfloat vy) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureFlingStart, time_ms, x, y);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Velocity should not be scaled by DIP since that interacts poorly with the
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // deceleration constants.  The DIP scaling is done on the renderer.
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.data.flingStart.velocityX = vx;
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.data.flingStart.velocityY = vy;
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::FlingCancel(JNIEnv* env, jobject obj, jlong time_ms) {
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureFlingCancel, time_ms, 0, 0);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SingleTap(JNIEnv* env, jobject obj, jlong time_ms,
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    jboolean disambiguation_popup_tap) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureTap, time_ms, x, y);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.data.tap.tapCount = 1;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!disambiguation_popup_tap) {
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const float touch_padding_dip = GetTouchPaddingDip();
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.tap.width = touch_padding_dip;
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.tap.height = touch_padding_dip;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1043b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ContentViewCoreImpl::SingleTapUnconfirmed(JNIEnv* env, jobject obj,
1044b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                               jlong time_ms,
1045b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                               jfloat x, jfloat y) {
1046b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureTapUnconfirmed, time_ms, x, y);
1048b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1049b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  event.data.tap.tapCount = 1;
1050b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1051b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const float touch_padding_dip = GetTouchPaddingDip();
1052b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  event.data.tap.width = touch_padding_dip;
1053b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  event.data.tap.height = touch_padding_dip;
1054b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1055b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SendGestureEvent(event);
1056b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1057b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ShowPressState(JNIEnv* env, jobject obj,
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         jlong time_ms,
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         jfloat x, jfloat y) {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      WebInputEvent::GestureShowPress, time_ms, x, y);
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ContentViewCoreImpl::TapCancel(JNIEnv* env,
1067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    jobject obj,
1068f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    jlong time_ms,
1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    jfloat x,
1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    jfloat y) {
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureTapCancel, time_ms, x, y);
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ContentViewCoreImpl::TapDown(JNIEnv* env, jobject obj,
10771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  jlong time_ms,
10781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  jfloat x, jfloat y) {
10791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
10801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      WebInputEvent::GestureTapDown, time_ms, x, y);
10811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SendGestureEvent(event);
10821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::DoubleTap(JNIEnv* env, jobject obj, jlong time_ms,
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y) {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureDoubleTap, time_ms, x, y);
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::LongPress(JNIEnv* env, jobject obj, jlong time_ms,
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y,
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    jboolean disambiguation_popup_tap) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureLongPress, time_ms, x, y);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!disambiguation_popup_tap) {
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const float touch_padding_dip = GetTouchPaddingDip();
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.longPress.width = touch_padding_dip;
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.longPress.height = touch_padding_dip;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::LongTap(JNIEnv* env, jobject obj, jlong time_ms,
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jfloat x, jfloat y,
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jboolean disambiguation_popup_tap) {
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GestureLongTap, time_ms, x, y);
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!disambiguation_popup_tap) {
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const float touch_padding_dip = GetTouchPaddingDip();
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.longPress.width = touch_padding_dip;
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.data.longPress.height = touch_padding_dip;
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchBegin(JNIEnv* env, jobject obj, jlong time_ms,
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     jfloat x, jfloat y) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchBegin, time_ms, x, y);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchEnd(JNIEnv* env, jobject obj, jlong time_ms) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchEnd, time_ms, 0, 0);
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::PinchBy(JNIEnv* env, jobject obj, jlong time_ms,
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jfloat anchor_x, jfloat anchor_y,
113658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  jfloat delta) {
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGestureEvent event = MakeGestureEvent(
1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebInputEvent::GesturePinchUpdate, time_ms, anchor_x, anchor_y);
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.data.pinchUpdate.scale = delta;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendGestureEvent(event);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SelectBetweenCoordinates(JNIEnv* env, jobject obj,
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   jfloat x1, jfloat y1,
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   jfloat x2, jfloat y2) {
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetRenderWidgetHostViewAndroid()) {
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetRenderWidgetHostViewAndroid()->SelectRange(
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Point(x1 / GetDpiScale(), y1 / GetDpiScale()),
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Point(x2 / GetDpiScale(), y2 / GetDpiScale()));
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::MoveCaret(JNIEnv* env, jobject obj,
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jfloat x, jfloat y) {
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetRenderWidgetHostViewAndroid()) {
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetRenderWidgetHostViewAndroid()->MoveCaret(
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Point(x / GetDpiScale(), y / GetDpiScale()));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void ContentViewCoreImpl::LoadIfNecessary(JNIEnv* env, jobject obj) {
11638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  web_contents_->GetController().LoadIfNecessary();
11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
11658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void ContentViewCoreImpl::RequestRestoreLoad(JNIEnv* env, jobject obj) {
11678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  web_contents_->GetController().SetNeedsReload();
11688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::StopLoading(JNIEnv* env, jobject obj) {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->Stop();
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ContentViewCoreImpl::Reload(JNIEnv* env,
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 jobject obj,
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 jboolean check_for_repost) {
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetController().NeedsReload())
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetController().LoadIfNecessary();
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_contents_->GetController().Reload(check_for_repost);
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ContentViewCoreImpl::ReloadIgnoringCache(JNIEnv* env,
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                              jobject obj,
1185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                              jboolean check_for_repost) {
1186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_contents_->GetController().ReloadIgnoringCache(check_for_repost);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::CancelPendingReload(JNIEnv* env, jobject obj) {
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetController().CancelPendingReload();
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ContinuePendingReload(JNIEnv* env, jobject obj) {
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetController().ContinuePendingReload();
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ClearHistory(JNIEnv* env, jobject obj) {
1198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(creis): Do callers of this need to know if it fails?
1199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (web_contents_->GetController().CanPruneAllButLastCommitted())
1200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_contents_->GetController().PruneAllButLastCommitted();
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::AddJavascriptInterface(
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject /* obj */,
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject object,
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jstring name,
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    jclass safe_annotation_clazz,
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    jobject retained_object_set) {
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_object(env, object);
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jclass> scoped_clazz(env, safe_annotation_clazz);
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JavaObjectWeakGlobalRef weak_retained_object_set(env, retained_object_set);
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaBoundObject creates the NPObject with a ref count of 1, and
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaBridgeDispatcherHostManager takes its own ref.
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JavaBridgeDispatcherHostManager* java_bridge =
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->java_bridge_dispatcher_host_manager();
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  java_bridge->SetRetainedObjectSet(weak_retained_object_set);
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NPObject* bound_object = JavaBoundObject::Create(scoped_object, scoped_clazz,
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   java_bridge->AsWeakPtr());
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  java_bridge->AddNamedObject(ConvertJavaStringToUTF16(env, name),
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bound_object);
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebBindings::releaseObject(bound_object);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::RemoveJavascriptInterface(JNIEnv* env,
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    jobject /* obj */,
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    jstring name) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->java_bridge_dispatcher_host_manager()->RemoveNamedObject(
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertJavaStringToUTF16(env, name));
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::UpdateVSyncParameters(JNIEnv* env, jobject /* obj */,
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                jlong timebase_micros,
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                jlong interval_micros) {
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view->GetRenderWidgetHost());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->UpdateVSyncParameters(
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeTicks::FromInternalValue(timebase_micros),
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMicroseconds(interval_micros));
12467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  vsync_interval_ =
12487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TimeDelta::FromMicroseconds(interval_micros);
12497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_browser_composite_time_ =
12507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      vsync_interval_ * kDefaultBrowserCompositeVSyncFraction;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContentViewCoreImpl::OnVSync(JNIEnv* env, jobject /* obj */,
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  jlong frame_time_micros) {
1255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::TimeTicks frame_time =
1256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::TimeTicks::FromInternalValue(frame_time_micros);
1257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SendBeginFrame(frame_time);
1258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentViewCoreImpl::SendBeginFrame(base::TimeTicks frame_time) {
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!view)
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks display_time = frame_time + vsync_interval_;
12667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks deadline = display_time - expected_browser_composite_time_;
12677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
126890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  view->SendBeginFrame(
12697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      cc::BeginFrameArgs::Create(frame_time, deadline, vsync_interval_));
127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
127190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)jboolean ContentViewCoreImpl::OnAnimate(JNIEnv* env, jobject /* obj */,
127390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        jlong frame_time_micros) {
127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
127590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!view)
127690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return view->Animate(base::TimeTicks::FromInternalValue(frame_time_micros));
1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jboolean ContentViewCoreImpl::PopulateBitmapFromCompositor(JNIEnv* env,
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           jobject obj,
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           jobject jbitmap) {
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return view->PopulateBitmapWithContents(jbitmap);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::WasResized(JNIEnv* env, jobject obj) {
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view)
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->WasResized();
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ShowInterstitialPage(
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env, jobject obj, jstring jurl, jint delegate_ptr) {
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(base::android::ConvertJavaStringToUTF8(env, jurl));
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialPageDelegateAndroid* delegate =
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<InterstitialPageDelegateAndroid*>(delegate_ptr);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialPage* interstitial = InterstitialPage::Create(
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_, false, url, delegate);
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->set_interstitial_page(interstitial);
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interstitial->Show();
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jboolean ContentViewCoreImpl::IsShowingInterstitialPage(JNIEnv* env,
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                        jobject obj) {
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return web_contents_->ShowingInterstitialPage();
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::AttachExternalVideoSurface(JNIEnv* env,
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     jobject obj,
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     jint player_id,
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     jobject jsurface) {
1317d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#if defined(VIDEO_HOLE)
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderViewHost());
1320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (rvhi && rvhi->media_player_manager()) {
1321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    rvhi->media_player_manager()->AttachExternalVideoSurface(
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<int>(player_id), jsurface);
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1324d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::DetachExternalVideoSurface(JNIEnv* env,
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     jobject obj,
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     jint player_id) {
1330d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#if defined(VIDEO_HOLE)
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderViewHost());
1333424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (rvhi && rvhi->media_player_manager()) {
1334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    rvhi->media_player_manager()->DetachExternalVideoSurface(
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<int>(player_id));
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1337d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jboolean ContentViewCoreImpl::IsRenderWidgetHostViewReady(JNIEnv* env,
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                          jobject obj) {
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view && view->HasValidFrame();
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ExitFullscreen(JNIEnv* env, jobject obj) {
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
13481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!host)
13491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host->ExitFullscreen();
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContentViewCoreImpl::UpdateTopControlsState(JNIEnv* env,
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 jobject obj,
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 bool enable_hiding,
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 bool enable_showing,
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 bool animate) {
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
13591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!host)
13601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host->Send(new ViewMsg_UpdateTopControlsState(host->GetRoutingID(),
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                enable_hiding,
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                enable_showing,
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                animate));
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::ShowImeIfNeeded(JNIEnv* env, jobject obj) {
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host->Send(new ViewMsg_ShowImeIfNeeded(host->GetRoutingID()));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ScrollFocusedEditableNodeIntoView(JNIEnv* env,
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                            jobject obj) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host->Send(new InputMsg_ScrollFocusedEditableNodeIntoRect(
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->GetRoutingID(), gfx::Rect()));
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AddNavigationEntryToHistory(JNIEnv* env, jobject obj,
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        jobject history,
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        NavigationEntry* entry,
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        int index) {
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the details of the current entry
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_url(
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, entry->GetURL().spec()));
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_virtual_url(
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, entry->GetVirtualURL().spec()));
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_original_url(
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec()));
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_title(
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF16ToJavaString(env, entry->GetTitle()));
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_bitmap;
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FaviconStatus& status = entry->GetFavicon();
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status.valid && status.image.ToSkBitmap()->getSize() > 0)
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    j_bitmap = gfx::ConvertToJavaBitmap(status.image.ToSkBitmap());
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the item to the list
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_addToNavigationHistory(
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj, history, index, j_url.obj(), j_virtual_url.obj(),
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      j_original_url.obj(), j_title.obj(), j_bitmap.obj());
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentViewCoreImpl::GetNavigationHistory(JNIEnv* env,
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              jobject obj,
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              jobject history) {
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate through navigation entries to populate the list
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const NavigationController& controller = web_contents_->GetController();
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = controller.GetEntryCount();
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < count; ++i) {
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddNavigationEntryToHistory(
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        env, obj, history, controller.GetEntryAtIndex(i), i);
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller.GetCurrentEntryIndex();
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::GetDirectedNavigationHistory(JNIEnv* env,
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       jobject obj,
1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                       jobject history,
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       jboolean is_forward,
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       jint max_entries) {
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Iterate through navigation entries to populate the list
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NavigationController& controller = web_contents_->GetController();
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count = controller.GetEntryCount();
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_added = 0;
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int increment_value = is_forward ? 1 : -1;
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = controller.GetCurrentEntryIndex() + increment_value;
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i >= 0 && i < count;
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i += increment_value) {
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_added >= max_entries)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddNavigationEntryToHistory(
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        env, obj, history, controller.GetEntryAtIndex(i), i);
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_added++;
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScopedJavaLocalRef<jstring>
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ContentViewCoreImpl::GetOriginalUrlForActiveNavigationEntry(JNIEnv* env,
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                            jobject obj) {
14464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (entry == NULL)
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return ScopedJavaLocalRef<jstring>(env, NULL);
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec());
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentViewCoreImpl::GetNativeImeAdapter(JNIEnv* env, jobject obj) {
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rwhva)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rwhva->GetNativeImeAdapter();
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::UndoScrollFocusedEditableNodeIntoView(
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject obj) {
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = web_contents_->GetRenderViewHost();
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->Send(
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ViewMsg_UndoScrollFocusedEditableNodeIntoView(host->GetRoutingID()));
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void JavaScriptResultCallback(const ScopedJavaGlobalRef<jobject>& callback,
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Value* result) {
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string json;
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::JSONWriter::Write(result, &json);
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> j_json = ConvertUTF8ToJavaString(env, json);
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_onEvaluateJavaScriptResult(env,
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  j_json.obj(),
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  callback.obj());
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::EvaluateJavaScript(JNIEnv* env,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jobject obj,
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             jstring script,
14833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                             jobject callback,
14843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                             jboolean start_renderer) {
14853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RenderViewHost* rvh = web_contents_->GetRenderViewHost();
14863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(rvh);
14873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (start_renderer && !rvh->IsRenderViewLive()) {
14893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!web_contents_->CreateRenderViewForInitialEmptyDocument()) {
14903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LOG(ERROR) << "Failed to create RenderView in EvaluateJavaScript";
14913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return;
14923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
14933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!callback) {
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No callback requested.
1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    rvh->ExecuteJavascriptInWebFrame(base::string16(),  // frame_xpath
14983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     ConvertJavaStringToUTF16(env, script));
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Secure the Java callback in a scoped object and give ownership of it to the
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // base::Callback.
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaGlobalRef<jobject> j_callback;
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  j_callback.Reset(env, callback);
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderViewHost::JavascriptResultCallback c_callback =
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&JavaScriptResultCallback, j_callback);
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  rvh->ExecuteJavascriptInWebFrameCallbackResult(
1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),  // frame_xpath
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertJavaStringToUTF16(env, script),
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      c_callback);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentViewCoreImpl::GetUseDesktopUserAgent(
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env, jobject obj) {
15174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry && entry->GetIsOverridingUserAgent();
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewCoreImpl::UpdateImeAdapter(int native_ime_adapter,
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int text_input_type,
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& text,
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int selection_start,
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int selection_end,
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int composition_start,
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int composition_end,
15284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                           bool show_ime_if_needed,
15294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                           bool require_ack) {
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_text = ConvertUTF8ToJavaString(env, text);
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ContentViewCore_updateImeAdapter(env, obj.obj(),
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        native_ime_adapter, text_input_type,
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        jstring_text.obj(),
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        selection_start, selection_end,
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        composition_start, composition_end,
15414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        show_ime_if_needed, require_ack);
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::ClearSslPreferences(JNIEnv* env, jobject obj) {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLHostState* state = SSLHostState::GetFor(
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetController().GetBrowserContext());
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->Clear();
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentViewCoreImpl::SetUseDesktopUserAgent(
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject obj,
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jboolean enabled,
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jboolean reload_on_state_change) {
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetUseDesktopUserAgent(env, obj) == enabled)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the navigation entry actually exists.
15594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the flag in the NavigationEntry.
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->SetIsOverridingUserAgent(enabled);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the override to the renderer.
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reload_on_state_change) {
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reloading the page will send the override down as part of the
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // navigation IPC message.
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigationControllerImpl& controller =
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<NavigationControllerImpl&>(web_contents_->GetController());
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller.ReloadOriginalRequestURL(false);
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentViewCoreImpl::SetAccessibilityEnabled(JNIEnv* env, jobject obj,
1577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                  bool enabled) {
1578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderWidgetHostViewAndroid* host_view = GetRenderWidgetHostViewAndroid();
1579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!host_view)
1580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderWidgetHostImpl* host_impl = RenderWidgetHostImpl::From(
1582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      host_view->GetRenderWidgetHost());
15834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserAccessibilityState* accessibility_state =
15844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserAccessibilityState::GetInstance();
1585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (enabled) {
15864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // This enables accessibility globally unless it was explicitly disallowed
15874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // by a command-line flag.
15884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    accessibility_state->OnScreenReaderDetected();
15894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // If it was actually enabled globally, enable it for this RenderWidget now.
15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (accessibility_state->IsAccessibleBrowser() && host_impl)
1591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      host_impl->SetAccessibilityMode(AccessibilityModeComplete);
1592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
15934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    accessibility_state->DisableAccessibility();
1594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (host_impl)
1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      host_impl->SetAccessibilityMode(AccessibilityModeOff);
1596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ContentViewCoreImpl::SendSingleTapUma(JNIEnv* env,
1600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           jobject obj,
1601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           jint type,
1602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           jint count) {
1603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Event.SingleTapType", type, count);
1604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ContentViewCoreImpl::SendActionAfterDoubleTapUma(JNIEnv* env,
1607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      jobject obj,
1608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      jint type,
1609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      jboolean has_delay,
1610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      jint count) {
1611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This UMA stat tracks a user's action after a double tap within
1612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // k seconds (where k == 5 currently). This UMA will tell us if
1613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // removing the tap gesture delay will lead to significantly more
1614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // accidental navigations after a double tap.
1615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (has_delay) {
1616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("Event.ActionAfterDoubleTapWithDelay", type,
1617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              count);
1618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
1619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("Event.ActionAfterDoubleTapNoDelay", type,
1620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              count);
1621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ContentViewCoreImpl::SendOrientationChangeEventInternal() {
16254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
16264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (rwhv)
16274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rwhv->UpdateScreenInfo(rwhv->GetNativeView());
16284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(
16304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      web_contents_->GetRenderViewHost());
16314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  rvhi->SendOrientationChangeEvent(device_orientation_);
16324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
16334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1634d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)void ContentViewCoreImpl::ExtractSmartClipData(JNIEnv* env,
1635d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)                                               jobject obj,
1636d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)                                               jint x,
1637d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)                                               jint y,
1638d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)                                               jint width,
1639d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)                                               jint height) {
1640d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  gfx::Rect rect(
1641d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      static_cast<int>(x / GetDpiScale()),
1642d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      static_cast<int>(y / GetDpiScale()),
1643d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      static_cast<int>((width > 0 && width < GetDpiScale()) ?
1644d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)          1 : (int)(width / GetDpiScale())),
1645d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      static_cast<int>((height > 0 && height < GetDpiScale()) ?
1646d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)          1 : (int)(height / GetDpiScale())));
1647d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  GetWebContents()->Send(new ViewMsg_ExtractSmartClipData(
1648d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      GetWebContents()->GetRoutingID(), rect));
1649d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)}
1650d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)
1651d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)void ContentViewCoreImpl::OnSmartClipDataExtracted(const string16& result) {
1652d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1653d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
1654d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  if (obj.is_null())
1655d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)    return;
1656d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jresult = ConvertUTF16ToJavaString(env, result);
1657d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)  Java_ContentViewCore_onSmartClipDataExtracted(
1658d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)      env, obj.obj(), jresult.obj());
1659d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)}
1660d8f2b4b00825da44f52b775a415bc945dcd54811Torne (Richard Coles)
1661923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdochvoid ContentViewCoreImpl::WebContentsDestroyed(WebContents* web_contents) {
1662923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch  WebContentsViewAndroid* wcva =
1663923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch      static_cast<WebContentsViewAndroid*>(web_contents->GetView());
1664923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch  DCHECK(wcva);
1665923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch  wcva->SetContentViewCore(NULL);
1666923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch}
1667923bd855a3a49144a9f75d8a8200416a52bae775Ben Murdoch
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is called for each ContentView.
1669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)jlong Init(JNIEnv* env, jobject obj,
1670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jboolean hardware_accelerated,
1671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jlong native_web_contents,
1672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jlong view_android,
1673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           jlong window_android) {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCoreImpl* view = new ContentViewCoreImpl(
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      env, obj, hardware_accelerated,
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<WebContents*>(native_web_contents),
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<ui::ViewAndroid*>(view_android),
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<ui::WindowAndroid*>(window_android));
1679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(view);
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterContentViewCore(JNIEnv* env) {
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env);
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1687