// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/favicon/favicon_java_script_feature.h"
#import <vector>
#import "base/values.h"
#import "ios/web/favicon/favicon_util.h"
#import "ios/web/public/js_messaging/java_script_feature_util.h"
#import "ios/web/public/js_messaging/script_message.h"
#import "ios/web/web_state/web_state_impl.h"
namespace {
const char kScriptName[] = "favicon";
const char kEventListenersScriptName[] = "favicon_event_listeners";
const char kFaviconScriptHandlerName[] = "FaviconUrlsHandler";
} // namespace
namespace web {
FaviconJavaScriptFeature::FaviconJavaScriptFeature()
: JavaScriptFeature(
ContentWorld::kIsolatedWorld,
{FeatureScript::CreateWithFilename(
kScriptName,
FeatureScript::InjectionTime::kDocumentEnd,
FeatureScript::TargetFrames::kMainFrame,
FeatureScript::ReinjectionBehavior::kInjectOncePerWindow),
FeatureScript::CreateWithFilename(
kEventListenersScriptName,
FeatureScript::InjectionTime::kDocumentEnd,
FeatureScript::TargetFrames::kMainFrame,
FeatureScript::ReinjectionBehavior::
kReinjectOnDocumentRecreation)},
{web::java_script_features::GetCommonJavaScriptFeature()}) {}
FaviconJavaScriptFeature::~FaviconJavaScriptFeature() {}
std::optional<std::string>
FaviconJavaScriptFeature::GetScriptMessageHandlerName() const {
return kFaviconScriptHandlerName;
}
void FaviconJavaScriptFeature::ScriptMessageReceived(
web::WebState* web_state,
const web::ScriptMessage& message) {
DCHECK(message.is_main_frame());
if (!message.body() || !message.body()->is_list() || !message.request_url()) {
return;
}
const GURL url = message.request_url().value();
std::vector<FaviconURL> urls;
if (!ExtractFaviconURL(message.body()->GetList(), url, &urls))
return;
if (!urls.empty()) {
WebStateImpl::FromWebState(web_state)->OnFaviconUrlUpdated(urls);
}
}
} // namespace web