// Copyright 2020 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 "chromecast/browser/named_message_port_connector_cast.h" #include #include #include "base/logging.h" #include "base/strings/utf_string_conversions.h" #include "chromecast/browser/cast_web_contents.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 port; GetConnectMessage(&connect_message, &port); std::vector ports; ports.push_back( cast_api_bindings::MessagePortCast::FromMessagePort(port.get()) ->TakePort()); 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