blob: 985e453958d00196a7f5e81aab7132f7e730d4c0 [file] [log] [blame]
// 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/renderer/cast_activity_url_filter_manager.h"
#include <string>
#include <vector>
#include "base/bind.h"
#include "base/logging.h"
#include "content/public/renderer/render_frame.h"
namespace chromecast {
CastActivityUrlFilterManager::UrlFilterReceiver::UrlFilterReceiver(
content::RenderFrame* render_frame,
base::OnceCallback<void()> on_removed_callback)
: content::RenderFrameObserver(render_frame),
on_removed_callback_(std::move(on_removed_callback)),
weak_factory_(this) {
weak_this_ = weak_factory_.GetWeakPtr();
render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
base::BindRepeating(&CastActivityUrlFilterManager::UrlFilterReceiver::
OnActivityUrlFilterConfigurationAssociatedRequest,
weak_this_));
}
CastActivityUrlFilterManager::UrlFilterReceiver::~UrlFilterReceiver() {
std::move(on_removed_callback_).Run();
}
bool CastActivityUrlFilterManager::UrlFilterReceiver::
OnAssociatedInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) {
return associated_interfaces_.TryBindInterface(interface_name, handle);
}
void CastActivityUrlFilterManager::UrlFilterReceiver::OnDestruct() {
delete this;
}
void CastActivityUrlFilterManager::UrlFilterReceiver::SetFilter(
chromecast::mojom::ActivityUrlFilterCriteriaPtr filter_criteria) {
if (filter_criteria->criteria.empty())
return;
url_filter_ = std::make_unique<ActivityUrlFilter>(filter_criteria->criteria);
}
void CastActivityUrlFilterManager::UrlFilterReceiver::
OnActivityUrlFilterConfigurationAssociatedRequest(
mojo::PendingAssociatedReceiver<
chromecast::mojom::ActivityUrlFilterConfiguration> receiver) {
receivers_.Add(this, std::move(receiver));
}
ActivityUrlFilter*
CastActivityUrlFilterManager::UrlFilterReceiver::GetUrlFilter() {
return url_filter_.get();
}
CastActivityUrlFilterManager::CastActivityUrlFilterManager()
: weak_factory_(this) {
weak_this_ = weak_factory_.GetWeakPtr();
}
CastActivityUrlFilterManager::~CastActivityUrlFilterManager() = default;
ActivityUrlFilter*
CastActivityUrlFilterManager::GetActivityUrlFilterForRenderFrameID(
int render_frame_id) {
const auto& it = activity_url_filters_.find(render_frame_id);
if (it == activity_url_filters_.end())
return nullptr;
return it->second->GetUrlFilter();
}
void CastActivityUrlFilterManager::OnRenderFrameCreated(
content::RenderFrame* render_frame) {
int render_frame_id = render_frame->GetRoutingID();
// Lifetime is tied to |render_frame| via content::RenderFrameObserver.
auto* filter_receiver = new CastActivityUrlFilterManager::UrlFilterReceiver(
render_frame,
base::BindOnce(&CastActivityUrlFilterManager::OnRenderFrameRemoved,
weak_this_, render_frame->GetRoutingID()));
auto result = activity_url_filters_.emplace(render_frame_id, filter_receiver);
if (!result.second)
LOG(ERROR)
<< "A URL filter for Activity already exists for Render frame ID "
<< render_frame_id;
}
void CastActivityUrlFilterManager::OnRenderFrameRemoved(int render_frame_id) {
const auto& it = activity_url_filters_.find(render_frame_id);
if (it != activity_url_filters_.end())
activity_url_filters_.erase(it);
}
} // namespace chromecast