| // Copyright 2025 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/preloading/autocomplete_dictionary_preload_service.h" |
| |
| #include <vector> |
| |
| #include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "components/omnibox/browser/autocomplete_result.h" |
| #include "content/public/browser/storage_partition.h" |
| |
| AutocompleteDictionaryPreloadService::AutocompleteDictionaryPreloadService( |
| Profile& profile) |
| : profile_(profile) {} |
| |
| AutocompleteDictionaryPreloadService::~AutocompleteDictionaryPreloadService() = |
| default; |
| |
| void AutocompleteDictionaryPreloadService::MaybePreload( |
| const AutocompleteResult& result) { |
| if (!base::FeatureList::IsEnabled(kAutocompleteDictionaryPreload)) { |
| return; |
| } |
| std::vector<GURL> match_destination_urls; |
| match_destination_urls.reserve(result.size()); |
| for (const AutocompleteMatch& match : result) { |
| if (match.destination_url.SchemeIsHTTPOrHTTPS()) { |
| match_destination_urls.emplace_back(match.destination_url); |
| } |
| } |
| |
| if (match_destination_urls.empty()) { |
| return; |
| } |
| |
| // Keep the old handle until `PreloadSharedDictionaryInfoForDocument()` call |
| // to avoid reloading dictionaries in the network service. |
| mojo::PendingRemote<network::mojom::PreloadedSharedDictionaryInfoHandle> |
| old_handle = std::move(preloaded_shared_dictionaries_handle_); |
| |
| preloaded_shared_dictionaries_handle_.reset(); |
| profile_->GetDefaultStoragePartition() |
| ->GetNetworkContext() |
| ->PreloadSharedDictionaryInfoForDocument( |
| match_destination_urls, preloaded_shared_dictionaries_handle_ |
| .InitWithNewPipeAndPassReceiver()); |
| preloaded_shared_dictionaries_expiry_timer_.Start( |
| FROM_HERE, kAutocompletePreloadedDictionaryTimeout.Get(), |
| base::BindOnce( |
| &AutocompleteDictionaryPreloadService::DeletePreloadedDictionaries, |
| base::Unretained(this))); |
| } |
| |
| void AutocompleteDictionaryPreloadService::DeletePreloadedDictionaries() { |
| preloaded_shared_dictionaries_handle_.reset(); |
| } |