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

Unified 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: review fixes + command line switch for synchronous APIs 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 side-by-side diff with in-line comments
Download patch
Index: android_webview/native/aw_contents.cc
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 4b21b58ad41d661d954f876094bb9ad87adbbfb0..e902ddfebc47768938cedf8787d00cecfea43476 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -20,6 +20,7 @@
#include "jni/AwContents_jni.h"
using base::android::AttachCurrentThread;
+using base::android::ConvertJavaStringToUTF16;
using base::android::ConvertUTF8ToJavaString;
using base::android::ConvertUTF16ToJavaString;
using base::android::ScopedJavaGlobalRef;
@@ -37,7 +38,14 @@ const void* kAwContentsUserDataKey = &kAwContentsUserDataKey;
class AwContentsUserData : public base::SupportsUserData::Data {
public:
AwContentsUserData(AwContents* ptr) : contents_(ptr) {}
- AwContents* get() { return contents_; }
+
+ static AwContents* GetContents(WebContents* web_contents) {
+ if (!web_contents)
+ return NULL;
+ AwContentsUserData* data = reinterpret_cast<AwContentsUserData*>(
+ web_contents->GetUserData(kAwContentsUserDataKey));
+ return data ? data->contents_ : NULL;
+ }
private:
AwContents* contents_;
@@ -46,13 +54,8 @@ class AwContentsUserData : public base::SupportsUserData::Data {
} // namespace
// static
-AwContents* AwContents::FromWebContents(content::WebContents* web_contents) {
- if (web_contents) {
- AwContentsUserData* data = reinterpret_cast<AwContentsUserData*>(
- web_contents->GetUserData(kAwContentsUserDataKey));
- if (data) return data->get();
- }
- return NULL;
+AwContents* AwContents::FromWebContents(WebContents* web_contents) {
+ return AwContentsUserData::GetContents(web_contents);
}
AwContents::AwContents(JNIEnv* env,
@@ -64,22 +67,28 @@ AwContents::AwContents(JNIEnv* env,
new AwWebContentsDelegate(env, web_contents_delegate)) {
android_webview::AwBrowserDependencyFactory* dependency_factory =
android_webview::AwBrowserDependencyFactory::GetInstance();
- content::WebContents* web_contents =
+
+ WebContents* web_contents =
dependency_factory->CreateWebContents(private_browsing);
+
+ DCHECK(!AwContents::FromWebContents(web_contents));
+ web_contents->SetUserData(kAwContentsUserDataKey,
+ new AwContentsUserData(this));
+
contents_container_.reset(dependency_factory->CreateContentsContainer(
web_contents));
web_contents->SetDelegate(web_contents_delegate_.get());
web_contents_delegate_->SetJavaScriptDialogCreator(
dependency_factory->GetJavaScriptDialogCreator());
- web_contents->SetUserData(kAwContentsUserDataKey,
- new AwContentsUserData(this));
render_view_host_ext_.reset(new AwRenderViewHostExt(web_contents));
}
AwContents::~AwContents() {
- content::WebContents* web_contents = contents_container_->GetWebContents();
+ WebContents* web_contents = contents_container_->GetWebContents();
DCHECK(AwContents::FromWebContents(web_contents) == this);
web_contents->RemoveUserData(kAwContentsUserDataKey);
+ if (find_helper_.get())
+ find_helper_->SetListener(NULL);
}
jint AwContents::GetWebContents(JNIEnv* env, jobject obj) {
@@ -161,5 +170,42 @@ bool RegisterAwContents(JNIEnv* env) {
return RegisterNativesImpl(env) >= 0;
}
+jint AwContents::FindAllSync(JNIEnv* env, jobject obj, jstring search_string) {
+ return GetFindHelper()->FindAllSync(
+ ConvertJavaStringToUTF16(env, search_string));
+}
+
+void AwContents::FindAllAsync(JNIEnv* env, jobject obj, jstring search_string) {
+ GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string));
+}
+
+void AwContents::FindNext(JNIEnv* env, jobject obj, jboolean forward) {
+ GetFindHelper()->FindNext(forward);
+}
+
+void AwContents::ClearMatches(JNIEnv* env, jobject obj) {
+ GetFindHelper()->ClearMatches();
+}
+
+FindHelper* AwContents::GetFindHelper() {
+ if (!find_helper_.get()) {
+ WebContents* web_contents = contents_container_->GetWebContents();
+ find_helper_.reset(new FindHelper(web_contents));
+ find_helper_->SetListener(this);
+ }
+ return find_helper_.get();
+}
+
+void AwContents::OnFindResultReceived(int active_ordinal,
+ int match_count,
+ bool finished) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+ if (obj.is_null())
+ return;
+
+ Java_AwContents_onFindResultReceived(
+ env, obj.obj(), active_ordinal, match_count, finished);
+}
} // namespace android_webview

Powered by Google App Engine
This is Rietveld 408576698