Avi Drissman | 4e1b7bc | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2022 The Chromium Authors |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Shuran Huang | 1039815 | 2022-03-28 21:52:18 | [diff] [blame] | 5 | #include "content/browser/first_party_sets/first_party_sets_loader.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 6 | |
Chris Fredrickson | 4ef2d24 | 2022-09-06 22:47:18 | [diff] [blame] | 7 | #include <iterator> |
Lei Zhang | bd72251 | 2022-03-14 23:21:58 | [diff] [blame] | 8 | #include <set> |
Chris Fredrickson | 878d06b | 2022-09-08 15:20:37 | [diff] [blame] | 9 | #include <sstream> |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 10 | #include <utility> |
| 11 | #include <vector> |
| 12 | |
| 13 | #include "base/check.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 14 | #include "base/containers/flat_map.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 15 | #include "base/files/file_util.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 16 | #include "base/metrics/histogram_functions.h" |
Chris Fredrickson | 4ef2d24 | 2022-09-06 22:47:18 | [diff] [blame] | 17 | #include "base/ranges/algorithm.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 18 | #include "base/sequence_checker.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 19 | #include "base/task/thread_pool.h" |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 20 | #include "base/version.h" |
Shuran Huang | 1039815 | 2022-03-28 21:52:18 | [diff] [blame] | 21 | #include "content/browser/first_party_sets/first_party_set_parser.h" |
Chris Fredrickson | 8db7bf54 | 2022-09-06 17:47:20 | [diff] [blame] | 22 | #include "content/browser/first_party_sets/local_set_declaration.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 23 | #include "net/base/schemeful_site.h" |
Chris Fredrickson | 3327312 | 2022-08-31 22:41:00 | [diff] [blame] | 24 | #include "net/first_party_sets/first_party_set_entry.h" |
Chris Fredrickson | 0cad372 | 2022-09-30 14:50:31 | [diff] [blame] | 25 | #include "net/first_party_sets/global_first_party_sets.h" |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 26 | #include "third_party/abseil-cpp/absl/types/optional.h" |
| 27 | |
Shuran Huang | 1039815 | 2022-03-28 21:52:18 | [diff] [blame] | 28 | namespace content { |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 29 | |
| 30 | namespace { |
| 31 | |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 32 | std::string ReadSetsFile(base::File sets_file) { |
| 33 | std::string raw_sets; |
| 34 | base::ScopedFILE file(FileToFILE(std::move(sets_file), "r")); |
| 35 | return base::ReadStreamToString(file.get(), &raw_sets) ? raw_sets : ""; |
| 36 | } |
| 37 | |
| 38 | } // namespace |
| 39 | |
| 40 | FirstPartySetsLoader::FirstPartySetsLoader( |
Kirubel Aklilu | 6d1ef6b9 | 2022-07-08 13:40:19 | [diff] [blame] | 41 | LoadCompleteOnceCallback on_load_complete) |
| 42 | : on_load_complete_(std::move(on_load_complete)) {} |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 43 | |
| 44 | FirstPartySetsLoader::~FirstPartySetsLoader() { |
| 45 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 46 | } |
| 47 | |
| 48 | void FirstPartySetsLoader::SetManuallySpecifiedSet( |
Chris Fredrickson | 8db7bf54 | 2022-09-06 17:47:20 | [diff] [blame] | 49 | const LocalSetDeclaration& local_set) { |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 50 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
Chris Fredrickson | 8db7bf54 | 2022-09-06 17:47:20 | [diff] [blame] | 51 | manually_specified_set_ = local_set; |
cfredric | cc53588b | 2022-03-04 19:09:00 | [diff] [blame] | 52 | UmaHistogramTimes( |
Chris Fredrickson | 92e21d0 | 2022-04-22 21:16:19 | [diff] [blame] | 53 | "Cookie.FirstPartySets.InitializationDuration.ReadCommandLineSet2", |
cfredric | cc53588b | 2022-03-04 19:09:00 | [diff] [blame] | 54 | construction_timer_.Elapsed()); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 55 | |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 56 | MaybeFinishLoading(); |
| 57 | } |
| 58 | |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 59 | void FirstPartySetsLoader::SetComponentSets(base::Version version, |
| 60 | base::File sets_file) { |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 61 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 62 | if (component_sets_parse_progress_ != Progress::kNotStarted) { |
| 63 | DisposeFile(std::move(sets_file)); |
| 64 | return; |
| 65 | } |
| 66 | |
| 67 | component_sets_parse_progress_ = Progress::kStarted; |
| 68 | |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 69 | if (!sets_file.IsValid() || !version.IsValid()) { |
| 70 | OnReadSetsFile(base::Version(), ""); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 71 | return; |
| 72 | } |
| 73 | |
| 74 | // We use USER_BLOCKING here since First-Party Set initialization blocks |
| 75 | // network navigations at startup. |
| 76 | base::ThreadPool::PostTaskAndReplyWithResult( |
| 77 | FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, |
| 78 | base::BindOnce(&ReadSetsFile, std::move(sets_file)), |
| 79 | base::BindOnce(&FirstPartySetsLoader::OnReadSetsFile, |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 80 | weak_factory_.GetWeakPtr(), std::move(version))); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 81 | } |
| 82 | |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 83 | void FirstPartySetsLoader::OnReadSetsFile(base::Version version, |
| 84 | const std::string& raw_sets) { |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 85 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 86 | DCHECK_EQ(component_sets_parse_progress_, Progress::kStarted); |
| 87 | |
cfredric | 6b617446 | 2022-02-16 18:12:48 | [diff] [blame] | 88 | std::istringstream stream(raw_sets); |
Chris Fredrickson | d149b84 | 2022-08-17 21:41:00 | [diff] [blame] | 89 | FirstPartySetParser::SetsAndAliases public_sets = |
Chris Fredrickson | f9de345 | 2022-09-12 21:46:56 | [diff] [blame] | 90 | FirstPartySetParser::ParseSetsFromStream(stream, /*emit_errors=*/false); |
Chris Fredrickson | 075b495 | 2022-11-21 15:57:30 | [diff] [blame^] | 91 | sets_ = net::GlobalFirstPartySets(std::move(version), |
| 92 | std::move(public_sets.first), |
Chris Fredrickson | 0cad372 | 2022-09-30 14:50:31 | [diff] [blame] | 93 | std::move(public_sets.second)); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 94 | |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 95 | component_sets_parse_progress_ = Progress::kFinished; |
cfredric | cc53588b | 2022-03-04 19:09:00 | [diff] [blame] | 96 | UmaHistogramTimes( |
Chris Fredrickson | 92e21d0 | 2022-04-22 21:16:19 | [diff] [blame] | 97 | "Cookie.FirstPartySets.InitializationDuration.ReadComponentSets2", |
cfredric | cc53588b | 2022-03-04 19:09:00 | [diff] [blame] | 98 | construction_timer_.Elapsed()); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 99 | MaybeFinishLoading(); |
| 100 | } |
| 101 | |
| 102 | void FirstPartySetsLoader::DisposeFile(base::File sets_file) { |
| 103 | if (sets_file.IsValid()) { |
| 104 | base::ThreadPool::PostTask( |
| 105 | FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, |
| 106 | base::BindOnce( |
| 107 | [](base::File sets_file) { |
| 108 | // Run `sets_file`'s dtor in the threadpool. |
| 109 | }, |
| 110 | std::move(sets_file))); |
| 111 | } |
| 112 | } |
| 113 | |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 114 | void FirstPartySetsLoader::MaybeFinishLoading() { |
| 115 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
Chris Fredrickson | 9e17aa2 | 2022-09-20 15:57:16 | [diff] [blame] | 116 | if (component_sets_parse_progress_ != Progress::kFinished || |
| 117 | !manually_specified_set_.has_value()) { |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 118 | return; |
Chris Fredrickson | 9e17aa2 | 2022-09-20 15:57:16 | [diff] [blame] | 119 | } |
Chris Fredrickson | ad7f3c7 | 2022-09-14 15:11:45 | [diff] [blame] | 120 | if (!manually_specified_set_->empty()) { |
Chris Fredrickson | 0cad372 | 2022-09-30 14:50:31 | [diff] [blame] | 121 | sets_->ApplyManuallySpecifiedSet(manually_specified_set_->GetSet()); |
Chris Fredrickson | ad7f3c7 | 2022-09-14 15:11:45 | [diff] [blame] | 122 | } |
Chris Fredrickson | 0cad372 | 2022-09-30 14:50:31 | [diff] [blame] | 123 | std::move(on_load_complete_).Run(std::move(sets_).value()); |
Shuran Huang | 71a22ff | 2022-02-11 14:54:10 | [diff] [blame] | 124 | } |
| 125 | |
Kirubel Aklilu | 583f57ab | 2022-04-12 16:10:50 | [diff] [blame] | 126 | } // namespace content |