103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef CONTENT_PUBLIC_RENDERER_PLATFORM_EVENT_OBSERVER_H_ 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define CONTENT_PUBLIC_RENDERER_PLATFORM_EVENT_OBSERVER_H_ 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/logging.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/render_process_observer.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/render_thread.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace blink { 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class WebPlatformEventListener; 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace content { 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This class is used as a base class for PlatformEventObserver<ListenerType> to 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// allow storing PlatformEventObserver<> with different typename in the same 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// place. 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class PlatformEventObserverBase { 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~PlatformEventObserverBase() { } 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Methods that need to be exposed in PlatformEventObserverBase. Their purpose 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // is described in PlatformEventObserver<>. 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Start(blink::WebPlatformEventListener* listener) = 0; 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Stop() = 0; 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Helper method that allows an sub-class to write its own test helper. 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The |data| type MUST be known from the caller. 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void SendFakeDataForTesting(void* data) { } 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// PlatformEventObserver<> defines the basic skeleton for an object requesting 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// the browser process to start/stop listening to some platform/hardware events 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// and observe the result. 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// The results are received via IPC, assuming that the object was correctly 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// registered as an observer via the constructor taking a RenderThread. 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)template <typename ListenerType> 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class PlatformEventObserver : public PlatformEventObserverBase, 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public RenderProcessObserver { 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Creates a PlatformEventObserver that doesn't listen to responses from the 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // browser process. Can be used for testing purposes or for observers that 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // have other means to get their results. 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PlatformEventObserver() 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : is_observing_(false), 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) listener_(0) { 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Creates a PlatformEventObserver that registers to the RenderThread in order 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // to intercept the received IPC messages (via OnControlMessageReceived). If 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |thread| is null, it will not register. 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) explicit PlatformEventObserver(RenderThread* thread) 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : is_observing_(false), 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) listener_(0) { 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (thread) 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) thread->AddObserver(this); 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The observer will automatically stop observing when destroyed in case it 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // did not stop before. 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~PlatformEventObserver() { 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_observing()) 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Stop(); 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when a new IPC message is received. Must be used to listen to the 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // responses from the browser process if any expected. 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool OnControlMessageReceived(const IPC::Message& msg) OVERRIDE { 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Start observing. Will request the browser process to start listening to the 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // events. |listener| will receive any response from the browser process. 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Note: should not be called if already observing. 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Start(blink::WebPlatformEventListener* listener) { 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!is_observing()); 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) listener_ = static_cast<ListenerType*>(listener); 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_observing_ = true; 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SendStartMessage(); 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Stop observing. Will let the browser know that it doesn't need to observe 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // anymore. 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Stop() { 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(is_observing()); 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) listener_ = 0; 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_observing_ = false; 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SendStopMessage(); 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) protected: 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // This method is expected to send an IPC to the browser process to let it 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // know that it should start observing. 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // It is expected for subclasses to override it. 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void SendStartMessage() = 0; 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // This method is expected to send an IPC to the browser process to let it 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // know that it should start observing. 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // It is expected for subclasses to override it. 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void SendStopMessage() = 0; 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool is_observing() const { 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return is_observing_; 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ListenerType* listener() { 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return listener_; 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private: 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool is_observing_; 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ListenerType* listener_; 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PlatformEventObserver); 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace content 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // CONTENT_PUBLIC_RENDERER_PLATFORM_EVENT_OBSERVER_H_ 126