| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/browser/named_message_port_connector_cast.h" |
| |
| #include <string> |
| #include <utility> |
| |
| #include "base/logging.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chromecast/browser/cast_web_contents.h" |
| #include "components/cast/message_port/blink_message_port_adapter.h" |
| #include "components/cast/message_port/cast/message_port_cast.h" |
| #include "components/cast/named_message_port_connector/grit/named_message_port_connector_resources.h" |
| #include "ui/base/resource/resource_bundle.h" |
| |
| namespace chromecast { |
| namespace { |
| |
| constexpr uint64_t kNamedMessagePortConnectorBindingsId = 1000; |
| |
| } // namespace |
| |
| NamedMessagePortConnectorCast::NamedMessagePortConnectorCast( |
| chromecast::CastWebContents* cast_web_contents) |
| : cast_web_contents_(cast_web_contents) { |
| DCHECK(cast_web_contents_); |
| |
| CastWebContentsObserver::Observe(cast_web_contents_); |
| |
| // Register the port connection JS script for early injection. |
| std::string bindings_script_string = |
| ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( |
| IDR_PORT_CONNECTOR_JS); |
| DCHECK(!bindings_script_string.empty()) |
| << "NamedMessagePortConnector resources not loaded."; |
| |
| cast_web_contents->AddBeforeLoadJavaScript( |
| kNamedMessagePortConnectorBindingsId, bindings_script_string); |
| } |
| |
| NamedMessagePortConnectorCast::~NamedMessagePortConnectorCast() { |
| CastWebContentsObserver::Observe(nullptr); |
| } |
| |
| void NamedMessagePortConnectorCast::OnPageLoaded() { |
| // Send the port connection message to the page once it is loaded. |
| std::string connect_message; |
| std::unique_ptr<cast_api_bindings::MessagePort> port; |
| GetConnectMessage(&connect_message, &port); |
| |
| std::vector<blink::WebMessagePort> ports; |
| ports.push_back( |
| cast_api_bindings::BlinkMessagePortAdapter::FromServerPlatformMessagePort( |
| std::move(port))); |
| cast_web_contents_->PostMessageToMainFrame("*", connect_message, |
| std::move(ports)); |
| } |
| |
| void NamedMessagePortConnectorCast::PageStateChanged(PageState page_state) { |
| switch (page_state) { |
| case PageState::DESTROYED: |
| case PageState::ERROR: |
| CastWebContentsObserver::Observe(nullptr); |
| cast_web_contents_ = nullptr; |
| break; |
| case PageState::LOADED: |
| OnPageLoaded(); |
| break; |
| case PageState::IDLE: |
| case PageState::LOADING: |
| case PageState::CLOSED: |
| break; |
| } |
| } |
| |
| } // namespace chromecast |