Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / cocoa / LayerFlushSchedulerMac.cpp
1 /*
2  * Copyright (C) 2011 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 "LayerFlushScheduler.h"
28
29 #include <wtf/AutodrainedPool.h>
30
31 #if PLATFORM(IOS)
32 #include "RuntimeApplicationChecks.h"
33 #include "WebCoreThreadInternal.h"
34 #include <CoreFoundation/CFBundle.h>
35 #endif
36
37 namespace WebCore {
38
39 static const CFIndex layerFlushRunLoopOrder = (CFIndex)RunLoopObserver::WellKnownRunLoopOrders::CoreAnimationCommit - 1;
40
41 static CFRunLoopRef currentRunLoop()
42 {
43 #if PLATFORM(IOS)
44     // A race condition during WebView deallocation can lead to a crash if the layer sync run loop
45     // observer is added to the main run loop <rdar://problem/9798550>. However, for responsiveness,
46     // we still allow this, see <rdar://problem/7403328>. Since the race condition and subsequent
47     // crash are especially troublesome for iBooks, we never allow the observer to be added to the
48     // main run loop in iBooks.
49     if (IOSApplication::isIBooks())
50         return WebThreadRunLoop();
51 #endif
52     return CFRunLoopGetCurrent();
53 }
54
55 LayerFlushScheduler::LayerFlushScheduler(LayerFlushSchedulerClient* client)
56     : m_isSuspended(false)
57     , m_client(client)
58 {
59     ASSERT_ARG(client, client);
60
61     m_runLoopObserver = std::make_unique<RunLoopObserver>(layerFlushRunLoopOrder, [this]() {
62         if (this->isSuspended())
63             return;
64         this->layerFlushCallback();
65     });
66 }
67
68 LayerFlushScheduler::~LayerFlushScheduler() = default;
69
70 void LayerFlushScheduler::layerFlushCallback()
71 {
72     ASSERT(!m_isSuspended);
73
74     AutodrainedPool pool;
75     if (m_client->flushLayers())
76         invalidate();
77 }
78
79 void LayerFlushScheduler::schedule()
80 {
81     if (m_isSuspended)
82         return;
83
84     m_runLoopObserver->schedule(currentRunLoop());
85 }
86
87 void LayerFlushScheduler::invalidate()
88 {
89     m_runLoopObserver->invalidate();
90 }
91     
92 } // namespace WebCore