| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/native/aw_contents.h" | 5 #include "android_webview/native/aw_contents.h" |
| 6 | 6 |
| 7 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h" | 7 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h" |
| 8 #include "android_webview/native/aw_browser_dependency_factory.h" | 8 #include "android_webview/native/aw_browser_dependency_factory.h" |
| 9 #include "android_webview/native/aw_contents_container.h" | 9 #include "android_webview/native/aw_contents_container.h" |
| 10 #include "android_webview/native/aw_web_contents_delegate.h" | 10 #include "android_webview/native/aw_web_contents_delegate.h" |
| 11 #include "android_webview/native/aw_contents_io_thread_client.h" | 11 #include "android_webview/native/aw_contents_io_thread_client.h" |
| 12 #include "base/android/jni_android.h" | 12 #include "base/android/jni_android.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/callback.h" | 15 #include "base/callback.h" |
| 16 #include "base/supports_user_data.h" | 16 #include "base/supports_user_data.h" |
| 17 #include "content/public/browser/android/content_view_core.h" | 17 #include "content/public/browser/android/content_view_core.h" |
| 18 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| 19 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
| 20 #include "jni/AwContents_jni.h" | 20 #include "jni/AwContents_jni.h" |
| 21 | 21 |
| 22 using base::android::AttachCurrentThread; | 22 using base::android::AttachCurrentThread; |
| 23 using base::android::ConvertJavaStringToUTF16; |
| 24 using base::android::ConvertJavaStringToUTF8; |
| 23 using base::android::ConvertUTF16ToJavaString; | 25 using base::android::ConvertUTF16ToJavaString; |
| 24 using base::android::ConvertUTF8ToJavaString; | 26 using base::android::ConvertUTF8ToJavaString; |
| 27 using base::android::JavaRef; |
| 25 using base::android::ScopedJavaGlobalRef; | 28 using base::android::ScopedJavaGlobalRef; |
| 26 using base::android::ScopedJavaLocalRef; | 29 using base::android::ScopedJavaLocalRef; |
| 27 using content::BrowserThread; | 30 using content::BrowserThread; |
| 28 using content::ContentViewCore; | 31 using content::ContentViewCore; |
| 29 using content::WebContents; | 32 using content::WebContents; |
| 30 | 33 |
| 31 namespace android_webview { | 34 namespace android_webview { |
| 32 | 35 |
| 33 namespace { | 36 namespace { |
| 34 | 37 |
| 35 const void* kAwContentsUserDataKey = &kAwContentsUserDataKey; | 38 const void* kAwContentsUserDataKey = &kAwContentsUserDataKey; |
| 36 | 39 |
| 37 class AwContentsUserData : public base::SupportsUserData::Data { | 40 class AwContentsUserData : public base::SupportsUserData::Data { |
| 38 public: | 41 public: |
| 39 AwContentsUserData(AwContents* ptr) : contents_(ptr) {} | 42 AwContentsUserData(AwContents* ptr) : contents_(ptr) {} |
| 40 AwContents* get() { return contents_; } | 43 |
| 44 static AwContents* GetContents(WebContents* web_contents) { |
| 45 if (!web_contents) |
| 46 return NULL; |
| 47 AwContentsUserData* data = reinterpret_cast<AwContentsUserData*>( |
| 48 web_contents->GetUserData(kAwContentsUserDataKey)); |
| 49 return data ? data->contents_ : NULL; |
| 50 } |
| 41 | 51 |
| 42 private: | 52 private: |
| 43 AwContents* contents_; | 53 AwContents* contents_; |
| 44 }; | 54 }; |
| 45 | 55 |
| 46 } // namespace | 56 } // namespace |
| 47 | 57 |
| 48 // static | 58 // static |
| 49 AwContents* AwContents::FromWebContents(content::WebContents* web_contents) { | 59 AwContents* AwContents::FromWebContents(WebContents* web_contents) { |
| 50 if (web_contents) { | 60 return AwContentsUserData::GetContents(web_contents); |
| 51 AwContentsUserData* data = reinterpret_cast<AwContentsUserData*>( | |
| 52 web_contents->GetUserData(kAwContentsUserDataKey)); | |
| 53 if (data) return data->get(); | |
| 54 } | |
| 55 return NULL; | |
| 56 } | 61 } |
| 57 | 62 |
| 58 AwContents::AwContents(JNIEnv* env, | 63 AwContents::AwContents(JNIEnv* env, |
| 59 jobject obj, | 64 jobject obj, |
| 60 jobject web_contents_delegate, | 65 jobject web_contents_delegate, |
| 61 bool private_browsing) | 66 bool private_browsing) |
| 62 : java_ref_(env, obj), | 67 : java_ref_(env, obj), |
| 63 web_contents_delegate_( | 68 web_contents_delegate_( |
| 64 new AwWebContentsDelegate(env, web_contents_delegate)) { | 69 new AwWebContentsDelegate(env, web_contents_delegate)) { |
| 65 android_webview::AwBrowserDependencyFactory* dependency_factory = | 70 android_webview::AwBrowserDependencyFactory* dependency_factory = |
| 66 android_webview::AwBrowserDependencyFactory::GetInstance(); | 71 android_webview::AwBrowserDependencyFactory::GetInstance(); |
| 67 content::WebContents* web_contents = | 72 |
| 73 WebContents* web_contents = |
| 68 dependency_factory->CreateWebContents(private_browsing); | 74 dependency_factory->CreateWebContents(private_browsing); |
| 75 |
| 76 DCHECK(!AwContents::FromWebContents(web_contents)); |
| 77 web_contents->SetUserData(kAwContentsUserDataKey, |
| 78 new AwContentsUserData(this)); |
| 79 |
| 69 contents_container_.reset(dependency_factory->CreateContentsContainer( | 80 contents_container_.reset(dependency_factory->CreateContentsContainer( |
| 70 web_contents)); | 81 web_contents)); |
| 71 web_contents->SetDelegate(web_contents_delegate_.get()); | 82 web_contents->SetDelegate(web_contents_delegate_.get()); |
| 72 web_contents->SetUserData(kAwContentsUserDataKey, | |
| 73 new AwContentsUserData(this)); | |
| 74 render_view_host_ext_.reset(new AwRenderViewHostExt(web_contents)); | 83 render_view_host_ext_.reset(new AwRenderViewHostExt(web_contents)); |
| 75 } | 84 } |
| 76 | 85 |
| 77 AwContents::~AwContents() { | 86 AwContents::~AwContents() { |
| 78 content::WebContents* web_contents = contents_container_->GetWebContents(); | 87 WebContents* web_contents = contents_container_->GetWebContents(); |
| 79 DCHECK(AwContents::FromWebContents(web_contents) == this); | 88 DCHECK(AwContents::FromWebContents(web_contents) == this); |
| 80 web_contents->RemoveUserData(kAwContentsUserDataKey); | 89 web_contents->RemoveUserData(kAwContentsUserDataKey); |
| 90 if (find_helper_.get()) |
| 91 find_helper_->SetListener(NULL); |
| 81 } | 92 } |
| 82 | 93 |
| 83 jint AwContents::GetWebContents(JNIEnv* env, jobject obj) { | 94 jint AwContents::GetWebContents(JNIEnv* env, jobject obj) { |
| 84 return reinterpret_cast<jint>(contents_container_->GetWebContents()); | 95 return reinterpret_cast<jint>(contents_container_->GetWebContents()); |
| 85 } | 96 } |
| 86 | 97 |
| 87 void AwContents::Destroy(JNIEnv* env, jobject obj) { | 98 void AwContents::Destroy(JNIEnv* env, jobject obj) { |
| 88 delete this; | 99 delete this; |
| 89 } | 100 } |
| 90 | 101 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 106 base::Bind(&DocumentHasImagesCallback, base::Owned(j_message))); | 117 base::Bind(&DocumentHasImagesCallback, base::Owned(j_message))); |
| 107 } | 118 } |
| 108 | 119 |
| 109 namespace { | 120 namespace { |
| 110 void GenerateMHTMLCallback(ScopedJavaGlobalRef<jobject>* callback, | 121 void GenerateMHTMLCallback(ScopedJavaGlobalRef<jobject>* callback, |
| 111 const FilePath& path, int64 size) { | 122 const FilePath& path, int64 size) { |
| 112 JNIEnv* env = AttachCurrentThread(); | 123 JNIEnv* env = AttachCurrentThread(); |
| 113 // Android files are UTF8, so the path conversion below is safe. | 124 // Android files are UTF8, so the path conversion below is safe. |
| 114 Java_AwContents_generateMHTMLCallback( | 125 Java_AwContents_generateMHTMLCallback( |
| 115 env, | 126 env, |
| 116 base::android::ConvertUTF8ToJavaString(env, path.AsUTF8Unsafe()).obj(), | 127 ConvertUTF8ToJavaString(env, path.AsUTF8Unsafe()).obj(), |
| 117 size, callback->obj()); | 128 size, callback->obj()); |
| 118 } | 129 } |
| 119 } // namespace | 130 } // namespace |
| 120 | 131 |
| 121 void AwContents::GenerateMHTML(JNIEnv* env, jobject obj, | 132 void AwContents::GenerateMHTML(JNIEnv* env, jobject obj, |
| 122 jstring jpath, jobject callback) { | 133 jstring jpath, jobject callback) { |
| 123 ScopedJavaGlobalRef<jobject>* j_callback = new ScopedJavaGlobalRef<jobject>(); | 134 ScopedJavaGlobalRef<jobject>* j_callback = new ScopedJavaGlobalRef<jobject>(); |
| 124 j_callback->Reset(env, callback); | 135 j_callback->Reset(env, callback); |
| 125 contents_container_->GetWebContents()->GenerateMHTML( | 136 contents_container_->GetWebContents()->GenerateMHTML( |
| 126 FilePath(base::android::ConvertJavaStringToUTF8(env, jpath)), | 137 FilePath(ConvertJavaStringToUTF8(env, jpath)), |
| 127 base::Bind(&GenerateMHTMLCallback, base::Owned(j_callback))); | 138 base::Bind(&GenerateMHTMLCallback, base::Owned(j_callback))); |
| 128 } | 139 } |
| 129 | 140 |
| 130 void AwContents::RunJavaScriptDialog( | 141 void AwContents::RunJavaScriptDialog( |
| 131 content::JavaScriptMessageType message_type, | 142 content::JavaScriptMessageType message_type, |
| 132 const GURL& origin_url, | 143 const GURL& origin_url, |
| 133 const string16& message_text, | 144 const string16& message_text, |
| 134 const string16& default_prompt_text, | 145 const string16& default_prompt_text, |
| 135 const base::android::ScopedJavaLocalRef<jobject>& js_result) { | 146 const ScopedJavaLocalRef<jobject>& js_result) { |
| 136 JNIEnv* env = base::android::AttachCurrentThread(); | 147 JNIEnv* env = AttachCurrentThread(); |
| 137 | 148 |
| 138 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 149 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 139 if (obj.is_null()) | 150 if (obj.is_null()) |
| 140 return; | 151 return; |
| 141 | 152 |
| 142 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( | 153 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( |
| 143 env, origin_url.spec())); | 154 env, origin_url.spec())); |
| 144 ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString( | 155 ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString( |
| 145 env, message_text)); | 156 env, message_text)); |
| 146 switch (message_type) { | 157 switch (message_type) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 161 break; | 172 break; |
| 162 } | 173 } |
| 163 default: | 174 default: |
| 164 NOTREACHED(); | 175 NOTREACHED(); |
| 165 } | 176 } |
| 166 } | 177 } |
| 167 | 178 |
| 168 void AwContents::RunBeforeUnloadDialog( | 179 void AwContents::RunBeforeUnloadDialog( |
| 169 const GURL& origin_url, | 180 const GURL& origin_url, |
| 170 const string16& message_text, | 181 const string16& message_text, |
| 171 const base::android::ScopedJavaLocalRef<jobject>& js_result) { | 182 const ScopedJavaLocalRef<jobject>& js_result) { |
| 172 JNIEnv* env = base::android::AttachCurrentThread(); | 183 JNIEnv* env = AttachCurrentThread(); |
| 173 | 184 |
| 174 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 185 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 175 if (obj.is_null()) | 186 if (obj.is_null()) |
| 176 return; | 187 return; |
| 177 | 188 |
| 178 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( | 189 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( |
| 179 env, origin_url.spec())); | 190 env, origin_url.spec())); |
| 180 ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString( | 191 ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString( |
| 181 env, message_text)); | 192 env, message_text)); |
| 182 Java_AwContents_handleJsBeforeUnload( | 193 Java_AwContents_handleJsBeforeUnload( |
| 183 env, obj.obj(), jurl.obj(), jmessage.obj(), js_result.obj()); | 194 env, obj.obj(), jurl.obj(), jmessage.obj(), js_result.obj()); |
| 184 } | 195 } |
| 185 | 196 |
| 186 void AwContents::onReceivedHttpAuthRequest( | 197 void AwContents::onReceivedHttpAuthRequest( |
| 187 const base::android::JavaRef<jobject>& handler, | 198 const JavaRef<jobject>& handler, |
| 188 const std::string& host, | 199 const std::string& host, |
| 189 const std::string& realm) { | 200 const std::string& realm) { |
| 190 JNIEnv* env = AttachCurrentThread(); | 201 JNIEnv* env = AttachCurrentThread(); |
| 191 ScopedJavaLocalRef<jstring> jhost = ConvertUTF8ToJavaString(env, host); | 202 ScopedJavaLocalRef<jstring> jhost = ConvertUTF8ToJavaString(env, host); |
| 192 ScopedJavaLocalRef<jstring> jrealm = ConvertUTF8ToJavaString(env, realm); | 203 ScopedJavaLocalRef<jstring> jrealm = ConvertUTF8ToJavaString(env, realm); |
| 193 Java_AwContents_onReceivedHttpAuthRequest(env, java_ref_.get(env).obj(), | 204 Java_AwContents_onReceivedHttpAuthRequest(env, java_ref_.get(env).obj(), |
| 194 handler.obj(), jhost.obj(), | 205 handler.obj(), jhost.obj(), |
| 195 jrealm.obj()); | 206 jrealm.obj()); |
| 196 } | 207 } |
| 197 | 208 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 208 jboolean private_browsing) { | 219 jboolean private_browsing) { |
| 209 AwContents* tab = new AwContents(env, obj, web_contents_delegate, | 220 AwContents* tab = new AwContents(env, obj, web_contents_delegate, |
| 210 private_browsing); | 221 private_browsing); |
| 211 return reinterpret_cast<jint>(tab); | 222 return reinterpret_cast<jint>(tab); |
| 212 } | 223 } |
| 213 | 224 |
| 214 bool RegisterAwContents(JNIEnv* env) { | 225 bool RegisterAwContents(JNIEnv* env) { |
| 215 return RegisterNativesImpl(env) >= 0; | 226 return RegisterNativesImpl(env) >= 0; |
| 216 } | 227 } |
| 217 | 228 |
| 229 jint AwContents::FindAllSync(JNIEnv* env, jobject obj, jstring search_string) { |
| 230 return GetFindHelper()->FindAllSync( |
| 231 ConvertJavaStringToUTF16(env, search_string)); |
| 232 } |
| 233 |
| 234 void AwContents::FindAllAsync(JNIEnv* env, jobject obj, jstring search_string) { |
| 235 GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string)); |
| 236 } |
| 237 |
| 238 void AwContents::FindNext(JNIEnv* env, jobject obj, jboolean forward) { |
| 239 GetFindHelper()->FindNext(forward); |
| 240 } |
| 241 |
| 242 void AwContents::ClearMatches(JNIEnv* env, jobject obj) { |
| 243 GetFindHelper()->ClearMatches(); |
| 244 } |
| 245 |
| 246 FindHelper* AwContents::GetFindHelper() { |
| 247 if (!find_helper_.get()) { |
| 248 WebContents* web_contents = contents_container_->GetWebContents(); |
| 249 find_helper_.reset(new FindHelper(web_contents)); |
| 250 find_helper_->SetListener(this); |
| 251 } |
| 252 return find_helper_.get(); |
| 253 } |
| 254 |
| 255 void AwContents::OnFindResultReceived(int active_ordinal, |
| 256 int match_count, |
| 257 bool finished) { |
| 258 JNIEnv* env = AttachCurrentThread(); |
| 259 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 260 if (obj.is_null()) |
| 261 return; |
| 262 |
| 263 Java_AwContents_onFindResultReceived( |
| 264 env, obj.obj(), active_ordinal, match_count, finished); |
| 265 } |
| 218 | 266 |
| 219 } // namespace android_webview | 267 } // namespace android_webview |
| OLD | NEW |