OLD | NEW |
| (Empty) |
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 #include "chrome/browser/sync/js/js_transaction_observer.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "base/location.h" | |
10 #include "base/logging.h" | |
11 #include "base/string_number_conversions.h" | |
12 #include "base/values.h" | |
13 #include "chrome/browser/sync/js/js_event_details.h" | |
14 #include "chrome/browser/sync/js/js_event_handler.h" | |
15 | |
16 namespace browser_sync { | |
17 | |
18 JsTransactionObserver::JsTransactionObserver() {} | |
19 | |
20 JsTransactionObserver::~JsTransactionObserver() { | |
21 DCHECK(non_thread_safe_.CalledOnValidThread()); | |
22 } | |
23 | |
24 void JsTransactionObserver::SetJsEventHandler( | |
25 const WeakHandle<JsEventHandler>& event_handler) { | |
26 event_handler_ = event_handler; | |
27 } | |
28 | |
29 void JsTransactionObserver::OnTransactionStart( | |
30 const tracked_objects::Location& location, | |
31 const syncable::WriterTag& writer) { | |
32 DCHECK(non_thread_safe_.CalledOnValidThread()); | |
33 if (!event_handler_.IsInitialized()) { | |
34 return; | |
35 } | |
36 DictionaryValue details; | |
37 details.SetString("location", location.ToString()); | |
38 details.SetString("writer", syncable::WriterTagToString(writer)); | |
39 HandleJsEvent(FROM_HERE, "onTransactionStart", JsEventDetails(&details)); | |
40 } | |
41 | |
42 namespace { | |
43 | |
44 // Max number of mutations we attempt to convert to values (to avoid | |
45 // running out of memory). | |
46 const size_t kMutationLimit = 300; | |
47 | |
48 } // namespace | |
49 | |
50 void JsTransactionObserver::OnTransactionWrite( | |
51 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, | |
52 const syncable::ModelTypeBitSet& models_with_changes) { | |
53 DCHECK(non_thread_safe_.CalledOnValidThread()); | |
54 if (!event_handler_.IsInitialized()) { | |
55 return; | |
56 } | |
57 DictionaryValue details; | |
58 details.Set("writeTransactionInfo", | |
59 write_transaction_info.Get().ToValue(kMutationLimit)); | |
60 details.Set("modelsWithChanges", | |
61 syncable::ModelTypeBitSetToValue(models_with_changes)); | |
62 HandleJsEvent(FROM_HERE, "onTransactionMutate", JsEventDetails(&details)); | |
63 } | |
64 | |
65 void JsTransactionObserver::OnTransactionEnd( | |
66 const tracked_objects::Location& location, | |
67 const syncable::WriterTag& writer) { | |
68 DCHECK(non_thread_safe_.CalledOnValidThread()); | |
69 if (!event_handler_.IsInitialized()) { | |
70 return; | |
71 } | |
72 DictionaryValue details; | |
73 details.SetString("location", location.ToString()); | |
74 details.SetString("writer", syncable::WriterTagToString(writer)); | |
75 HandleJsEvent(FROM_HERE, "onTransactionEnd", JsEventDetails(&details)); | |
76 } | |
77 | |
78 void JsTransactionObserver::HandleJsEvent( | |
79 const tracked_objects::Location& from_here, | |
80 const std::string& name, const JsEventDetails& details) { | |
81 if (!event_handler_.IsInitialized()) { | |
82 NOTREACHED(); | |
83 return; | |
84 } | |
85 event_handler_.Call(from_here, | |
86 &JsEventHandler::HandleJsEvent, name, details); | |
87 } | |
88 | |
89 } // namespace browser_sync | |
OLD | NEW |