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