1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef UI_EVENTS_PLATFORM_SCOPED_EVENT_DISPATCHER_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define UI_EVENTS_PLATFORM_SCOPED_EVENT_DISPATCHER_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/auto_reset.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/basictypes.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/events_export.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace ui {
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass PlatformEventDispatcher;
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A temporary PlatformEventDispatcher can be installed on a
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// PlatformEventSource that overrides all installed event dispatchers, and
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// always gets a chance to dispatch the event first. The PlatformEventSource
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// returns a ScopedEventDispatcher object in such cases. This
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// ScopedEventDispatcher object can be used to dispatch the event to any
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// previous overridden dispatcher. When this object is destroyed, it removes the
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// override-dispatcher, and restores the previous override-dispatcher.
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass EVENTS_EXPORT ScopedEventDispatcher {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScopedEventDispatcher(PlatformEventDispatcher** scoped_dispatcher,
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        PlatformEventDispatcher* new_dispatcher);
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ~ScopedEventDispatcher();
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  operator PlatformEventDispatcher*() const { return original_; }
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PlatformEventDispatcher* original_;
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::AutoReset<PlatformEventDispatcher*> restore_;
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ScopedEventDispatcher);
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace ui
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // UI_EVENTS_PLATFORM_SCOPED_EVENT_DISPATCHER_H_
41