Index: chrome/browser/device_orientation/dispatcher_host.cc |
diff --git a/chrome/browser/device_orientation/dispatcher_host.cc b/chrome/browser/device_orientation/dispatcher_host.cc |
index 605dc820f44f22bc89b7c5164d15db4313586329..c7d85db1066c159404911fb1391bc6021844d8ac 100644 |
--- a/chrome/browser/device_orientation/dispatcher_host.cc |
+++ b/chrome/browser/device_orientation/dispatcher_host.cc |
@@ -10,19 +10,71 @@ |
#include "chrome/browser/device_orientation/provider.h" |
#include "chrome/browser/renderer_host/render_view_host.h" |
#include "chrome/browser/renderer_host/render_view_host_notification_task.h" |
-#include "chrome/common/chrome_switches.h" |
#include "chrome/common/render_messages.h" |
#include "ipc/ipc_message.h" |
namespace device_orientation { |
DispatcherHost::DispatcherHost(int process_id) |
- : process_id_(process_id) { |
+ : process_id_(process_id), |
+ observers_map_(), |
+ provider_(NULL) { |
} |
DispatcherHost::~DispatcherHost() { |
- if (provider_) |
- provider_->RemoveObserver(this); |
+} |
+ |
+class DispatcherHost::ObserverDelegate |
+ : public base::RefCounted<ObserverDelegate>, public Provider::Observer { |
+ public: |
+ // Create ObserverDelegate that observes provider and forwards updates to |
+ // render_view_id in process_id. |
+ // Will stop observing provider when destructed. |
+ ObserverDelegate(Provider* provider, |
+ int process_id, |
+ int render_view_id); |
+ |
+ // From Provider::Observer. |
+ virtual void OnOrientationUpdate(const Orientation& orientation); |
+ |
+ private: |
+ friend class base::RefCounted<ObserverDelegate>; |
+ virtual ~ObserverDelegate(); |
+ |
+ scoped_refptr<Provider> provider_; |
+ int process_id_; |
+ int render_view_id_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ObserverDelegate); |
+}; |
+ |
+DispatcherHost::ObserverDelegate::ObserverDelegate(Provider* provider, |
+ int process_id, |
+ int render_view_id) |
+ : provider_(provider), |
+ process_id_(process_id), |
+ render_view_id_(render_view_id) { |
+ provider_->AddObserver(this); |
+} |
+ |
+DispatcherHost::ObserverDelegate::~ObserverDelegate() { |
+ provider_->RemoveObserver(this); |
+} |
+ |
+void DispatcherHost::ObserverDelegate::OnOrientationUpdate( |
+ const Orientation& orientation) { |
+ ViewMsg_DeviceOrientationUpdated_Params params; |
+ params.can_provide_alpha = orientation.can_provide_alpha_; |
+ params.alpha = orientation.alpha_; |
+ params.can_provide_beta = orientation.can_provide_beta_; |
+ params.beta = orientation.beta_; |
+ params.can_provide_gamma = orientation.can_provide_gamma_; |
+ params.gamma = orientation.gamma_; |
+ |
+ IPC::Message* message = new ViewMsg_DeviceOrientationUpdated(render_view_id_, |
+ params); |
+ CallRenderViewHost(process_id_, render_view_id_, &RenderViewHost::Send, |
+ message); |
} |
bool DispatcherHost::OnMessageReceived(const IPC::Message& msg, |
@@ -39,42 +91,21 @@ bool DispatcherHost::OnMessageReceived(const IPC::Message& msg, |
return handled; |
} |
-void DispatcherHost::OnOrientationUpdate(const Orientation& orientation) { |
- ViewMsg_DeviceOrientationUpdated_Params params; |
- params.can_provide_alpha = orientation.can_provide_alpha_; |
- params.alpha = orientation.alpha_; |
- params.can_provide_beta = orientation.can_provide_beta_; |
- params.beta = orientation.beta_; |
- params.can_provide_gamma = orientation.can_provide_gamma_; |
- params.gamma = orientation.gamma_; |
- |
- typedef std::set<int>::const_iterator Iterator; |
- for (Iterator i = render_view_ids_.begin(), e = render_view_ids_.end(); |
- i != e; ++i) { |
- IPC::Message* message = new ViewMsg_DeviceOrientationUpdated(*i, params); |
- CallRenderViewHost(process_id_, *i, &RenderViewHost::Send, message); |
- } |
-} |
- |
void DispatcherHost::OnStartUpdating(int render_view_id) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- render_view_ids_.insert(render_view_id); |
- if (render_view_ids_.size() == 1) { |
- DCHECK(!provider_); |
+ if (!provider_) |
provider_ = Provider::GetInstance(); |
- provider_->AddObserver(this); |
- } |
+ |
+ observers_map_[render_view_id] = new ObserverDelegate(provider_, |
+ process_id_, |
+ render_view_id); |
} |
void DispatcherHost::OnStopUpdating(int render_view_id) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- render_view_ids_.erase(render_view_id); |
- if (render_view_ids_.empty()) { |
- provider_->RemoveObserver(this); |
- provider_ = NULL; |
- } |
+ observers_map_.erase(render_view_id); |
} |
} // namespace device_orientation |