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