1// Copyright 2014 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#include "config.h"
6#include "core/frame/DeviceSingleWindowEventController.h"
7
8#include "core/dom/Document.h"
9#include "core/events/Event.h"
10#include "core/frame/LocalDOMWindow.h"
11#include "core/page/Page.h"
12
13namespace blink {
14
15DeviceSingleWindowEventController::DeviceSingleWindowEventController(Document& document)
16    : PlatformEventController(document.page())
17    , DOMWindowLifecycleObserver(document.domWindow())
18    , m_needsCheckingNullEvents(true)
19    , m_document(document)
20{
21}
22
23DeviceSingleWindowEventController::~DeviceSingleWindowEventController()
24{
25}
26
27void DeviceSingleWindowEventController::didUpdateData()
28{
29    dispatchDeviceEvent(lastEvent());
30}
31
32void DeviceSingleWindowEventController::dispatchDeviceEvent(PassRefPtrWillBeRawPtr<Event> prpEvent)
33{
34    if (!document().domWindow() || document().activeDOMObjectsAreSuspended() || document().activeDOMObjectsAreStopped())
35        return;
36
37    RefPtrWillBeRawPtr<Event> event = prpEvent;
38    document().domWindow()->dispatchEvent(event);
39
40    if (m_needsCheckingNullEvents) {
41        if (isNullEvent(event.get()))
42            stopUpdating();
43        else
44            m_needsCheckingNullEvents = false;
45    }
46}
47
48void DeviceSingleWindowEventController::didAddEventListener(LocalDOMWindow* window, const AtomicString& eventType)
49{
50    if (eventType != eventTypeName())
51        return;
52
53    if (page() && page()->visibilityState() == PageVisibilityStateVisible)
54        startUpdating();
55
56    m_hasEventListener = true;
57}
58
59void DeviceSingleWindowEventController::didRemoveEventListener(LocalDOMWindow* window, const AtomicString& eventType)
60{
61    if (eventType != eventTypeName() || window->hasEventListeners(eventTypeName()))
62        return;
63
64    stopUpdating();
65    m_hasEventListener = false;
66}
67
68void DeviceSingleWindowEventController::didRemoveAllEventListeners(LocalDOMWindow*)
69{
70    stopUpdating();
71    m_hasEventListener = false;
72}
73
74void DeviceSingleWindowEventController::trace(Visitor* visitor)
75{
76    visitor->trace(m_document);
77}
78
79} // namespace blink
80