Index: components/password_manager/core/browser/form_fetcher_impl.cc |
diff --git a/components/password_manager/core/browser/form_fetcher_impl.cc b/components/password_manager/core/browser/form_fetcher_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0266bd1966ff6976ce652040ef9f8c24141509fe |
--- /dev/null |
+++ b/components/password_manager/core/browser/form_fetcher_impl.cc |
@@ -0,0 +1,111 @@ |
+// Copyright 2016 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 "components/password_manager/core/browser/form_fetcher_impl.h" |
+ |
+#include <algorithm> |
+#include <utility> |
+ |
+#include "base/memory/ptr_util.h" |
+#include "build/build_config.h" |
+#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/core/browser/credentials_filter.h" |
+#include "components/password_manager/core/browser/password_manager_client.h" |
+#include "components/password_manager/core/browser/password_store.h" |
+#include "components/password_manager/core/browser/statistics_table.h" |
+ |
+using autofill::PasswordForm; |
+ |
+namespace password_manager { |
+ |
+namespace { |
+ |
+// Splits |store_results| into a vector of non-federated and federated matches. |
+// Returns the federated matches and keeps the non-federated in |store_results|. |
+std::vector<std::unique_ptr<PasswordForm>> SplitFederatedMatches( |
+ std::vector<std::unique_ptr<PasswordForm>>* store_results) { |
+ const auto first_federated = std::partition( |
+ store_results->begin(), store_results->end(), |
+ [](const std::unique_ptr<PasswordForm>& form) { |
+ return form->federation_origin.unique(); // False means federated. |
+ }); |
+ |
+ // Move out federated matches. |
+ std::vector<std::unique_ptr<PasswordForm>> federated_matches; |
+ federated_matches.resize(store_results->end() - first_federated); |
+ std::move(first_federated, store_results->end(), federated_matches.begin()); |
+ |
+ store_results->erase(first_federated, store_results->end()); |
+ return federated_matches; |
+} |
+ |
+// Create a vector of const T* from a vector of unique_ptr<T>. |
+template <typename T> |
+std::vector<const T*> MakeWeakCopies( |
+ const std::vector<std::unique_ptr<T>>& owning) { |
+ std::vector<const T*> result; |
+ result.resize(owning.size()); |
+ std::transform(owning.begin(), owning.end(), result.begin(), |
+ [](const std::unique_ptr<T>& ptr) { return ptr.get(); }); |
+ return result; |
+} |
+ |
+} // namespace |
+ |
+FormFetcherImpl::FormFetcherImpl(const PasswordManagerClient* client) |
+ : client_(client) {} |
+ |
+FormFetcherImpl::~FormFetcherImpl() = default; |
+ |
+void FormFetcherImpl::AddConsumer(Consumer* consumer) { |
+ DCHECK(consumer); |
+ consumers_.insert(consumer); |
+ if (state_ == State::NOT_WAITING) |
+ consumer->ProcessMatches(weak_non_federated_, filtered_count_); |
+} |
+ |
+FormFetcherImpl::State FormFetcherImpl::GetState() const { |
+ return state_; |
+} |
+ |
+const std::vector<const InteractionsStats*>& |
+FormFetcherImpl::GetInteractionsStats() const { |
+ return weak_interactions_stats_; |
+} |
+ |
+const std::vector<const autofill::PasswordForm*>& |
+FormFetcherImpl::GetFederatedMatches() const { |
+ return weak_federated_; |
+} |
+ |
+void FormFetcherImpl::SetResults( |
+ std::vector<std::unique_ptr<autofill::PasswordForm>> results) { |
+ DCHECK_EQ(State::WAITING, state_); |
+ |
+ federated_ = SplitFederatedMatches(&results); |
+ non_federated_ = std::move(results); |
+ |
+ const size_t original_count = non_federated_.size(); |
+ |
+ non_federated_ = |
+ client_->GetStoreResultFilter()->FilterResults(std::move(non_federated_)); |
+ |
+ filtered_count_ = original_count - non_federated_.size(); |
+ |
+ weak_non_federated_ = MakeWeakCopies(non_federated_); |
+ weak_federated_ = MakeWeakCopies(federated_); |
+ |
+ state_ = State::NOT_WAITING; |
+ |
+ for (Consumer* consumer : consumers_) |
+ consumer->ProcessMatches(weak_non_federated_, filtered_count_); |
+} |
+ |
+void FormFetcherImpl::SetStats( |
+ std::vector<std::unique_ptr<InteractionsStats>> stats) { |
+ interactions_stats_ = std::move(stats); |
+ weak_interactions_stats_ = MakeWeakCopies(interactions_stats_); |
+} |
+ |
+} // namespace password_manager |