| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/browser/android/interface_registry_android_impl.h" | |
| 6 | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "base/android/jni_android.h" | |
| 10 #include "base/android/jni_string.h" | |
| 11 #include "base/callback.h" | |
| 12 #include "base/memory/ptr_util.h" | |
| 13 #include "content/public/browser/browser_thread.h" | |
| 14 #include "jni/InterfaceRegistry_jni.h" | |
| 15 #include "mojo/public/cpp/system/message_pipe.h" | |
| 16 #include "services/shell/public/cpp/interface_provider.h" | |
| 17 #include "services/shell/public/cpp/interface_registry.h" | |
| 18 | |
| 19 using base::android::AttachCurrentThread; | |
| 20 using base::android::ConvertJavaStringToUTF8; | |
| 21 using base::android::JavaParamRef; | |
| 22 using base::android::ScopedJavaGlobalRef; | |
| 23 | |
| 24 namespace content { | |
| 25 | |
| 26 namespace { | |
| 27 | |
| 28 // Callback passed to the wrapped InterfaceRegistry upon AddInterface(). The | |
| 29 // InterfaceRegistry will call it to create a registered Java impl. | |
| 30 void CreateImplAndAttach( | |
| 31 const ScopedJavaGlobalRef<jobject>& j_scoped_interface_registry, | |
| 32 const ScopedJavaGlobalRef<jobject>& j_scoped_manager, | |
| 33 const ScopedJavaGlobalRef<jobject>& j_scoped_factory, | |
| 34 mojo::ScopedMessagePipeHandle handle) { | |
| 35 JNIEnv* env = AttachCurrentThread(); | |
| 36 Java_InterfaceRegistry_createImplAndAttach( | |
| 37 env, j_scoped_interface_registry, handle.release().value(), | |
| 38 j_scoped_manager, j_scoped_factory); | |
| 39 } | |
| 40 | |
| 41 } // namespace | |
| 42 | |
| 43 // static | |
| 44 std::unique_ptr<InterfaceRegistryAndroid> InterfaceRegistryAndroid::Create( | |
| 45 shell::InterfaceRegistry* interface_registry) { | |
| 46 return base::WrapUnique(new InterfaceRegistryAndroidImpl(interface_registry)); | |
| 47 } | |
| 48 | |
| 49 // static | |
| 50 bool InterfaceRegistryAndroidImpl::Register(JNIEnv* env) { | |
| 51 return RegisterNativesImpl(env); | |
| 52 } | |
| 53 | |
| 54 InterfaceRegistryAndroidImpl::~InterfaceRegistryAndroidImpl() { | |
| 55 Java_InterfaceRegistry_destroy(AttachCurrentThread(), obj_); | |
| 56 } | |
| 57 | |
| 58 // Constructor and destructor call into Java. | |
| 59 InterfaceRegistryAndroidImpl::InterfaceRegistryAndroidImpl( | |
| 60 shell::InterfaceRegistry* interface_registry) | |
| 61 : interface_registry_(interface_registry) { | |
| 62 JNIEnv* env = AttachCurrentThread(); | |
| 63 obj_.Reset( | |
| 64 env, | |
| 65 Java_InterfaceRegistry_create( | |
| 66 env, reinterpret_cast<intptr_t>(this)).obj()); | |
| 67 } | |
| 68 | |
| 69 const base::android::ScopedJavaGlobalRef<jobject>& | |
| 70 InterfaceRegistryAndroidImpl::GetObj() { | |
| 71 return obj_; | |
| 72 } | |
| 73 | |
| 74 // Methods called from Java. | |
| 75 void InterfaceRegistryAndroidImpl::AddInterface( | |
| 76 JNIEnv* env, | |
| 77 const JavaParamRef<jobject>& j_interface_registry, | |
| 78 const JavaParamRef<jobject>& j_manager, | |
| 79 const JavaParamRef<jobject>& j_factory, | |
| 80 const JavaParamRef<jstring>& j_name) { | |
| 81 std::string name(ConvertJavaStringToUTF8(env, j_name)); | |
| 82 | |
| 83 ScopedJavaGlobalRef<jobject> j_scoped_interface_registry; | |
| 84 j_scoped_interface_registry.Reset(env, j_interface_registry); | |
| 85 | |
| 86 ScopedJavaGlobalRef<jobject> j_scoped_manager; | |
| 87 j_scoped_manager.Reset(env, j_manager); | |
| 88 | |
| 89 ScopedJavaGlobalRef<jobject> j_scoped_factory; | |
| 90 j_scoped_factory.Reset(env, j_factory); | |
| 91 | |
| 92 // All Java interfaces must be bound on the main thread. | |
| 93 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = | |
| 94 BrowserThread::GetTaskRunnerForThread(BrowserThread::UI); | |
| 95 interface_registry_->AddInterface( | |
| 96 name, | |
| 97 base::Bind(&CreateImplAndAttach, j_scoped_interface_registry, | |
| 98 j_scoped_manager, j_scoped_factory), | |
| 99 ui_task_runner); | |
| 100 } | |
| 101 | |
| 102 void InterfaceRegistryAndroidImpl::RemoveInterface( | |
| 103 JNIEnv* env, | |
| 104 const JavaParamRef<jobject>& j_interface_registry, | |
| 105 const JavaParamRef<jstring>& j_name) { | |
| 106 std::string name(ConvertJavaStringToUTF8(env, j_name)); | |
| 107 interface_registry_->RemoveInterface(name); | |
| 108 } | |
| 109 | |
| 110 } // namespace content | |
| OLD | NEW |