named_message_port_connector_cast.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chromecast/browser/named_message_port_connector_cast.h"
  5. #include <string>
  6. #include <utility>
  7. #include "base/logging.h"
  8. #include "base/strings/utf_string_conversions.h"
  9. #include "chromecast/browser/cast_web_contents.h"
  10. #include "components/cast/message_port/cast/message_port_cast.h"
  11. #include "components/cast/named_message_port_connector/grit/named_message_port_connector_resources.h"
  12. #include "ui/base/resource/resource_bundle.h"
  13. namespace chromecast {
  14. namespace {
  15. constexpr uint64_t kNamedMessagePortConnectorBindingsId = 1000;
  16. } // namespace
  17. NamedMessagePortConnectorCast::NamedMessagePortConnectorCast(
  18. chromecast::CastWebContents* cast_web_contents)
  19. : cast_web_contents_(cast_web_contents) {
  20. DCHECK(cast_web_contents_);
  21. CastWebContentsObserver::Observe(cast_web_contents_);
  22. // Register the port connection JS script for early injection.
  23. std::string bindings_script_string =
  24. ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
  25. IDR_PORT_CONNECTOR_JS);
  26. DCHECK(!bindings_script_string.empty())
  27. << "NamedMessagePortConnector resources not loaded.";
  28. cast_web_contents->AddBeforeLoadJavaScript(
  29. kNamedMessagePortConnectorBindingsId, bindings_script_string);
  30. }
  31. NamedMessagePortConnectorCast::~NamedMessagePortConnectorCast() {
  32. CastWebContentsObserver::Observe(nullptr);
  33. }
  34. void NamedMessagePortConnectorCast::OnPageLoaded() {
  35. // Send the port connection message to the page once it is loaded.
  36. std::string connect_message;
  37. std::unique_ptr<cast_api_bindings::MessagePort> port;
  38. GetConnectMessage(&connect_message, &port);
  39. std::vector<blink::WebMessagePort> ports;
  40. ports.push_back(
  41. cast_api_bindings::MessagePortCast::FromMessagePort(port.get())
  42. ->TakePort());
  43. cast_web_contents_->PostMessageToMainFrame("*", connect_message,
  44. std::move(ports));
  45. }
  46. void NamedMessagePortConnectorCast::PageStateChanged(PageState page_state) {
  47. switch (page_state) {
  48. case PageState::DESTROYED:
  49. case PageState::ERROR:
  50. CastWebContentsObserver::Observe(nullptr);
  51. cast_web_contents_ = nullptr;
  52. break;
  53. case PageState::LOADED:
  54. OnPageLoaded();
  55. break;
  56. case PageState::IDLE:
  57. case PageState::LOADING:
  58. case PageState::CLOSED:
  59. break;
  60. }
  61. }
  62. } // namespace chromecast