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

Side by Side Diff: content/browser/renderer_host/java/java_bound_object.cc

Issue 9584014: Remove env() getter from JavaRef<> (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: re-applied downstream patch after it was re-worked Created 8 years, 9 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
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 "content/browser/renderer_host/java/java_bound_object.h" 5 #include "content/browser/renderer_host/java/java_bound_object.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "base/string_number_conversions.h" 10 #include "base/string_number_conversions.h"
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 // The object is created with a ref count of one. 684 // The object is created with a ref count of one.
685 NPObject* np_object = WebBindings::createObject(0, const_cast<NPClass*>( 685 NPObject* np_object = WebBindings::createObject(0, const_cast<NPClass*>(
686 &JavaNPObject::kNPClass)); 686 &JavaNPObject::kNPClass));
687 // The NPObject takes ownership of the JavaBoundObject. 687 // The NPObject takes ownership of the JavaBoundObject.
688 reinterpret_cast<JavaNPObject*>(np_object)->bound_object = 688 reinterpret_cast<JavaNPObject*>(np_object)->bound_object =
689 new JavaBoundObject(object); 689 new JavaBoundObject(object);
690 return np_object; 690 return np_object;
691 } 691 }
692 692
693 JavaBoundObject::JavaBoundObject(const JavaRef<jobject>& object) 693 JavaBoundObject::JavaBoundObject(const JavaRef<jobject>& object)
694 : java_object_(object.env()->NewGlobalRef(object.obj())) { 694 : java_object_(object) {
695 // We don't do anything with our Java object when first created. We do it all 695 // We don't do anything with our Java object when first created. We do it all
696 // lazily when a method is first invoked. 696 // lazily when a method is first invoked.
697 } 697 }
698 698
699 JavaBoundObject::~JavaBoundObject() { 699 JavaBoundObject::~JavaBoundObject() {
700 // Use the current thread's JNI env to release our global ref to the Java
701 // object.
702 AttachCurrentThread()->DeleteGlobalRef(java_object_);
703 } 700 }
704 701
705 jobject JavaBoundObject::GetJavaObject(NPObject* object) { 702 jobject JavaBoundObject::GetJavaObject(NPObject* object) {
706 DCHECK_EQ(&JavaNPObject::kNPClass, object->_class); 703 DCHECK_EQ(&JavaNPObject::kNPClass, object->_class);
707 JavaBoundObject* jbo = reinterpret_cast<JavaNPObject*>(object)->bound_object; 704 JavaBoundObject* jbo = reinterpret_cast<JavaNPObject*>(object)->bound_object;
708 return jbo->java_object_; 705 return jbo->java_object_.obj();
709 } 706 }
710 707
711 bool JavaBoundObject::HasMethod(const std::string& name) const { 708 bool JavaBoundObject::HasMethod(const std::string& name) const {
712 EnsureMethodsAreSetUp(); 709 EnsureMethodsAreSetUp();
713 return methods_.find(name) != methods_.end(); 710 return methods_.find(name) != methods_.end();
714 } 711 }
715 712
716 bool JavaBoundObject::Invoke(const std::string& name, const NPVariant* args, 713 bool JavaBoundObject::Invoke(const std::string& name, const NPVariant* args,
717 size_t arg_count, NPVariant* result) { 714 size_t arg_count, NPVariant* result) {
718 EnsureMethodsAreSetUp(); 715 EnsureMethodsAreSetUp();
(...skipping 20 matching lines...) Expand all
739 736
740 // Coerce 737 // Coerce
741 std::vector<jvalue> parameters(arg_count); 738 std::vector<jvalue> parameters(arg_count);
742 for (size_t i = 0; i < arg_count; ++i) { 739 for (size_t i = 0; i < arg_count; ++i) {
743 parameters[i] = CoerceJavaScriptValueToJavaValue(args[i], 740 parameters[i] = CoerceJavaScriptValueToJavaValue(args[i],
744 method->parameter_type(i), 741 method->parameter_type(i),
745 true); 742 true);
746 } 743 }
747 744
748 // Call 745 // Call
749 *result = CallJNIMethod(java_object_, method->return_type(), method->id(), 746 *result = CallJNIMethod(java_object_.obj(), method->return_type(),
750 &parameters[0]); 747 method->id(), &parameters[0]);
751 return true; 748 return true;
752 } 749 }
753 750
754 void JavaBoundObject::EnsureMethodsAreSetUp() const { 751 void JavaBoundObject::EnsureMethodsAreSetUp() const {
755 if (!methods_.empty()) { 752 if (!methods_.empty()) {
756 return; 753 return;
757 } 754 }
758 755
759 JNIEnv* env = AttachCurrentThread(); 756 JNIEnv* env = AttachCurrentThread();
760 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>( 757 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>(
761 env->CallObjectMethod(java_object_, GetMethodIDFromClassName( 758 env->CallObjectMethod(java_object_.obj(), GetMethodIDFromClassName(
762 env, 759 env,
763 kJavaLangObject, 760 kJavaLangObject,
764 kGetClass, 761 kGetClass,
765 kReturningJavaLangClass)))); 762 kReturningJavaLangClass))));
766 ScopedJavaLocalRef<jobjectArray> methods(env, static_cast<jobjectArray>( 763 ScopedJavaLocalRef<jobjectArray> methods(env, static_cast<jobjectArray>(
767 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName( 764 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
768 env, 765 env,
769 kJavaLangClass, 766 kJavaLangClass,
770 kGetMethods, 767 kGetMethods,
771 kReturningJavaLangReflectMethodArray)))); 768 kReturningJavaLangReflectMethodArray))));
772 size_t num_methods = env->GetArrayLength(methods.obj()); 769 size_t num_methods = env->GetArrayLength(methods.obj());
773 DCHECK(num_methods) << "Java objects always have public methods"; 770 DCHECK(num_methods) << "Java objects always have public methods";
774 for (size_t i = 0; i < num_methods; ++i) { 771 for (size_t i = 0; i < num_methods; ++i) {
775 ScopedJavaLocalRef<jobject> java_method( 772 ScopedJavaLocalRef<jobject> java_method(
776 env, 773 env,
777 env->GetObjectArrayElement(methods.obj(), i)); 774 env->GetObjectArrayElement(methods.obj(), i));
778 JavaMethod* method = new JavaMethod(java_method); 775 JavaMethod* method = new JavaMethod(java_method);
779 methods_.insert(std::make_pair(method->name(), method)); 776 methods_.insert(std::make_pair(method->name(), method));
780 } 777 }
781 } 778 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/java/java_bound_object.h ('k') | content/browser/renderer_host/java/java_method.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698