Commit 825f2ed8 authored by Chris Hamilton's avatar Chris Hamilton Committed by Commit Bot

[Cast] Migrate chromecast code to use blink::WebMessagePort.

This migrates all of the code in chromecast/ to use
blink::WebMessagePort instead of directly manipulating
Mojo pipes, and manually encoding messages. It preserves the
existing APIs so that downstream dependents can migrate. A
further CL will rip out the deprecated API.

BUG=803242

Change-Id: I6f3b03dd982e4093804a63f8ad6086f14c2b58b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2028148
Commit-Queue: Chris Hamilton <chrisha@chromium.org>
Reviewed-by: default avatarSean Topping <seantopping@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarWez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737043}
parent 6d29f39b
...@@ -26,7 +26,11 @@ source_set("bindings_manager") { ...@@ -26,7 +26,11 @@ source_set("bindings_manager") {
"bindings_manager.cc", "bindings_manager.cc",
"bindings_manager.h", "bindings_manager.h",
] ]
deps = [ "//base" ] deps = [
"//base",
"//third_party/blink/public/common",
"//third_party/blink/public/common:headers",
]
public_deps = [ "//mojo/public/cpp/bindings" ] public_deps = [ "//mojo/public/cpp/bindings" ]
} }
......
...@@ -15,8 +15,19 @@ BindingsManager::~BindingsManager() { ...@@ -15,8 +15,19 @@ BindingsManager::~BindingsManager() {
DCHECK(port_handlers_.empty()); DCHECK(port_handlers_.empty());
} }
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
void BindingsManager::RegisterPortHandler(base::StringPiece port_name, void BindingsManager::RegisterPortHandler(base::StringPiece port_name,
PortConnectedHandler handler) { PortConnectedHandler handler) {
MessagePortConnectedHandler wrapped_handler = base::BindRepeating(
[](PortConnectedHandler handler, blink::WebMessagePort port) {
handler.Run(port.PassHandle());
},
handler);
RegisterPortHandler(port_name, wrapped_handler);
}
void BindingsManager::RegisterPortHandler(base::StringPiece port_name,
MessagePortConnectedHandler handler) {
auto result = port_handlers_.try_emplace(port_name, std::move(handler)); auto result = port_handlers_.try_emplace(port_name, std::move(handler));
DCHECK(result.second); DCHECK(result.second);
} }
...@@ -26,8 +37,14 @@ void BindingsManager::UnregisterPortHandler(base::StringPiece port_name) { ...@@ -26,8 +37,14 @@ void BindingsManager::UnregisterPortHandler(base::StringPiece port_name) {
DCHECK_EQ(deleted, 1u); DCHECK_EQ(deleted, 1u);
} }
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
void BindingsManager::OnPortConnected(base::StringPiece port_name, void BindingsManager::OnPortConnected(base::StringPiece port_name,
mojo::ScopedMessagePipeHandle port) { mojo::ScopedMessagePipeHandle port) {
OnPortConnected(port_name, blink::WebMessagePort::Create(std::move(port)));
}
void BindingsManager::OnPortConnected(base::StringPiece port_name,
blink::WebMessagePort port) {
auto handler = port_handlers_.find(port_name); auto handler = port_handlers_.find(port_name);
if (handler == port_handlers_.end()) { if (handler == port_handlers_.end()) {
LOG(ERROR) << "No handler found for port " << port_name << "."; LOG(ERROR) << "No handler found for port " << port_name << ".";
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/containers/flat_map.h" #include "base/containers/flat_map.h"
#include "base/strings/string_piece.h" #include "base/strings/string_piece.h"
#include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/message_pipe.h"
#include "third_party/blink/public/common/messaging/web_message_port.h"
namespace chromecast { namespace chromecast {
namespace bindings { namespace bindings {
...@@ -19,10 +20,15 @@ namespace bindings { ...@@ -19,10 +20,15 @@ namespace bindings {
// Injects Cast Platform API scripts into pages' scripting context and // Injects Cast Platform API scripts into pages' scripting context and
// establishes bidirectional communication with them across the JS/native // establishes bidirectional communication with them across the JS/native
// boundary. // boundary.
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
class BindingsManager { class BindingsManager {
public: public:
// NOTE: This is the deprecated legacy notification type. Please use a
// MessagePortConnectedHandler instead!
using PortConnectedHandler = using PortConnectedHandler =
base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)>; base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)>;
using MessagePortConnectedHandler =
base::RepeatingCallback<void(blink::WebMessagePort)>;
BindingsManager(); BindingsManager();
...@@ -32,8 +38,12 @@ class BindingsManager { ...@@ -32,8 +38,12 @@ class BindingsManager {
// Registers a |handler| which will receive MessagePorts originating from // Registers a |handler| which will receive MessagePorts originating from
// the frame's web content. |port_name| is an alphanumeric string that is // the frame's web content. |port_name| is an alphanumeric string that is
// consistent across JS and native code. // consistent across JS and native code.
// NOTE: The mojo::ScopedMessagePipeHandle of this function is deprecated and
// soon to be removed, please use the blink::WebMessagePort variant!
void RegisterPortHandler(base::StringPiece port_name, void RegisterPortHandler(base::StringPiece port_name,
PortConnectedHandler handler); PortConnectedHandler handler);
void RegisterPortHandler(base::StringPiece port_name,
MessagePortConnectedHandler handler);
// Unregisters a previously registered handler. // Unregisters a previously registered handler.
// The owner of BindingsManager is responsible for ensuring that all handlers // The owner of BindingsManager is responsible for ensuring that all handlers
...@@ -48,11 +58,14 @@ class BindingsManager { ...@@ -48,11 +58,14 @@ class BindingsManager {
protected: protected:
// Called by platform-specific subclasses when the underlying transport has // Called by platform-specific subclasses when the underlying transport has
// delivered a port. // delivered a port.
// NOTE: The mojo::ScopedMessagePipeHandle of this function is deprecated and
// soon to be removed, please use the blink::WebMessagePort variant!
void OnPortConnected(base::StringPiece port_name, void OnPortConnected(base::StringPiece port_name,
mojo::ScopedMessagePipeHandle port); mojo::ScopedMessagePipeHandle port);
void OnPortConnected(base::StringPiece port_name, blink::WebMessagePort port);
private: private:
base::flat_map<std::string, PortConnectedHandler> port_handlers_; base::flat_map<std::string, MessagePortConnectedHandler> port_handlers_;
DISALLOW_COPY_AND_ASSIGN(BindingsManager); DISALLOW_COPY_AND_ASSIGN(BindingsManager);
}; };
......
...@@ -12,10 +12,6 @@ ...@@ -12,10 +12,6 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chromecast/bindings/grit/resources.h" #include "chromecast/bindings/grit/resources.h"
#include "mojo/public/cpp/bindings/connector.h" #include "mojo/public/cpp/bindings/connector.h"
#include "third_party/blink/public/common/messaging/string_message_codec.h"
#include "third_party/blink/public/common/messaging/transferable_message.h"
#include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h"
#include "third_party/blink/public/mojom/messaging/transferable_message.mojom.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
namespace chromecast { namespace chromecast {
...@@ -69,7 +65,7 @@ void BindingsManagerCast::OnPageStateChanged( ...@@ -69,7 +65,7 @@ void BindingsManagerCast::OnPageStateChanged(
return; return;
case CastWebContents::PageState::DESTROYED: case CastWebContents::PageState::DESTROYED:
case CastWebContents::PageState::ERROR: case CastWebContents::PageState::ERROR:
connector_.reset(); blink_port_.Reset();
CastWebContents::Observer::Observe(nullptr); CastWebContents::Observer::Observe(nullptr);
cast_web_contents_ = nullptr; cast_web_contents_ = nullptr;
return; return;
...@@ -84,58 +80,37 @@ void BindingsManagerCast::OnPageLoaded() { ...@@ -84,58 +80,37 @@ void BindingsManagerCast::OnPageLoaded() {
<< "Received PageLoaded event while not observing a page"; << "Received PageLoaded event while not observing a page";
// Unbind platform-side MessagePort connector. // Unbind platform-side MessagePort connector.
if (connector_) { blink_port_.Reset();
connector_->set_incoming_receiver(nullptr);
connector_.reset(); // Create a blink::WebMessagePort, this is the way Chromium implements HTML5
} // MessagePorts.
auto port_pair = blink::WebMessagePort::CreatePair();
// Create a pre-connected MessagePipe, this is the way chromium blink_port_ = std::move(port_pair.first);
// implements HTML5 MessagePort. blink_port_.SetReceiver(this, base::ThreadTaskRunnerHandle::Get());
mojo::ScopedMessagePipeHandle platform_port;
mojo::ScopedMessagePipeHandle page_port; // Post the other end of the pipe to the page so that we can receive messages
mojo::CreateMessagePipe(nullptr, &platform_port, &page_port); // over |content_port|. |named_message_port_connector.js| will receive this
// through an onmessage event.
connector_ = std::make_unique<mojo::Connector>( std::vector<blink::WebMessagePort> message_ports;
std::move(platform_port), mojo::Connector::SINGLE_THREADED_SEND, message_ports.push_back(std::move(port_pair.second));
base::ThreadTaskRunnerHandle::Get());
connector_->set_connection_error_handler(base::BindOnce(
&BindingsManagerCast::OnControlPortDisconnected, base::Unretained(this)));
connector_->set_incoming_receiver(this);
// Post page_port to the page so that we could receive messages
// through another end of the pipe, which is platform_port.
// |named_message_port_connector.js| will receive this through
// onmessage event.
std::vector<mojo::ScopedMessagePipeHandle> message_ports;
message_ports.push_back(std::move(page_port));
cast_web_contents_->PostMessageToMainFrame("*", kControlPortConnectMessage, cast_web_contents_->PostMessageToMainFrame("*", kControlPortConnectMessage,
std::move(message_ports)); std::move(message_ports));
} }
bool BindingsManagerCast::Accept(mojo::Message* message) { bool BindingsManagerCast::OnMessage(blink::WebMessagePort::Message message) {
// Receive MessagePort and forward ports to their corresponding // Receive MessagePort and forward ports to their corresponding
// binding handlers. // binding handlers.
blink::TransferableMessage transferable_message;
if (!blink::mojom::TransferableMessage::DeserializeFromMessage(
std::move(*message), &transferable_message)) {
return false;
}
// One and only one MessagePort should be sent to here. // One and only one MessagePort should be sent to here.
if (transferable_message.ports.empty()) { if (message.ports.empty())
LOG(ERROR) << "TransferableMessage contains no ports."; LOG(ERROR) << "blink::WebMessagePort::Message contains no ports.";
} DCHECK_EQ(1u, message.ports.size())
DCHECK(transferable_message.ports.size() == 1)
<< "Only one control port should be provided"; << "Only one control port should be provided";
blink::MessagePortChannel message_port_channel = blink::WebMessagePort message_port = std::move(message.ports[0]);
std::move(transferable_message.ports[0]); message.ports.clear();
base::string16 data_utf16; base::string16 data_utf16 = std::move(message.data);
if (!blink::DecodeStringMessage(transferable_message.encoded_message,
&data_utf16)) {
LOG(ERROR) << "This Message does not contain bindingId";
return false;
}
std::string binding_id; std::string binding_id;
if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &binding_id)) { if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &binding_id)) {
...@@ -143,13 +118,13 @@ bool BindingsManagerCast::Accept(mojo::Message* message) { ...@@ -143,13 +118,13 @@ bool BindingsManagerCast::Accept(mojo::Message* message) {
} }
// Route the port to corresponding binding backend. // Route the port to corresponding binding backend.
OnPortConnected(binding_id, message_port_channel.ReleaseHandle()); OnPortConnected(binding_id, std::move(message_port));
return true; return true;
} }
void BindingsManagerCast::OnControlPortDisconnected() { void BindingsManagerCast::OnPipeError() {
LOG(INFO) << "NamedMessagePortConnector control port disconnected"; LOG(INFO) << "NamedMessagePortConnector control port disconnected";
connector_.reset(); blink_port_.Reset();
} }
} // namespace bindings } // namespace bindings
......
...@@ -21,7 +21,7 @@ namespace bindings { ...@@ -21,7 +21,7 @@ namespace bindings {
// Implements the CastOS BindingsManager. // Implements the CastOS BindingsManager.
class BindingsManagerCast : public BindingsManager, class BindingsManagerCast : public BindingsManager,
public CastWebContents::Observer, public CastWebContents::Observer,
public mojo::MessageReceiver { public blink::WebMessagePort::MessageReceiver {
public: public:
BindingsManagerCast(); BindingsManagerCast();
~BindingsManagerCast() override; ~BindingsManagerCast() override;
...@@ -45,17 +45,15 @@ class BindingsManagerCast : public BindingsManager, ...@@ -45,17 +45,15 @@ class BindingsManagerCast : public BindingsManager,
void OnPageStateChanged(CastWebContents* cast_web_contents) override; void OnPageStateChanged(CastWebContents* cast_web_contents) override;
private: private:
// |connector_| has been disconnected. // blink::WebMessagePort::MessageReceiver implementation:
void OnControlPortDisconnected(); bool OnMessage(blink::WebMessagePort::Message message) override;
void OnPipeError() override;
// mojo::MessageReceiver implementation:
bool Accept(mojo::Message* message) override;
// Stores all bindings, keyed on the string-based IDs. // Stores all bindings, keyed on the string-based IDs.
std::map<std::string, std::string> bindings_by_id_; std::map<std::string, std::string> bindings_by_id_;
chromecast::CastWebContents* cast_web_contents_; chromecast::CastWebContents* cast_web_contents_;
// Binded with the MessagePort used to receive messages from the page JS. // Receives messages from JS.
std::unique_ptr<mojo::Connector> connector_; blink::WebMessagePort blink_port_;
DISALLOW_COPY_AND_ASSIGN(BindingsManagerCast); DISALLOW_COPY_AND_ASSIGN(BindingsManagerCast);
}; };
......
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
#include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/messaging/string_message_codec.h"
#include "third_party/blink/public/common/messaging/transferable_message.h"
#include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h"
#include "third_party/blink/public/mojom/messaging/transferable_message.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
using ::testing::_; using ::testing::_;
...@@ -66,35 +62,10 @@ base::FilePath GetTestDataFilePath(const std::string& name) { ...@@ -66,35 +62,10 @@ base::FilePath GetTestDataFilePath(const std::string& name) {
return file_path.Append(GetTestDataPath()).AppendASCII(name); return file_path.Append(GetTestDataPath()).AppendASCII(name);
} }
// Mojo MessagePort Utils: base::Optional<std::string> ReadMessagePayloadAsUtf8(
mojo::Message MojoMessageFromUtf8(base::StringPiece message_utf8) { blink::WebMessagePort::Message message) {
blink::TransferableMessage transfer_message;
transfer_message.owned_encoded_message =
blink::EncodeStringMessage(base::UTF8ToUTF16(message_utf8));
transfer_message.encoded_message = transfer_message.owned_encoded_message;
return blink::mojom::TransferableMessage::SerializeAsMessage(
&transfer_message);
}
base::Optional<std::string> ReadMessagePayloadAsUtf8(mojo::Message message) {
blink::TransferableMessage transferable_message;
if (!blink::mojom::TransferableMessage::DeserializeFromMessage(
std::move(message), &transferable_message)) {
return base::nullopt;
}
if (!transferable_message.ports.empty()) {
LOG(ERROR) << "TransferableMessage has unexpected ports.";
}
base::string16 data_utf16;
if (!blink::DecodeStringMessage(transferable_message.encoded_message,
&data_utf16)) {
return base::nullopt;
}
std::string output; std::string output;
if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &output)) if (!base::UTF16ToUTF8(message.data.data(), message.data.size(), &output))
return base::nullopt; return base::nullopt;
return base::make_optional<std::string>(output); return base::make_optional<std::string>(output);
...@@ -139,7 +110,7 @@ class TitleChangeObserver : public CastWebContents::Observer { ...@@ -139,7 +110,7 @@ class TitleChangeObserver : public CastWebContents::Observer {
}; };
// Test class for communicating with connector.html. // Test class for communicating with connector.html.
class TestBindingBackend : public mojo::MessageReceiver { class TestBindingBackend : public blink::WebMessagePort::MessageReceiver {
public: public:
TestBindingBackend(bindings::BindingsManager* bindings_manager) TestBindingBackend(bindings::BindingsManager* bindings_manager)
: bindings_manager_(bindings_manager) { : bindings_manager_(bindings_manager) {
...@@ -150,14 +121,14 @@ class TestBindingBackend : public mojo::MessageReceiver { ...@@ -150,14 +121,14 @@ class TestBindingBackend : public mojo::MessageReceiver {
} }
~TestBindingBackend() override { ~TestBindingBackend() override {
connector_.reset(); port_.Reset();
constexpr char kPortName[] = "hello"; constexpr char kPortName[] = "hello";
bindings_manager_->UnregisterPortHandler(kPortName); bindings_manager_->UnregisterPortHandler(kPortName);
} }
// Start the RunLoop until OnPortConnected. // Start the RunLoop until OnPortConnected.
void RunUntilPortConnected() { void RunUntilPortConnected() {
if (connector_) if (port_.IsValid())
return; return;
base::RunLoop run_loop; base::RunLoop run_loop;
...@@ -182,13 +153,13 @@ class TestBindingBackend : public mojo::MessageReceiver { ...@@ -182,13 +153,13 @@ class TestBindingBackend : public mojo::MessageReceiver {
} }
void SendMessageToPage(base::StringPiece message) { void SendMessageToPage(base::StringPiece message) {
if (!connector_) if (!port_.IsValid())
return; return;
DCHECK(!message.empty()); DCHECK(!message.empty());
mojo::Message mojo_message = MojoMessageFromUtf8(message); blink::WebMessagePort::Message blink_message(base::UTF8ToUTF16(message));
connector_->Accept(&mojo_message); port_.PostMessage(std::move(blink_message));
} }
void SetPortDisconnectedCallback( void SetPortDisconnectedCallback(
...@@ -199,31 +170,18 @@ class TestBindingBackend : public mojo::MessageReceiver { ...@@ -199,31 +170,18 @@ class TestBindingBackend : public mojo::MessageReceiver {
private: private:
// Called when a port was received from the page. // Called when a port was received from the page.
void OnPortConnected(mojo::ScopedMessagePipeHandle port) { void OnPortConnected(blink::WebMessagePort port) {
if (!quit_closure_.is_null()) { if (!quit_closure_.is_null()) {
std::move(quit_closure_).Run(); std::move(quit_closure_).Run();
} }
connector_ = std::make_unique<mojo::Connector>( port_ = std::move(port);
std::move(port), mojo::Connector::SINGLE_THREADED_SEND, port_.SetReceiver(this, base::ThreadTaskRunnerHandle::Get());
base::ThreadTaskRunnerHandle::Get());
connector_->set_connection_error_handler(base::BindOnce(
&TestBindingBackend::OnPortDisconnected, base::Unretained(this)));
connector_->set_incoming_receiver(this);
} }
// Called when the peer disconnected the port. // blink::WebMessagePort::MessageReceiver implementation:
void OnPortDisconnected() { bool OnMessage(blink::WebMessagePort::Message message) override {
LOG(INFO) << "TestBindingBackend port disconnected.";
connector_.reset();
if (port_disconnected_callback_) {
std::move(port_disconnected_callback_).Run();
}
}
// mojo::MessageReceiver implementation:
bool Accept(mojo::Message* message) override {
base::Optional<std::string> message_json = base::Optional<std::string> message_json =
ReadMessagePayloadAsUtf8(std::move(*message)); ReadMessagePayloadAsUtf8(std::move(message));
if (!message_json) if (!message_json)
return false; return false;
...@@ -233,18 +191,29 @@ class TestBindingBackend : public mojo::MessageReceiver { ...@@ -233,18 +191,29 @@ class TestBindingBackend : public mojo::MessageReceiver {
std::move(message_received_callback_).Run(message_json.value()); std::move(message_received_callback_).Run(message_json.value());
return true; return true;
} }
// Cache received message until external caller access it // Cache received message until external caller access it
// via TestBindingBackend::ReceiveMessage // via TestBindingBackend::ReceiveMessage
message_queue_.emplace_back(message_json.value()); message_queue_.emplace_back(message_json.value());
return true; return true;
} }
// blink::WebMessagePort::MessageReceiver implementation:
// Called when the peer disconnected the port.
void OnPipeError() override {
LOG(INFO) << "TestBindingBackend port disconnected.";
port_.Reset();
if (port_disconnected_callback_) {
std::move(port_disconnected_callback_).Run();
}
}
base::OnceClosure quit_closure_; base::OnceClosure quit_closure_;
bindings::BindingsManager* const bindings_manager_; bindings::BindingsManager* const bindings_manager_;
// Used for sending and receiving messages over the MessagePort. // Used for sending and receiving messages over the MessagePort.
std::unique_ptr<mojo::Connector> connector_; blink::WebMessagePort port_;
base::circular_deque<std::string> message_queue_; base::circular_deque<std::string> message_queue_;
base::OnceCallback<void(std::string)> message_received_callback_; base::OnceCallback<void(std::string)> message_received_callback_;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chromecast/common/mojom/feature_manager.mojom.h" #include "chromecast/common/mojom/feature_manager.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/common/messaging/web_message_port.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -337,10 +338,15 @@ class CastWebContents { ...@@ -337,10 +338,15 @@ class CastWebContents {
// See html.spec.whatwg.org/multipage/web-messaging.html sect. 9.4.3 // See html.spec.whatwg.org/multipage/web-messaging.html sect. 9.4.3
// for more details on how the target origin policy is applied. // for more details on how the target origin policy is applied.
// Should be called on UI thread. // Should be called on UI thread.
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
virtual void PostMessageToMainFrame( virtual void PostMessageToMainFrame(
const std::string& target_origin, const std::string& target_origin,
const std::string& data, const std::string& data,
std::vector<mojo::ScopedMessagePipeHandle> channels) = 0; std::vector<mojo::ScopedMessagePipeHandle> channels) = 0;
virtual void PostMessageToMainFrame(
const std::string& target_origin,
const std::string& data,
std::vector<blink::WebMessagePort> ports) = 0;
// =========================================================================== // ===========================================================================
// Utility Methods // Utility Methods
......
...@@ -339,6 +339,7 @@ void CastWebContentsImpl::RemoveBeforeLoadJavaScript(base::StringPiece id) { ...@@ -339,6 +339,7 @@ void CastWebContentsImpl::RemoveBeforeLoadJavaScript(base::StringPiece id) {
} }
} }
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
void CastWebContentsImpl::PostMessageToMainFrame( void CastWebContentsImpl::PostMessageToMainFrame(
const std::string& target_origin, const std::string& target_origin,
const std::string& data, const std::string& data,
...@@ -359,6 +360,26 @@ void CastWebContentsImpl::PostMessageToMainFrame( ...@@ -359,6 +360,26 @@ void CastWebContentsImpl::PostMessageToMainFrame(
std::move(channels)); std::move(channels));
} }
void CastWebContentsImpl::PostMessageToMainFrame(
const std::string& target_origin,
const std::string& data,
std::vector<blink::WebMessagePort> ports) {
DCHECK(!data.empty());
base::string16 data_utf16;
data_utf16 = base::UTF8ToUTF16(data);
// If origin is set as wildcard, no origin scoping would be applied.
constexpr char kWildcardOrigin[] = "*";
base::Optional<base::string16> target_origin_utf16;
if (target_origin != kWildcardOrigin)
target_origin_utf16 = base::UTF8ToUTF16(target_origin);
content::MessagePortProvider::PostMessageToFrame(
web_contents(), base::string16(), target_origin_utf16, data_utf16,
std::move(ports));
}
void CastWebContentsImpl::AddObserver(CastWebContents::Observer* observer) { void CastWebContentsImpl::AddObserver(CastWebContents::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(observer); DCHECK(observer);
......
...@@ -67,10 +67,15 @@ class CastWebContentsImpl : public CastWebContents, ...@@ -67,10 +67,15 @@ class CastWebContentsImpl : public CastWebContents,
const std::vector<std::string>& origins, const std::vector<std::string>& origins,
base::StringPiece script) override; base::StringPiece script) override;
void RemoveBeforeLoadJavaScript(base::StringPiece id) override; void RemoveBeforeLoadJavaScript(base::StringPiece id) override;
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
void PostMessageToMainFrame( void PostMessageToMainFrame(
const std::string& target_origin, const std::string& target_origin,
const std::string& data, const std::string& data,
std::vector<mojo::ScopedMessagePipeHandle> channels) override; std::vector<mojo::ScopedMessagePipeHandle> channels) override;
void PostMessageToMainFrame(
const std::string& target_origin,
const std::string& data,
std::vector<blink::WebMessagePort> ports) override;
void AddObserver(Observer* observer) override; void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override;
bool is_websql_enabled() override; bool is_websql_enabled() override;
......
...@@ -81,6 +81,7 @@ void MessagePortProvider::PostMessageToFrame( ...@@ -81,6 +81,7 @@ void MessagePortProvider::PostMessageToFrame(
#endif #endif
#if defined(OS_FUCHSIA) || BUILDFLAG(IS_CHROMECAST) #if defined(OS_FUCHSIA) || BUILDFLAG(IS_CHROMECAST)
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
// static // static
void MessagePortProvider::PostMessageToFrame( void MessagePortProvider::PostMessageToFrame(
WebContents* web_contents, WebContents* web_contents,
...@@ -96,6 +97,22 @@ void MessagePortProvider::PostMessageToFrame( ...@@ -96,6 +97,22 @@ void MessagePortProvider::PostMessageToFrame(
target_origin.value_or(base::EmptyString16()), target_origin.value_or(base::EmptyString16()),
data, channels_wrapped); data, channels_wrapped);
} }
// static
void MessagePortProvider::PostMessageToFrame(
WebContents* web_contents,
const base::string16& source_origin,
const base::Optional<base::string16>& target_origin,
const base::string16& data,
std::vector<blink::WebMessagePort> channels) {
std::vector<MessagePortChannel> channels_wrapped;
for (blink::WebMessagePort& port : channels) {
channels_wrapped.emplace_back(port.PassHandle());
}
PostMessageToFrameInternal(web_contents, source_origin,
target_origin.value_or(base::EmptyString16()),
data, channels_wrapped);
}
#endif #endif
} // namespace content } // namespace content
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "build/chromecast_buildflags.h" #include "build/chromecast_buildflags.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "third_party/blink/public/common/messaging/web_message_port.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
...@@ -51,6 +52,7 @@ class CONTENT_EXPORT MessagePortProvider { ...@@ -51,6 +52,7 @@ class CONTENT_EXPORT MessagePortProvider {
#endif // OS_ANDROID #endif // OS_ANDROID
#if defined(OS_FUCHSIA) || BUILDFLAG(IS_CHROMECAST) #if defined(OS_FUCHSIA) || BUILDFLAG(IS_CHROMECAST)
// TODO(crbug.com/803242): Deprecated and will be shortly removed.
// If |target_origin| is unset, then no origin scoping is applied. // If |target_origin| is unset, then no origin scoping is applied.
static void PostMessageToFrame( static void PostMessageToFrame(
WebContents* web_contents, WebContents* web_contents,
...@@ -58,6 +60,13 @@ class CONTENT_EXPORT MessagePortProvider { ...@@ -58,6 +60,13 @@ class CONTENT_EXPORT MessagePortProvider {
const base::Optional<base::string16>& target_origin, const base::Optional<base::string16>& target_origin,
const base::string16& data, const base::string16& data,
std::vector<mojo::ScopedMessagePipeHandle> channels); std::vector<mojo::ScopedMessagePipeHandle> channels);
// If |target_origin| is unset, then no origin scoping is applied.
static void PostMessageToFrame(
WebContents* web_contents,
const base::string16& source_origin,
const base::Optional<base::string16>& target_origin,
const base::string16& data,
std::vector<blink::WebMessagePort> ports);
#endif // OS_FUCHSIA || BUILDFLAG(IS_CHROMECAST) #endif // OS_FUCHSIA || BUILDFLAG(IS_CHROMECAST)
private: private:
......
...@@ -34,6 +34,7 @@ buildflag_header("buildflags") { ...@@ -34,6 +34,7 @@ buildflag_header("buildflags") {
source_set("headers") { source_set("headers") {
visibility = [ visibility = [
"//chrome/*", "//chrome/*",
"//chromecast/*",
"//content/*", "//content/*",
"//third_party/blink/*", "//third_party/blink/*",
"//components/*", "//components/*",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment