• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_SYNC_GLUE_PASSWORD_CHANGE_PROCESSOR_H_
6 #define CHROME_BROWSER_SYNC_GLUE_PASSWORD_CHANGE_PROCESSOR_H_
7 #pragma once
8 
9 #include "chrome/browser/sync/glue/change_processor.h"
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "chrome/browser/sync/glue/password_model_associator.h"
14 #include "chrome/browser/sync/glue/sync_backend_host.h"
15 #include "content/common/notification_observer.h"
16 #include "content/common/notification_registrar.h"
17 #include "content/common/notification_type.h"
18 
19 class PasswordStore;
20 class MessageLoop;
21 class NotificationService;
22 
23 namespace browser_sync {
24 
25 class UnrecoverableErrorHandler;
26 
27 // This class is responsible for taking changes from the password backend and
28 // applying them to the sync_api 'syncable' model, and vice versa. All
29 // operations and use of this class are from the DB thread on Windows and Linux,
30 // or the password thread on Mac.
31 class PasswordChangeProcessor : public ChangeProcessor,
32                                 public NotificationObserver {
33  public:
34   PasswordChangeProcessor(PasswordModelAssociator* model_associator,
35                           PasswordStore* password_store,
36                           UnrecoverableErrorHandler* error_handler);
37   virtual ~PasswordChangeProcessor();
38 
39   // NotificationObserver implementation.
40   // Passwords -> sync_api model change application.
41   virtual void Observe(NotificationType type,
42                        const NotificationSource& source,
43                        const NotificationDetails& details) OVERRIDE;
44 
45   // sync_api model -> WebDataService change application.
46   virtual void ApplyChangesFromSyncModel(
47       const sync_api::BaseTransaction* trans,
48       const sync_api::SyncManager::ChangeRecord* changes,
49       int change_count) OVERRIDE;
50 
51   // Commit changes buffered during ApplyChanges. We must commit them to the
52   // password store only after the sync_api transaction is released, else there
53   // is risk of deadlock due to the password store posting tasks to the UI
54   // thread (http://crbug.com/70658).
55   virtual void CommitChangesFromSyncModel() OVERRIDE;
56 
57  protected:
58   virtual void StartImpl(Profile* profile) OVERRIDE;
59   virtual void StopImpl() OVERRIDE;
60 
61  private:
62   void StartObserving();
63   void StopObserving();
64 
65   // The two models should be associated according to this ModelAssociator.
66   PasswordModelAssociator* model_associator_;
67 
68   // The model we are processing changes from.  This is owned by the
69   // WebDataService which is kept alive by our data type controller
70   // holding a reference.
71   PasswordStore* password_store_;
72 
73   // Buffers used between ApplyChangesFromSyncModel and
74   // CommitChangesFromSyncModel.
75   PasswordModelAssociator::PasswordVector new_passwords_;
76   PasswordModelAssociator::PasswordVector updated_passwords_;
77   PasswordModelAssociator::PasswordVector deleted_passwords_;
78 
79   NotificationRegistrar notification_registrar_;
80 
81   bool observing_;
82 
83   MessageLoop* expected_loop_;
84 
85   DISALLOW_COPY_AND_ASSIGN(PasswordChangeProcessor);
86 };
87 
88 }  // namespace browser_sync
89 
90 #endif  // CHROME_BROWSER_SYNC_GLUE_PASSWORD_CHANGE_PROCESSOR_H_
91