Index: content/browser/android/content_view_core_impl.cc |
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc |
index d0e5bd2aee2cfa46819d05aa64ba972f8919d543..c5624af8bffbef3d365106469f7cdf0fc2b8fdae 100644 |
--- a/content/browser/android/content_view_core_impl.cc |
+++ b/content/browser/android/content_view_core_impl.cc |
@@ -8,6 +8,7 @@ |
#include "base/android/jni_array.h" |
#include "base/android/jni_string.h" |
#include "base/android/scoped_java_ref.h" |
+#include "base/json/json_writer.h" |
#include "content/browser/android/content_view_client.h" |
#include "content/browser/android/touch_point.h" |
#include "content/browser/renderer_host/java/java_bound_object.h" |
@@ -18,6 +19,10 @@ |
#include "content/browser/web_contents/navigation_controller_impl.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/browser/interstitial_page.h" |
+#include "content/public/browser/notification_details.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_source.h" |
+#include "content/public/browser/notification_types.h" |
#include "content/public/browser/web_contents.h" |
#include "jni/ContentViewCore_jni.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" |
@@ -82,9 +87,17 @@ ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj, |
"A ContentViewCoreImpl should be created with a valid WebContents."; |
InitJNI(env, obj); |
+ |
+ notification_registrar_.Add(this, |
+ NOTIFICATION_EXECUTE_JAVASCRIPT_RESULT, |
+ NotificationService::AllSources()); |
} |
ContentViewCoreImpl::~ContentViewCoreImpl() { |
+ // Make sure nobody calls back into this object while we are tearing things |
+ // down. |
+ notification_registrar_.RemoveAll(); |
+ |
if (java_object_) { |
JNIEnv* env = AttachCurrentThread(); |
env->DeleteWeakGlobalRef(java_object_->obj); |
@@ -100,6 +113,27 @@ void ContentViewCoreImpl::Destroy(JNIEnv* env, jobject obj) { |
void ContentViewCoreImpl::Observe(int type, |
const NotificationSource& source, |
const NotificationDetails& details) { |
+ switch (type) { |
+ case NOTIFICATION_EXECUTE_JAVASCRIPT_RESULT: { |
+ if (!web_contents_ || Source<RenderViewHost>(source).ptr() != |
+ web_contents_->GetRenderViewHost()) { |
+ return; |
+ } |
+ |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ std::pair<int, Value*>* result_pair = |
+ Details<std::pair<int, Value*> >(details).ptr(); |
+ std::string json; |
+ base::JSONWriter::Write(result_pair->second, &json); |
+ ScopedJavaLocalRef<jstring> j_json = ConvertUTF8ToJavaString(env, |
+ json); |
+ Java_ContentViewCore_onEvaluateJavaScriptResult(env, |
+ java_object_->View(env).obj(), |
+ static_cast<jint>(result_pair->first), j_json.obj()); |
+ break; |
+ } |
+ } |
+ |
// TODO(jrg) |
} |
@@ -139,6 +173,16 @@ void ContentViewCoreImpl::SelectPopupMenuItems(JNIEnv* env, jobject obj, |
rvhi->DidSelectPopupMenuItems(selected_indices); |
} |
+jint ContentViewCoreImpl::EvaluateJavaScript(JNIEnv* env, jobject obj, |
+ jstring script) { |
+ RenderViewHost* host = web_contents_->GetRenderViewHost(); |
+ DCHECK(host); |
jam
2012/07/31 18:20:44
nit: unnecessary, if null will crash right below
David Trainor- moved to gerrit
2012/07/31 20:38:47
Done.
|
+ |
+ string16 script_utf16 = ConvertJavaStringToUTF16(env, script); |
+ return host->ExecuteJavascriptInWebFrameNotifyResult(string16(), |
+ script_utf16); |
+} |
+ |
void ContentViewCoreImpl::LoadUrlWithoutUrlSanitization(JNIEnv* env, |
jobject, |
jstring jurl, |
@@ -401,6 +445,15 @@ jint Init(JNIEnv* env, jobject obj, jint native_web_contents) { |
return reinterpret_cast<jint>(view); |
} |
+jint EvaluateJavaScript(JNIEnv* env, jobject obj, jstring script) { |
+ ContentViewCoreImpl* view = |
+ (ContentViewCoreImpl*) ContentViewCore::GetNativeContentViewCore(env, |
jam
2012/07/31 18:20:44
google style is to not use c style casts. so use s
David Trainor- moved to gerrit
2012/07/31 20:38:47
Done.
|
+ obj); |
+ DCHECK(view); |
jam
2012/07/31 18:20:44
ditto
David Trainor- moved to gerrit
2012/07/31 20:38:47
Done.
|
+ |
+ return view->EvaluateJavaScript(env, obj, script); |
+} |
+ |
// -------------------------------------------------------------------------- |
// Public methods that call to Java via JNI |
// -------------------------------------------------------------------------- |