1// Copyright (c) 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 CONTENT_BROWSER_MEDIA_MEDIA_INTERNALS_PROXY_H_
6#define CONTENT_BROWSER_MEDIA_MEDIA_INTERNALS_PROXY_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/sequenced_task_runner_helpers.h"
10#include "content/browser/media/media_internals.h"
11#include "content/public/browser/browser_thread.h"
12#include "content/public/browser/notification_observer.h"
13#include "content/public/browser/notification_registrar.h"
14#include "net/base/net_log.h"
15
16namespace base {
17class ListValue;
18class Value;
19}
20
21namespace content {
22class MediaInternalsMessageHandler;
23
24// This class is a proxy between MediaInternals (on the IO thread) and
25// MediaInternalsMessageHandler (on the UI thread).
26// It is ref_counted to ensure that it completes all pending Tasks on both
27// threads before destruction.
28class MediaInternalsProxy
29    : public base::RefCountedThreadSafe<
30          MediaInternalsProxy,
31          BrowserThread::DeleteOnUIThread>,
32      public net::NetLog::ThreadSafeObserver,
33      public NotificationObserver {
34 public:
35  MediaInternalsProxy();
36
37  // NotificationObserver implementation.
38  virtual void Observe(int type,
39                       const NotificationSource& source,
40                       const NotificationDetails& details) OVERRIDE;
41
42  // Register a Handler and start receiving callbacks from MediaInternals.
43  void Attach(MediaInternalsMessageHandler* handler);
44
45  // Unregister the same and stop receiving callbacks.
46  void Detach();
47
48  // Have MediaInternals send all the data it has.
49  void GetEverything();
50
51  // MediaInternals callback. Called on the IO thread.
52  void OnUpdate(const base::string16& update);
53
54  // net::NetLog::ThreadSafeObserver implementation. Callable from any thread:
55  virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE;
56
57 private:
58  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
59  friend class base::DeleteHelper<MediaInternalsProxy>;
60  virtual ~MediaInternalsProxy();
61
62  // Build a dictionary mapping constant names to values.
63  base::Value* GetConstants();
64
65  void ObserveMediaInternalsOnIOThread();
66  void StopObservingMediaInternalsOnIOThread();
67  void GetEverythingOnIOThread();
68  void UpdateUIOnUIThread(const base::string16& update);
69
70  // Put |entry| on a list of events to be sent to the page.
71  void AddNetEventOnUIThread(base::Value* entry);
72
73  // Send all pending events to the page.
74  void SendNetEventsOnUIThread();
75
76  // Call a JavaScript function on the page. Takes ownership of |args|.
77  void CallJavaScriptFunctionOnUIThread(const std::string& function,
78                                        base::Value* args);
79
80  MediaInternalsMessageHandler* handler_;
81  scoped_ptr<base::ListValue> pending_net_updates_;
82  NotificationRegistrar registrar_;
83  MediaInternals::UpdateCallback update_callback_;
84
85  DISALLOW_COPY_AND_ASSIGN(MediaInternalsProxy);
86};
87
88}  // namespace content
89
90#endif  // CONTENT_BROWSER_MEDIA_MEDIA_INTERNALS_PROXY_H_
91