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