Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(371)

Side by Side Diff: android_webview/native/aw_contents.cc

Issue 10941015: [Android] Upstream the WebView find-in-page API implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nit fixes. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | android_webview/native/aw_web_contents_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | android_webview/native/aw_web_contents_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698