1// Copyright 2012 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 SYNC_INTERNAL_API_JS_MUTATION_EVENT_OBSERVER_H_
6#define SYNC_INTERNAL_API_JS_MUTATION_EVENT_OBSERVER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/memory/weak_ptr.h"
13#include "base/threading/non_thread_safe.h"
14#include "sync/base/sync_export.h"
15#include "sync/internal_api/public/sync_manager.h"
16#include "sync/internal_api/public/util/weak_handle.h"
17#include "sync/syncable/transaction_observer.h"
18
19namespace tracked_objects {
20class Location;
21}  // namespace tracked_objects
22
23namespace syncer {
24
25class JsEventDetails;
26class JsEventHandler;
27
28// Observes all change- and transaction-related events and routes a
29// summarized version to a JsEventHandler.
30class SYNC_EXPORT_PRIVATE JsMutationEventObserver
31    : public SyncManager::ChangeObserver,
32      public syncable::TransactionObserver,
33      public base::NonThreadSafe {
34 public:
35  JsMutationEventObserver();
36
37  virtual ~JsMutationEventObserver();
38
39  base::WeakPtr<JsMutationEventObserver> AsWeakPtr();
40
41  void InvalidateWeakPtrs();
42
43  void SetJsEventHandler(const WeakHandle<JsEventHandler>& event_handler);
44
45  // SyncManager::ChangeObserver implementation.
46  virtual void OnChangesApplied(
47      ModelType model_type,
48      int64 write_transaction_id,
49      const ImmutableChangeRecordList& changes) OVERRIDE;
50  virtual void OnChangesComplete(ModelType model_type) OVERRIDE;
51
52  // syncable::TransactionObserver implementation.
53  virtual void OnTransactionWrite(
54      const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
55      ModelTypeSet models_with_changes) OVERRIDE;
56
57 private:
58  WeakHandle<JsEventHandler> event_handler_;
59
60  void HandleJsEvent(
61    const tracked_objects::Location& from_here,
62    const std::string& name, const JsEventDetails& details);
63
64  base::WeakPtrFactory<JsMutationEventObserver> weak_ptr_factory_;
65
66  DISALLOW_COPY_AND_ASSIGN(JsMutationEventObserver);
67};
68
69}  // namespace syncer
70
71#endif  // SYNC_INTERNAL_API_JS_MUTATION_EVENT_OBSERVER_H_
72