| // Copyright 2015 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 "modules/presentation/PresentationController.h" |
| |
| #include "core/dom/Document.h" |
| #include "core/frame/LocalFrame.h" |
| #include "modules/presentation/PresentationConnection.h" |
| #include "public/platform/WebString.h" |
| #include "public/platform/WebVector.h" |
| #include "public/platform/modules/presentation/WebPresentationClient.h" |
| #include "wtf/PtrUtil.h" |
| #include <memory> |
| |
| namespace blink { |
| |
| PresentationController::PresentationController(LocalFrame& frame, |
| WebPresentationClient* client) |
| : Supplement<LocalFrame>(frame), |
| ContextLifecycleObserver(frame.document()), |
| m_client(client) { |
| if (m_client) |
| m_client->setController(this); |
| } |
| |
| PresentationController::~PresentationController() { |
| if (m_client) |
| m_client->setController(nullptr); |
| } |
| |
| // static |
| PresentationController* PresentationController::create( |
| LocalFrame& frame, |
| WebPresentationClient* client) { |
| return new PresentationController(frame, client); |
| } |
| |
| // static |
| const char* PresentationController::supplementName() { |
| return "PresentationController"; |
| } |
| |
| // static |
| PresentationController* PresentationController::from(LocalFrame& frame) { |
| return static_cast<PresentationController*>( |
| Supplement<LocalFrame>::from(frame, supplementName())); |
| } |
| |
| // static |
| void PresentationController::provideTo(LocalFrame& frame, |
| WebPresentationClient* client) { |
| Supplement<LocalFrame>::provideTo( |
| frame, PresentationController::supplementName(), |
| PresentationController::create(frame, client)); |
| } |
| |
| WebPresentationClient* PresentationController::client() { |
| return m_client; |
| } |
| |
| DEFINE_TRACE(PresentationController) { |
| visitor->trace(m_presentation); |
| visitor->trace(m_connections); |
| Supplement<LocalFrame>::trace(visitor); |
| ContextLifecycleObserver::trace(visitor); |
| } |
| |
| void PresentationController::didStartDefaultSession( |
| const WebPresentationSessionInfo& sessionInfo) { |
| if (!m_presentation || !m_presentation->defaultRequest()) |
| return; |
| PresentationConnection::take(this, sessionInfo, |
| m_presentation->defaultRequest()); |
| } |
| |
| void PresentationController::didChangeSessionState( |
| const WebPresentationSessionInfo& sessionInfo, |
| WebPresentationConnectionState state) { |
| PresentationConnection* connection = findConnection(sessionInfo); |
| if (!connection) |
| return; |
| connection->didChangeState(state); |
| } |
| |
| void PresentationController::didCloseConnection( |
| const WebPresentationSessionInfo& sessionInfo, |
| WebPresentationConnectionCloseReason reason, |
| const WebString& message) { |
| PresentationConnection* connection = findConnection(sessionInfo); |
| if (!connection) |
| return; |
| connection->didClose(reason, message); |
| } |
| |
| void PresentationController::didReceiveSessionTextMessage( |
| const WebPresentationSessionInfo& sessionInfo, |
| const WebString& message) { |
| PresentationConnection* connection = findConnection(sessionInfo); |
| if (!connection) |
| return; |
| connection->didReceiveTextMessage(message); |
| } |
| |
| void PresentationController::didReceiveSessionBinaryMessage( |
| const WebPresentationSessionInfo& sessionInfo, |
| const uint8_t* data, |
| size_t length) { |
| PresentationConnection* connection = findConnection(sessionInfo); |
| if (!connection) |
| return; |
| connection->didReceiveBinaryMessage(data, length); |
| } |
| |
| void PresentationController::setPresentation(Presentation* presentation) { |
| m_presentation = presentation; |
| } |
| |
| void PresentationController::setDefaultRequestUrl( |
| const WTF::Vector<KURL>& urls) { |
| if (!m_client) |
| return; |
| |
| WebVector<WebURL> presentationUrls(urls.size()); |
| for (size_t i = 0; i < urls.size(); ++i) { |
| if (urls[i].isValid()) |
| presentationUrls[i] = urls[i]; |
| } |
| |
| m_client->setDefaultPresentationUrls(presentationUrls); |
| } |
| |
| void PresentationController::registerConnection( |
| PresentationConnection* connection) { |
| m_connections.add(connection); |
| } |
| |
| void PresentationController::contextDestroyed(ExecutionContext*) { |
| if (m_client) { |
| m_client->setController(nullptr); |
| m_client = nullptr; |
| } |
| } |
| |
| PresentationConnection* PresentationController::findExistingConnection( |
| const blink::WebVector<blink::WebURL>& presentationUrls, |
| const blink::WebString& presentationId) { |
| for (const auto& connection : m_connections) { |
| for (const auto& presentationUrl : presentationUrls) { |
| if (connection->getState() != |
| WebPresentationConnectionState::Terminated && |
| connection->matches(presentationId, presentationUrl)) { |
| return connection.get(); |
| } |
| } |
| } |
| return nullptr; |
| } |
| |
| PresentationConnection* PresentationController::findConnection( |
| const WebPresentationSessionInfo& sessionInfo) { |
| for (const auto& connection : m_connections) { |
| if (connection->matches(sessionInfo)) |
| return connection.get(); |
| } |
| |
| return nullptr; |
| } |
| |
| } // namespace blink |