1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2015 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 "chrome/browser/extensions/api/autofill_private/autofill_private_event_router.h"
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/autofill_private/autofill_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/common/extensions/api/autofill_private.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "content/public/browser/browser_context.h"
namespace extensions {
AutofillPrivateEventRouter::AutofillPrivateEventRouter(
content::BrowserContext* context)
: context_(context),
event_router_(nullptr),
personal_data_(nullptr) {
// Register with the event router so we know when renderers are listening to
// our events. We first check and see if there *is* an event router, because
// some unit tests try to create all context services, but don't initialize
// the event router first.
event_router_ = EventRouter::Get(context_);
if (!event_router_)
return;
personal_data_ = autofill::PersonalDataManagerFactory::GetForProfile(
Profile::FromBrowserContext(context_));
if (!personal_data_)
return;
personal_data_->AddObserver(this);
}
AutofillPrivateEventRouter::~AutofillPrivateEventRouter() {
}
void AutofillPrivateEventRouter::Shutdown() {
if (personal_data_)
personal_data_->RemoveObserver(this);
}
// TODO(crbug.com/923868): Change the 4 calls to a single OnPersonalDataChanged.
void AutofillPrivateEventRouter::OnPersonalDataChanged() {
// Ignore any updates before data is loaded. This can happen in tests.
if (!(personal_data_ && personal_data_->IsDataLoaded()))
return;
autofill_util::AddressEntryList addressList =
extensions::autofill_util::GenerateAddressList(*personal_data_);
std::unique_ptr<base::ListValue> args(
api::autofill_private::OnAddressListChanged::Create(addressList)
.release());
std::unique_ptr<Event> extension_event(
new Event(events::AUTOFILL_PRIVATE_ON_ADDRESS_LIST_CHANGED,
api::autofill_private::OnAddressListChanged::kEventName,
std::move(args)));
event_router_->BroadcastEvent(std::move(extension_event));
autofill_util::CreditCardEntryList creditCardList =
extensions::autofill_util::GenerateCreditCardList(*personal_data_);
args.reset(
api::autofill_private::OnCreditCardListChanged::Create(creditCardList)
.release());
extension_event.reset(
new Event(events::AUTOFILL_PRIVATE_ON_CREDIT_CARD_LIST_CHANGED,
api::autofill_private::OnCreditCardListChanged::kEventName,
std::move(args)));
event_router_->BroadcastEvent(std::move(extension_event));
autofill_util::CreditCardEntryList localCreditCardList =
extensions::autofill_util::GenerateLocalCreditCardList(*personal_data_);
args.reset(api::autofill_private::OnLocalCreditCardListChanged::Create(
localCreditCardList)
.release());
extension_event.reset(
new Event(events::AUTOFILL_PRIVATE_ON_LOCAL_CREDIT_CARD_LIST_CHANGED,
api::autofill_private::OnLocalCreditCardListChanged::kEventName,
std::move(args)));
event_router_->BroadcastEvent(std::move(extension_event));
autofill_util::CreditCardEntryList serverCreditCardList =
extensions::autofill_util::GenerateServerCreditCardList(*personal_data_);
args.reset(api::autofill_private::OnLocalCreditCardListChanged::Create(
serverCreditCardList)
.release());
extension_event.reset(new Event(
events::AUTOFILL_PRIVATE_ON_SERVER_CREDIT_CARD_LIST_CHANGED,
api::autofill_private::OnServerCreditCardListChanged::kEventName,
std::move(args)));
event_router_->BroadcastEvent(std::move(extension_event));
}
AutofillPrivateEventRouter* AutofillPrivateEventRouter::Create(
content::BrowserContext* context) {
return new AutofillPrivateEventRouter(context);
}
} // namespace extensions
|