voidGinJavaBridgeDispatcherHost::AddNamedObject(conststd::string&name,constbase::android::JavaRef<jobject>&object,constbase::android::JavaRef<jclass>&safe_annotation_clazz,net::SchemeHostPortMatchermatcher){DCHECK_CURRENTLY_ON(BrowserThread::UI);GinJavaBoundObject::ObjectIDobject_id;NamedObjectMap::iteratoriter=named_objects_.find(name);boolexisting_object=FindObjectId(object,&object_id);if(existing_object&&iter!=named_objects_.end()&&iter->second.object_id==object_id){// Nothing to do.
return;}if(iter!=named_objects_.end()){RemoveNamedObject(iter->first);}if(existing_object){base::AutoLocklocker(objects_lock_);objects_[object_id]->AddName();}else{object_id=AddObject(object,safe_annotation_clazz,std::nullopt);}// We use the serialized string of the matcher and reconstruct it
// in the render process. We pass this around like this because we can
// then trust that all the rules being fed to the render process are well
// formed rules.
// TODO(crbug.com/407420300): Rely on OriginMatcher instead of a string here.
named_objects_[name]={object_id,matcher.ToString()};web_contents()->GetPrimaryMainFrame()->ForEachRenderFrameHostImplIncludingSpeculative([&name,object_id,&matcher,this](RenderFrameHostImpl*render_frame_host){if(!render_frame_host->IsRenderFrameLive()){return;}GetJavaBridge(render_frame_host,/*should_create=*/true)->AddNamedObject(name,object_id,matcher.ToString());});}
voidGinJavaMethodInvocationHelper::Invoke(){JNIEnv*env=AttachCurrentThread();constJavaMethod*method=object_->FindMethod(method_name_,arguments_.size());if(!method){SetInvocationError(mojom::GinJavaBridgeError::kGinJavaBridgeMethodNotFound);return;}if(object_->IsObjectGetClassMethod(method)){base::android::EventLogWriteInt(kObjectGetClassInvocationAttemptLogTag,getuid());SetInvocationError(mojom::GinJavaBridgeError::kGinJavaBridgeAccessToObjectGetClassIsBlocked);return;}ScopedJavaLocalRef<jobject>obj;ScopedJavaLocalRef<jclass>cls;if(method->is_static()){cls=object_->GetLocalClassRef(env);}else{obj=object_->GetLocalRef(env);}if(obj.is_null()&&cls.is_null()){SetInvocationError(mojom::GinJavaBridgeError::kGinJavaBridgeObjectIsGone);return;}mojom::GinJavaBridgeErrorcoercion_error=mojom::GinJavaBridgeError::kGinJavaBridgeNoError;std::vector<jvalue>parameters(method->num_parameters());for(size_ti=0;i<method->num_parameters();++i){constbase::Value&argument=arguments_[i];parameters[i]=CoerceJavaScriptValueToJavaValue(env,argument,method->parameter_type(i),true,object_refs_,&coercion_error);}if(coercion_error==mojom::GinJavaBridgeError::kGinJavaBridgeNoError){if(method->is_static()){InvokeMethod(nullptr,cls.obj(),method->return_type(),method->id(),parameters.data());}else{InvokeMethod(obj.obj(),nullptr,method->return_type(),method->id(),parameters.data());}}else{SetInvocationError(coercion_error);}// Now that we're done with the jvalue, release any local references created
// by CoerceJavaScriptValueToJavaValue().
for(size_ti=0;i<method->num_parameters();++i){ReleaseJavaValueIfRequired(env,¶meters[i],method->parameter_type(i));}}