summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/README.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/README.js')
-rw-r--r--chrome/browser/sync/README.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/chrome/browser/sync/README.js b/chrome/browser/sync/README.js
new file mode 100644
index 0000000..d902b71
--- /dev/null
+++ b/chrome/browser/sync/README.js
@@ -0,0 +1,54 @@
+Overview of chrome://sync-internals
+-----------------------------------
+
+This note explains how chrome://sync-internals (also known as
+about:sync) interacts with the sync service/backend.
+
+Basically, chrome://sync-internals sends asynchronous messages to the
+sync backend and the sync backend asynchronously raises events to
+chrome://sync-internals, either when replying to messages or when
+something interesting happens.
+
+Both messages and events have a name and a list of arguments, the
+latter of which is represented by a JsArgList (js_arg_list.h) object,
+which is basically a wrapper around an immutable ListValue.
+
+Message/event flow
+------------------
+
+chrome://sync-internals is represented by SyncInternalsUI
+(chrome/browser/dom_ui/sync_internals_ui.h). SyncInternalsUI
+interacts with the sync service via a JsFrontend (js_frontend.h)
+object, which has a ProcessMessage() method. The JsFrontend can
+handle some messages itself, but it can also delegate the rest to a
+JsBackend instance (js_backend.h), which also has a ProcessMessage()
+method. A JsBackend can in turn handle some messages itself and
+delegate to other JsBackend instances.
+
+Essentially, there is a tree with a JsFrontend as the root and
+JsBackend as non-root internal nodes and leaf nodes (although
+currently, the tree is more like a simple list). The sets of messages
+handled by the JsBackends and the JsFrontend are disjoint, which means
+that at most one node handles a given message type. Also, the
+JsBackends may live on different threads, but JsArgList is thread-safe
+so that's okay.
+
+SyncInternalsUI is a JsEventHandler (js_event_handler.h), which means
+that it has a HandleJsEvent() method, but JsBackends cannot easily
+access those objects. Instead, each JsBackend keeps track of its
+parent router, which is a JsEventRouter object (js_event_router.h).
+Basically, a JsEventRouter is another JsBackend object or a JsFrontend
+object. So an event travels up through the JsEventRouter until it
+reaches the JsFrontend, which knows about the existing JsEventHandlers
+(via AddHandler()/RemoveHandler()) and so can delegate to the right
+one.
+
+A diagram of the flow of a message and its reply:
+
+msg(args) -> F -> B -> B -> B
+ | | |
+ H <- R <- R <- R <- reply-event(args)
+
+F = JsFrontend, B = JsBackend, R = JsEventRouter, H = JsEventHandler
+
+Non-reply events are percolated up similarly.