1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 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 "android_webview/native/aw_contents.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba#include <limits>
8fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/aw_browser_context.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/aw_browser_main_parts.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "android_webview/browser/gpu_memory_buffer_factory_impl.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "android_webview/browser/in_process_view_renderer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/net_disk_cache_remover.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/common/aw_hit_test_data.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "android_webview/native/aw_autofill_manager_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/native/aw_browser_dependency_factory.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/aw_contents_client_bridge.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/native/aw_contents_io_thread_client_impl.h"
205d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// START: Printing fork b/10190508
215d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "android_webview/native/aw_pdf_exporter.h"
225d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// END: Printing fork b/10190508
234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "android_webview/native/aw_picture.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/native/aw_web_contents_delegate.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/java_browser_view_renderer_helper.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/state_serializer.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/public/browser/draw_gl.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_array.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/scoped_java_ref.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/atomicops.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
35389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)#include "base/memory/memory_pressure_listener.h"
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/pickle.h"
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/supports_user_data.h"
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/autofill_driver_impl.h"
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
43b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun#include "components/navigation_interception/intercept_navigation_delegate.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/cert_store.h"
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/favicon_status.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
525db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles)#include "content/public/common/renderer_preferences.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/ssl_status.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/AwContents_jni.h"
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h"
564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "third_party/skia/include/core/SkPicture.h"
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/l10n/l10n_util_android.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/android/java_bitmap.h"
5966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org#include "ui/gfx/font_render_params_linux.h"
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/gfx/image/image.h"
61fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba#include "ui/gfx/size.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct AwDrawSWFunctionTable;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct AwDrawGLFunctionTable;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using autofill::AutofillDriverImpl;
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using autofill::AutofillManager;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::JavaRef;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaGlobalRef;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
76b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurunusing navigation_interception::InterceptNavigationDelegate;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ContentViewCore;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static AwDrawGLFunction DrawGLFunction;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void DrawGLFunction(int view_context,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AwDrawGLInfo* draw_info,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           void* spare) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |view_context| is the value that was returned from the java
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AwContents.onPrepareDrawGL; this cast must match the code there.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reinterpret_cast<android_webview::BrowserViewRenderer*>(view_context)->DrawGL(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      draw_info);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android_webview {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdochbool g_should_download_favicons = false;
98ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)JavaBrowserViewRendererHelper* java_renderer_helper() {
1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return JavaBrowserViewRendererHelper::GetInstance();
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* kAwContentsUserDataKey = &kAwContentsUserDataKey;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AwContentsUserData : public base::SupportsUserData::Data {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AwContentsUserData(AwContents* ptr) : contents_(ptr) {}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AwContents* GetContents(WebContents* web_contents) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!web_contents)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AwContentsUserData* data = reinterpret_cast<AwContentsUserData*>(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_contents->GetUserData(kAwContentsUserDataKey));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data ? data->contents_ : NULL;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AwContents* contents_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::subtle::Atomic32 g_instance_count = 0;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
12366cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org// TODO(boliu): Deduplicate with chrome/ code.
12466cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.orgcontent::RendererPreferencesHintingEnum GetRendererPreferencesHintingEnum(
12566cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    gfx::FontRenderParams::Hinting hinting) {
12666cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  switch (hinting) {
12766cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::HINTING_NONE:
12866cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_HINTING_NONE;
12966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::HINTING_SLIGHT:
13066cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_HINTING_SLIGHT;
13166cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::HINTING_MEDIUM:
13266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_HINTING_MEDIUM;
13366cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::HINTING_FULL:
13466cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_HINTING_FULL;
13566cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    default:
13666cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      NOTREACHED() << "Unhandled hinting style " << hinting;
13766cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_HINTING_SYSTEM_DEFAULT;
13866cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  }
13966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org}
14066cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org
14166cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org// TODO(boliu): Deduplicate with chrome/ code.
14266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.orgcontent::RendererPreferencesSubpixelRenderingEnum
14366cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.orgGetRendererPreferencesSubpixelRenderingEnum(
14466cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    gfx::FontRenderParams::SubpixelRendering subpixel_rendering) {
14566cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  switch (subpixel_rendering) {
14666cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE:
14766cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_NONE;
14866cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB:
14966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_RGB;
15066cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR:
15166cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_BGR;
15266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB:
15366cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_VRGB;
15466cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR:
15566cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_VBGR;
15666cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org    default:
15766cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      NOTREACHED() << "Unhandled subpixel rendering style "
15866cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org                   << subpixel_rendering;
15966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_SYSTEM_DEFAULT;
16066cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  }
16166cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org}
16266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwContents* AwContents::FromWebContents(WebContents* web_contents) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AwContentsUserData::GetContents(web_contents);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContents* AwContents::FromID(int render_process_id, int render_view_id) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const content::RenderViewHost* rvh =
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::RenderViewHost::FromID(render_process_id, render_view_id);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rvh) return NULL;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_contents =
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents::FromRenderViewHost(rvh);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents) return NULL;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FromWebContents(web_contents);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AwContents::AwContents(scoped_ptr<WebContents> web_contents)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : web_contents_(web_contents.Pass()),
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser_view_renderer_(
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          new InProcessViewRenderer(this, java_renderer_helper(),
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    web_contents_.get())) {
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  icon_helper_.reset(new IconHelper(web_contents_.get()));
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  icon_helper_->SetListener(this);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->SetUserData(kAwContentsUserDataKey,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             new AwContentsUserData(this));
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  render_view_host_ext_.reset(
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new AwRenderViewHostExt(this, web_contents_.get()));
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AwAutofillManagerDelegate* autofill_manager_delegate =
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      AwAutofillManagerDelegate::FromWebContents(web_contents_.get());
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (autofill_manager_delegate)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    InitAutofillIfNecessary(autofill_manager_delegate->GetSaveFormData());
1995db5c4ec98571177cc4dec6df1ad33269f632543Torne (Richard Coles)
20013a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)  SetAndroidWebViewRendererPrefs();
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AwContents::SetJavaPeers(JNIEnv* env,
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              jobject obj,
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              jobject aw_contents,
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              jobject web_contents_delegate,
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              jobject contents_client_bridge,
208b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun                              jobject io_thread_client,
209b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun                              jobject intercept_navigation_delegate) {
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The |aw_content| param is technically spurious as it duplicates |obj| but
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // is passed over anyway to make the binding more explicit.
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  java_ref_ = JavaObjectWeakGlobalRef(env, aw_contents);
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  web_contents_delegate_.reset(
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new AwWebContentsDelegate(env, web_contents_delegate));
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  web_contents_->SetDelegate(web_contents_delegate_.get());
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  contents_client_bridge_.reset(
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new AwContentsClientBridge(env, contents_client_bridge));
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AwContentsClientBridgeBase::Associate(web_contents_.get(),
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                        contents_client_bridge_.get());
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AwContentsIoThreadClientImpl::Associate(
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      web_contents_.get(), ScopedJavaLocalRef<jobject>(env, io_thread_client));
226b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun
227b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun  InterceptNavigationDelegate::Associate(
228b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun      web_contents_.get(),
229b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun      make_scoped_ptr(new InterceptNavigationDelegate(
230b182fe5940919bed4353dcd88e26bef9c704aa3fSelim Gurun          env, intercept_navigation_delegate)));
2311fd9e3b04c69b248f06b24005d5b6a3cd3d86ccbSelim Gurun
2321fd9e3b04c69b248f06b24005d5b6a3cd3d86ccbSelim Gurun  // Finally, having setup the associations, release any deferred requests
2331fd9e3b04c69b248f06b24005d5b6a3cd3d86ccbSelim Gurun  int child_id = web_contents_->GetRenderProcessHost()->GetID();
2341fd9e3b04c69b248f06b24005d5b6a3cd3d86ccbSelim Gurun  int route_id = web_contents_->GetRoutingID();
2351fd9e3b04c69b248f06b24005d5b6a3cd3d86ccbSelim Gurun  AwResourceDispatcherHostDelegate::OnIoThreadClientReady(child_id, route_id);
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AwContents::SetSaveFormData(bool enabled) {
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  InitAutofillIfNecessary(enabled);
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We need to check for the existence, since autofill_manager_delegate
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // may not be created when the setting is false.
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (AutofillDriverImpl::FromWebContents(web_contents_.get())) {
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AwAutofillManagerDelegate::FromWebContents(web_contents_.get())->
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SetSaveFormData(enabled);
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AwContents::InitAutofillIfNecessary(bool enabled) {
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not initialize if the feature is not enabled.
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!enabled)
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check if the autofill driver already exists.
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents = web_contents_.get();
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (AutofillDriverImpl::FromWebContents(web_contents))
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AwBrowserContext::FromWebContents(web_contents)->
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateUserPrefServiceIfNecessary();
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AwAutofillManagerDelegate::CreateForWebContents(web_contents);
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillDriverImpl::CreateForWebContentsAndDelegate(
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      web_contents,
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      AwAutofillManagerDelegate::FromWebContents(web_contents),
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      l10n_util::GetDefaultLocale(),
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER);
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26713a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)void AwContents::SetAndroidWebViewRendererPrefs() {
26813a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)  content::RendererPreferences* prefs =
26913a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)      web_contents_->GetMutableRendererPrefs();
27013a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)  prefs->tap_multiple_targets_strategy =
27113a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)      content::TAP_MULTIPLE_TARGETS_STRATEGY_NONE;
27266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org
27366cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  // TODO(boliu): Deduplicate with chrome/ code.
27466cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  const gfx::FontRenderParams& params = gfx::GetDefaultWebKitFontRenderParams();
27566cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->should_antialias_text = params.antialiasing;
27666cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->use_subpixel_positioning = params.subpixel_positioning;
27766cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->hinting = GetRendererPreferencesHintingEnum(params.hinting);
27866cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->use_autohinter = params.autohinter;
27966cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->use_bitmaps = params.use_bitmaps;
28066cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org  prefs->subpixel_rendering =
28166cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org      GetRendererPreferencesSubpixelRenderingEnum(params.subpixel_rendering);
28266cb5b9b21b9e7a3ad902333b276cada24fbceb3boliu@chromium.org
28313a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)  content::RenderViewHost* host = web_contents_->GetRenderViewHost();
28413a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)  if (host)
28513a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)    host->SyncRendererPrefs();
28613a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)}
28713a64a3c22259028b75c5b293d2eaed26080c490Torne (Richard Coles)
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AwContents::SetAwAutofillManagerDelegate(jobject delegate) {
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  JNIEnv* env = AttachCurrentThread();
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (obj.is_null())
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Java_AwContents_setAwAutofillManagerDelegate(env, obj.obj(), delegate);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwContents::~AwContents() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(AwContents::FromWebContents(web_contents_.get()) == this);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->RemoveUserData(kAwContentsUserDataKey);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (find_helper_.get())
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    find_helper_->SetListener(NULL);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (icon_helper_.get())
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_helper_->SetListener(NULL);
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, -1);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jint AwContents::GetWebContents(JNIEnv* env, jobject obj) {
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(web_contents_);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<jint>(web_contents_.get());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::Destroy(JNIEnv* env, jobject obj) {
31277ceb7188d76b2f05feb0f0b0ee08a2d7a181d16Selim Gurun  java_ref_.reset();
31377ceb7188d76b2f05feb0f0b0ee08a2d7a181d16Selim Gurun  // We do not delete AwContents immediately. Some applications try to delete
31477ceb7188d76b2f05feb0f0b0ee08a2d7a181d16Selim Gurun  // Webview in ShouldOverrideUrlLoading callback, which is a sync IPC from
31577ceb7188d76b2f05feb0f0b0ee08a2d7a181d16Selim Gurun  // Webkit.
31677ceb7188d76b2f05feb0f0b0ee08a2d7a181d16Selim Gurun  BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
317389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)  // When the last WebView is destroyed free all discardable memory allocated by
318389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)  // Chromium, because the app process may continue to run for a long time
319389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)  // without ever using another WebView.
320389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)  if (base::subtle::NoBarrier_Load(&g_instance_count) == 0) {
321389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)    base::MemoryPressureListener::NotifyMemoryPressure(
322389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)        base::MemoryPressureListener::MEMORY_PRESSURE_CRITICAL);
323389f89184187a18e6314d543397f72960e900659Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static jint Init(JNIEnv* env, jclass, jobject browser_context) {
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TODO(joth): Use |browser_context| to get the native BrowserContext, rather
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // than hard-code the default instance lookup here.
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<WebContents> web_contents(content::WebContents::Create(
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::WebContents::CreateParams(AwBrowserContext::GetDefault())));
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Return an 'uninitialized' instance; most work is deferred until the
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // subsequent SetJavaPeers() call.
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return reinterpret_cast<jint>(new AwContents(web_contents.Pass()));
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void SetAwDrawSWFunctionTable(JNIEnv* env, jclass, jint function_table) {
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserViewRenderer::SetAwDrawSWFunctionTable(
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<AwDrawSWFunctionTable*>(function_table));
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void SetAwDrawGLFunctionTable(JNIEnv* env, jclass, jint function_table) {
342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  GpuMemoryBufferFactoryImpl::SetAwDrawGLFunctionTable(
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<AwDrawGLFunctionTable*>(function_table));
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static jint GetAwDrawGLFunction(JNIEnv* env, jclass) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<jint>(&DrawGLFunction);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochjint GetNativeInstanceCount(JNIEnv* env, jclass) {
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return base::subtle::NoBarrier_Load(&g_instance_count);
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jint AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return reinterpret_cast<jint>(browser_view_renderer_.get());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DocumentHasImagesCallback(const ScopedJavaGlobalRef<jobject>& message,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool has_images) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_AwContents_onDocumentHasImagesResponse(AttachCurrentThread(),
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              has_images,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              message.obj());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::DocumentHasImages(JNIEnv* env, jobject obj, jobject message) {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaGlobalRef<jobject> j_message;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  j_message.Reset(env, message);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host_ext_->DocumentHasImages(
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&DocumentHasImagesCallback, j_message));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GenerateMHTMLCallback(ScopedJavaGlobalRef<jobject>* callback,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const base::FilePath& path, int64 size) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Android files are UTF8, so the path conversion below is safe.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_AwContents_generateMHTMLCallback(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, path.AsUTF8Unsafe()).obj(),
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size, callback->obj());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::GenerateMHTML(JNIEnv* env, jobject obj,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jstring jpath, jobject callback) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaGlobalRef<jobject>* j_callback = new ScopedJavaGlobalRef<jobject>();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  j_callback->Reset(env, callback);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GenerateMHTML(
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(ConvertJavaStringToUTF8(env, jpath)),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&GenerateMHTMLCallback, base::Owned(j_callback)));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// START: Printing fork b/10190508
3975d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunvoid AwContents::CreatePdfExporter(JNIEnv* env,
3985d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun                                   jobject obj,
3995d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun                                   jobject pdfExporter) {
4005d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
4015d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  pdf_exporter_.reset(
402f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      new AwPdfExporter(env,
403f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                        pdfExporter,
404f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                        browser_view_renderer_.get(),
405f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                        web_contents_.get()));
4065d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
4075d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// END: Printing fork b/10190508
4085d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AwContents::OnReceivedHttpAuthRequest(const JavaRef<jobject>& handler,
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const std::string& host,
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const std::string& realm) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jhost = ConvertUTF8ToJavaString(env, host);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jrealm = ConvertUTF8ToJavaString(env, realm);
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AwContents_onReceivedHttpAuthRequest(env, obj.obj(), handler.obj(),
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jhost.obj(), jrealm.obj());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::AddVisitedLinks(JNIEnv* env,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   jobject obj,
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   jobjectArray jvisited_links) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<string16> visited_link_strings;
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::AppendJavaStringArrayToStringVector(
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, jvisited_links, &visited_link_strings);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<GURL> visited_link_gurls;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<string16>::const_iterator itr = visited_link_strings.begin();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       itr != visited_link_strings.end();
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++itr) {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    visited_link_gurls.push_back(GURL(*itr));
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwBrowserContext::FromWebContents(web_contents_.get())
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ->AddVisitedURLs(visited_link_gurls);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterAwContents(JNIEnv* env) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env) >= 0;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowGeolocationPromptHelperTask(const JavaObjectWeakGlobalRef& java_ref,
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const GURL& origin) {
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> j_ref = java_ref.get(env);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (j_ref.obj()) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedJavaLocalRef<jstring> j_origin(
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ConvertUTF8ToJavaString(env, origin.spec()));
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Java_AwContents_onGeolocationPermissionsShowPrompt(env,
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       j_ref.obj(),
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       j_origin.obj());
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowGeolocationPromptHelper(const JavaObjectWeakGlobalRef& java_ref,
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const GURL& origin) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (java_ref.get(env).obj()) {
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::BrowserThread::PostTask(
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::BrowserThread::UI,
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&ShowGeolocationPromptHelperTask,
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   java_ref,
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   origin));
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // anonymous namespace
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::ShowGeolocationPrompt(const GURL& requesting_frame,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       base::Callback<void(bool)> callback) {
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL origin = requesting_frame.GetOrigin();
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_prompt = pending_geolocation_prompts_.empty();
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_geolocation_prompts_.push_back(OriginCallback(origin, callback));
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_prompt) {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowGeolocationPromptHelper(java_ref_, origin);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Invoked from Java
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::InvokeGeolocationCallback(JNIEnv* env,
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           jobject obj,
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           jboolean value,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           jstring origin) {
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL callback_origin(base::android::ConvertJavaStringToUTF16(env, origin));
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (callback_origin.GetOrigin() ==
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_geolocation_prompts_.front().first) {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_geolocation_prompts_.front().second.Run(value);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_geolocation_prompts_.pop_front();
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!pending_geolocation_prompts_.empty()) {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowGeolocationPromptHelper(java_ref_,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  pending_geolocation_prompts_.front().first);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::HideGeolocationPrompt(const GURL& origin) {
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool removed_current_outstanding_callback = false;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<OriginCallback>::iterator it = pending_geolocation_prompts_.begin();
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (it != pending_geolocation_prompts_.end()) {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((*it).first == origin.GetOrigin()) {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (it == pending_geolocation_prompts_.begin()) {
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        removed_current_outstanding_callback = true;
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      it = pending_geolocation_prompts_.erase(it);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++it;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (removed_current_outstanding_callback) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env = AttachCurrentThread();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedJavaLocalRef<jobject> j_ref = java_ref_.get(env);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (j_ref.obj()) {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_AwContents_onGeolocationPermissionsHidePrompt(env, j_ref.obj());
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!pending_geolocation_prompts_.empty()) {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowGeolocationPromptHelper(java_ref_,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            pending_geolocation_prompts_.front().first);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::FindAllAsync(JNIEnv* env, jobject obj, jstring search_string) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::FindNext(JNIEnv* env, jobject obj, jboolean forward) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFindHelper()->FindNext(forward);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::ClearMatches(JNIEnv* env, jobject obj) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFindHelper()->ClearMatches();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::ClearCache(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject obj,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jboolean include_disk_files) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host_ext_->ClearCache();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (include_disk_files) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveHttpDiskCache(web_contents_->GetBrowserContext(),
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        web_contents_->GetRoutingID());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FindHelper* AwContents::GetFindHelper() {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!find_helper_.get()) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    find_helper_.reset(new FindHelper(web_contents_.get()));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    find_helper_->SetListener(this);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return find_helper_.get();
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::OnFindResultReceived(int active_ordinal,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int match_count,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool finished) {
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;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_AwContents_onFindResultReceived(
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(), active_ordinal, match_count, finished);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
576ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdochbool AwContents::ShouldDownloadFavicon(const GURL& icon_url) {
577ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch  return g_should_download_favicons;
578ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch}
579ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch
580ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AwContents::OnReceivedIcon(const GURL& icon_url, const SkBitmap& bitmap) {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::NavigationEntry* entry =
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetController().GetActiveEntry();
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
589ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (entry) {
590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    entry->GetFavicon().valid = true;
591ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    entry->GetFavicon().url = icon_url;
592ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    entry->GetFavicon().image = gfx::Image::CreateFrom1xBitmap(bitmap);
593ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Java_AwContents_onReceivedIcon(
596ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      env, obj.obj(), gfx::ConvertToJavaBitmap(&bitmap).obj());
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::OnReceivedTouchIconUrl(const std::string& url,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool precomposed) {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AwContents_onReceivedTouchIconUrl(
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed);
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AwContents::RequestDrawGL(jobject canvas) {
611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (obj.is_null())
6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return false;
6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return Java_AwContents_requestDrawGL(env, obj.obj(), canvas);
616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AwContents::PostInvalidate() {
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!obj.is_null())
6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Java_AwContents_postInvalidateOnAnimation(env, obj.obj());
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void AwContents::UpdateGlobalVisibleRect() {
626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!obj.is_null())
629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Java_AwContents_updateGlobalVisibleRect(env, obj.obj());
630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwContents::OnNewPicture() {
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!obj.is_null())
636b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    Java_AwContents_onNewPicture(env, obj.obj());
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::android::ScopedJavaLocalRef<jbyteArray>
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AwContents::GetCertificate(JNIEnv* env,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobject obj) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NavigationEntry* entry =
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetController().GetActiveEntry();
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ScopedJavaLocalRef<jbyteArray>();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the certificate
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cert_id = entry->GetSSL().cert_id;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::X509Certificate> cert;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ok = content::CertStore::GetInstance()->RetrieveCert(cert_id, &cert);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ok)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ScopedJavaLocalRef<jbyteArray>();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert the certificate and return it
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string der_string;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_string);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::android::ToJavaByteArray(env,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const uint8*>(der_string.data()), der_string.length());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AwContents::RequestNewHitTestDataAt(JNIEnv* env, jobject obj,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         jint x, jint y) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host_ext_->RequestNewHitTestDataAt(x, y);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::UpdateLastHitTestData(JNIEnv* env, jobject obj) {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host_ext_->HasNewHitTestData()) return;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AwHitTestData& data = render_view_host_ext_->GetLastHitTestData();
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_host_ext_->MarkHitTestDataRead();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure to null the Java object if data is empty/invalid.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> extra_data_for_type;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.extra_data_for_type.length())
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra_data_for_type = ConvertUTF8ToJavaString(
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        env, data.extra_data_for_type);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> href;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.href.length())
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    href = ConvertUTF16ToJavaString(env, data.href);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> anchor_text;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.anchor_text.length())
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    anchor_text = ConvertUTF16ToJavaString(env, data.anchor_text);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> img_src;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.img_src.is_valid())
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img_src = ConvertUTF8ToJavaString(env, data.img_src.spec());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AwContents_updateHitTestData(env,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    obj,
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    data.type,
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    extra_data_for_type.obj(),
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    href.obj(),
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    anchor_text.obj(),
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    img_src.obj());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::OnSizeChanged(JNIEnv* env, jobject obj,
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               int w, int h, int ow, int oh) {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_view_renderer_->OnSizeChanged(w, h);
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
703f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)void AwContents::SetViewVisibility(JNIEnv* env, jobject obj, bool visible) {
704f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)  browser_view_renderer_->SetViewVisibility(visible);
705f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)}
706f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)
707f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)void AwContents::SetWindowVisibility(JNIEnv* env, jobject obj, bool visible) {
708f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)  browser_view_renderer_->SetWindowVisibility(visible);
709f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)}
710f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)
711f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)void AwContents::SetIsPaused(JNIEnv* env, jobject obj, bool paused) {
712f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)  browser_view_renderer_->SetIsPaused(paused);
713c155a8319c5ef18219fdabf886505cd79c3ae21aJonathan Dixon  if (paused) {
714c155a8319c5ef18219fdabf886505cd79c3ae21aJonathan Dixon    ContentViewCore* cvc =
715c155a8319c5ef18219fdabf886505cd79c3ae21aJonathan Dixon        ContentViewCore::FromWebContents(web_contents_.get());
716c155a8319c5ef18219fdabf886505cd79c3ae21aJonathan Dixon    if (cvc)
7173ffc7ae741780a15b34876d44c5e280dafd9d135Ben Murdoch      cvc->PauseVideo();
7183ffc7ae741780a15b34876d44c5e280dafd9d135Ben Murdoch  }
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_view_renderer_->OnAttachedToWindow(w, h);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_view_renderer_->OnDetachedFromWindow();
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::android::ScopedJavaLocalRef<jbyteArray>
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContents::GetOpaqueState(JNIEnv* env, jobject obj) {
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Required optimization in WebViewClassic to not save any state if
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // there has been no navigations.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetController().GetEntryCount())
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ScopedJavaLocalRef<jbyteArray>();
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!WriteToPickle(*web_contents_, &pickle)) {
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ScopedJavaLocalRef<jbyteArray>();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return base::android::ToJavaByteArray(env,
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       reinterpret_cast<const uint8*>(pickle.data()), pickle.size());
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jboolean AwContents::RestoreFromOpaqueState(
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env, jobject obj, jbyteArray state) {
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(boliu): This copy can be optimized out if this is a performance
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // problem.
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<uint8> state_vector;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::JavaByteArrayToByteVector(env, state, &state_vector);
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle(reinterpret_cast<const char*>(state_vector.begin()),
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                state_vector.size());
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iterator(pickle);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RestoreFromPickle(&iterator, web_contents_.get());
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AwContents::OnDraw(JNIEnv* env,
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        jobject obj,
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        jobject canvas,
7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jboolean is_hardware_accelerated,
7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jint scroll_x,
7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jint scroll_y,
7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jint clip_left,
7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jint clip_top,
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        jint clip_right,
768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                        jint clip_bottom) {
76958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  return browser_view_renderer_->OnDraw(
77058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      canvas,
77158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      is_hardware_accelerated,
77258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      gfx::Vector2d(scroll_x, scroll_y),
77358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      gfx::Rect(
774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top));
775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void AwContents::SetGlobalVisibleRect(JNIEnv* env,
778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      jobject obj,
779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      jint visible_left,
780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      jint visible_top,
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      jint visible_right,
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      jint visible_bottom) {
783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  browser_view_renderer_->SetGlobalVisibleRect(
78458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      gfx::Rect(visible_left,
78558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                visible_top,
78658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                visible_right - visible_left,
78758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                visible_bottom - visible_top));
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::SetPendingWebContentsForPopup(
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<content::WebContents> pending) {
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pending_contents_.get()) {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(benm): Support holding multiple pop up window requests.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Blocking popup window creation as an outstanding "
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 << "popup window is still pending.";
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->DeleteSoon(FROM_HERE, pending.release());
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pending_contents_.reset(new AwContents(pending.Pass()));
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::FocusFirstNode(JNIEnv* env, jobject obj) {
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents_->FocusThroughTabTraversal(false);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
806a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid AwContents::SetBackgroundColor(JNIEnv* env, jobject obj, jint color) {
807a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  render_view_host_ext_->SetBackgroundColor(color);
808a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
809a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)jint AwContents::ReleasePopupAwContents(JNIEnv* env, jobject obj) {
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return reinterpret_cast<jint>(pending_contents_.release());
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Point AwContents::GetLocationOnScreen() {
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.is_null())
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Point();
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> location;
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::JavaIntArrayToIntVector(
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env,
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Java_AwContents_getLocationOnScreen(env, obj.obj()).obj(),
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &location);
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Point(location[0], location[1]);
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
827cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosibavoid AwContents::SetMaxContainerViewScrollOffset(gfx::Vector2d new_value) {
828cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  JNIEnv* env = AttachCurrentThread();
829cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
830cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  if (obj.is_null())
831cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba    return;
832cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  Java_AwContents_setMaxContainerViewScrollOffset(
833cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba      env, obj.obj(), new_value.x(), new_value.y());
834cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba}
835cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AwContents::ScrollContainerViewTo(gfx::Vector2d new_value) {
837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  JNIEnv* env = AttachCurrentThread();
838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (obj.is_null())
840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Java_AwContents_scrollContainerViewTo(
842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      env, obj.obj(), new_value.x(), new_value.y());
843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84574e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Eliasbool AwContents::IsFlingActive() const {
84674e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias  JNIEnv* env = AttachCurrentThread();
84774e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
84874e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias  if (obj.is_null())
84974e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias    return false;
85074e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias  return Java_AwContents_isFlingActive(env, obj.obj());
85174e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias}
85274e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias
853cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosibavoid AwContents::SetPageScaleFactor(float page_scale_factor) {
854cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  JNIEnv* env = AttachCurrentThread();
855cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
856cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  if (obj.is_null())
857cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba    return;
858cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  Java_AwContents_setPageScaleFactor(env, obj.obj(), page_scale_factor);
859cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba}
860cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba
861cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosibavoid AwContents::SetContentsSize(gfx::SizeF contents_size_dip) {
862cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  JNIEnv* env = AttachCurrentThread();
863cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
864cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  if (obj.is_null())
865cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba    return;
866cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  Java_AwContents_setContentsSize(
867cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba      env, obj.obj(), contents_size_dip.width(), contents_size_dip.height());
868cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba}
869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AwContents::DidOverscroll(gfx::Vector2d overscroll_delta) {
8717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  JNIEnv* env = AttachCurrentThread();
8727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (obj.is_null())
8747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
8757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_AwContents_didOverscroll(
8767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      env, obj.obj(), overscroll_delta.x(), overscroll_delta.y());
8777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
8787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
879fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosibavoid AwContents::SetDipScale(JNIEnv* env, jobject obj, jfloat dip_scale) {
880fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba  browser_view_renderer_->SetDipScale(dip_scale);
881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
883fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosibavoid AwContents::SetFixedLayoutSize(JNIEnv* env,
884fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba                                    jobject obj,
885fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba                                    jint width_dip,
886fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba                                    jint height_dip) {
887fe6178dcfbd04cfd6b65eab8deb6f64cf0177454Martin Kosiba  render_view_host_ext_->SetFixedLayoutSize(gfx::Size(width_dip, height_dip));
8887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
8897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
890cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosibavoid AwContents::ScrollTo(JNIEnv* env, jobject obj, jint x, jint y) {
891cd84519d1edac18225f4c58013254ee11d1a8eacMartin Kosiba  browser_view_renderer_->ScrollTo(gfx::Vector2d(x, y));
892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
893eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AwContents::OnWebLayoutPageScaleFactorChanged(float page_scale_factor) {
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.is_null())
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
8997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_AwContents_onWebLayoutPageScaleFactorChanged(env, obj.obj(),
9007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                         page_scale_factor);
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9034d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosibavoid AwContents::OnWebLayoutContentsSizeChanged(
9044d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba    const gfx::Size& contents_size) {
9054d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba  JNIEnv* env = AttachCurrentThread();
9064d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
9074d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba  if (obj.is_null())
9084d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba    return;
9094d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba  Java_AwContents_onWebLayoutContentsSizeChanged(
9104d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba      env, obj.obj(), contents_size.width(), contents_size.height());
9114d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba}
9124d9f1c5c0093589a3f3f112641bf9c80442391a0Martin Kosiba
9134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochjint AwContents::CapturePicture(JNIEnv* env,
9144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                jobject obj,
9154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                int width,
9164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                int height) {
9174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return reinterpret_cast<jint>(new AwPicture(
9184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      browser_view_renderer_->CapturePicture(width, height)));
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContents::EnableOnNewPicture(JNIEnv* env,
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    jobject obj,
923b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                    jboolean enabled) {
924b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  browser_view_renderer_->EnableOnNewPicture(enabled);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
927bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)void AwContents::SetJsOnlineProperty(JNIEnv* env,
928bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)                                     jobject obj,
929bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)                                     jboolean network_up) {
930bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)  render_view_host_ext_->SetJsOnlineProperty(network_up);
931bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)}
932bfebf9c5f0206a13e1fdcf6343cc432a1d5fe776Torne (Richard Coles)
9337211bb133f06cafe148e28f08fbfe0b90c4b1b78boliu@chromium.orgvoid AwContents::TrimMemory(JNIEnv* env, jobject obj, jint level) {
9347211bb133f06cafe148e28f08fbfe0b90c4b1b78boliu@chromium.org  browser_view_renderer_->TrimMemory(level);
9357211bb133f06cafe148e28f08fbfe0b90c4b1b78boliu@chromium.org}
9367211bb133f06cafe148e28f08fbfe0b90c4b1b78boliu@chromium.org
937ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdochvoid SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
938ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch  g_should_download_favicons = true;
939ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch}
940ba6679d8642a829a648af7086fd7b6d0ee005981Ben Murdoch
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android_webview
942