// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/public/browser/message_port_provider.h" #include #include "base/optional.h" #include "base/unguessable_token.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/frame_messages.h" #include "content/public/browser/browser_thread.h" #include "third_party/blink/public/common/messaging/string_message_codec.h" #if defined(OS_ANDROID) #include "base/android/jni_string.h" #include "content/public/browser/android/app_web_message_port.h" #endif using blink::MessagePortChannel; namespace content { namespace { void PostMessageToFrameInternal( WebContents* web_contents, const base::string16& source_origin, const base::string16& target_origin, const base::string16& data, std::vector ports) { DCHECK_CURRENTLY_ON(BrowserThread::UI); // TODO(chrisha): Kill off MessagePortChannel, as MessagePortDescriptor now // plays that role. std::vector channels; for (auto& port : ports) channels.emplace_back(MessagePortChannel(std::move(port))); blink::TransferableMessage message; message.owned_encoded_message = blink::EncodeStringMessage(data); message.encoded_message = message.owned_encoded_message; message.ports = std::move(channels); RenderFrameHostImpl* rfh = static_cast(web_contents->GetMainFrame()); rfh->PostMessageEvent(base::nullopt, source_origin, target_origin, std::move(message)); } #if defined(OS_ANDROID) base::string16 ToString16(JNIEnv* env, const base::android::JavaParamRef& s) { if (s.is_null()) return base::string16(); return base::android::ConvertJavaStringToUTF16(env, s); } #endif } // namespace // static void MessagePortProvider::PostMessageToFrame( WebContents* web_contents, const base::string16& source_origin, const base::string16& target_origin, const base::string16& data) { PostMessageToFrameInternal(web_contents, source_origin, target_origin, data, std::vector()); } #if defined(OS_ANDROID) void MessagePortProvider::PostMessageToFrame( WebContents* web_contents, JNIEnv* env, const base::android::JavaParamRef& source_origin, const base::android::JavaParamRef& target_origin, const base::android::JavaParamRef& data, const base::android::JavaParamRef& ports) { PostMessageToFrameInternal(web_contents, ToString16(env, source_origin), ToString16(env, target_origin), ToString16(env, data), AppWebMessagePort::UnwrapJavaArray(env, ports)); } #endif #if defined(OS_FUCHSIA) || BUILDFLAG(IS_CHROMECAST) // static void MessagePortProvider::PostMessageToFrame( WebContents* web_contents, const base::string16& source_origin, const base::Optional& target_origin, const base::string16& data, std::vector ports) { // Extract the underlying descriptors. std::vector descriptors; descriptors.reserve(ports.size()); for (size_t i = 0; i < ports.size(); ++i) descriptors.push_back(ports[i].PassPort()); PostMessageToFrameInternal(web_contents, source_origin, target_origin.value_or(base::EmptyString16()), data, std::move(descriptors)); } #endif } // namespace content