Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / graphics / DisplayRefreshMonitorManager.cpp
1 /*
2  * Copyright (C) 2010, 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "DisplayRefreshMonitorManager.h"
28
29 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
30
31 #include "DisplayRefreshMonitor.h"
32 #include "DisplayRefreshMonitorClient.h"
33 #include <wtf/CurrentTime.h>
34
35 namespace WebCore {
36
37 DisplayRefreshMonitorManager::~DisplayRefreshMonitorManager() = default;
38
39 DisplayRefreshMonitorManager& DisplayRefreshMonitorManager::sharedManager()
40 {
41     static NeverDestroyed<DisplayRefreshMonitorManager> manager;
42     return manager.get();
43 }
44
45 DisplayRefreshMonitor* DisplayRefreshMonitorManager::createMonitorForClient(DisplayRefreshMonitorClient& client)
46 {
47     PlatformDisplayID clientDisplayID = client.displayID();
48     for (const RefPtr<DisplayRefreshMonitor>& monitor : m_monitors) {
49         if (monitor->displayID() != clientDisplayID)
50             continue;
51         monitor->addClient(client);
52         return monitor.get();
53     }
54
55     auto monitor = DisplayRefreshMonitor::create(client);
56     if (!monitor)
57         return nullptr;
58
59     monitor->addClient(client);
60     DisplayRefreshMonitor* result = monitor.get();
61     m_monitors.append(WTFMove(monitor));
62     return result;
63 }
64
65 void DisplayRefreshMonitorManager::registerClient(DisplayRefreshMonitorClient& client)
66 {
67     if (!client.hasDisplayID())
68         return;
69
70     createMonitorForClient(client);
71 }
72
73 void DisplayRefreshMonitorManager::unregisterClient(DisplayRefreshMonitorClient& client)
74 {
75     if (!client.hasDisplayID())
76         return;
77
78     PlatformDisplayID clientDisplayID = client.displayID();
79     for (size_t i = 0; i < m_monitors.size(); ++i) {
80         RefPtr<DisplayRefreshMonitor> monitor = m_monitors[i];
81         if (monitor->displayID() != clientDisplayID)
82             continue;
83         if (monitor->removeClient(client)) {
84             if (!monitor->hasClients())
85                 m_monitors.remove(i);
86         }
87         return;
88     }
89 }
90
91 bool DisplayRefreshMonitorManager::scheduleAnimation(DisplayRefreshMonitorClient& client)
92 {
93     if (!client.hasDisplayID())
94         return false;
95
96     DisplayRefreshMonitor* monitor = createMonitorForClient(client);
97     if (!monitor)
98         return false;
99
100     client.setIsScheduled(true);
101     return monitor->requestRefreshCallback();
102 }
103
104 void DisplayRefreshMonitorManager::displayDidRefresh(DisplayRefreshMonitor& monitor)
105 {
106     if (!monitor.shouldBeTerminated())
107         return;
108
109     size_t monitorIndex = m_monitors.find(&monitor);
110     if (monitorIndex != notFound)
111         m_monitors.remove(monitorIndex);
112 }
113
114 void DisplayRefreshMonitorManager::windowScreenDidChange(PlatformDisplayID displayID, DisplayRefreshMonitorClient& client)
115 {
116     if (client.hasDisplayID() && client.displayID() == displayID)
117         return;
118     
119     unregisterClient(client);
120     client.setDisplayID(displayID);
121     registerClient(client);
122     if (client.isScheduled())
123         scheduleAnimation(client);
124 }
125
126 }
127
128 #endif // USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)