[iOS] Send the full list of file upload URLs and types in PasteboardItemInfo
[WebKit-https.git] / Source / WebCore / platform / ios / LowPowerModeNotifierIOS.mm
1 /*
2  * Copyright (C) 2017 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27
28 #if PLATFORM(IOS_FAMILY)
29
30 #import "LowPowerModeNotifier.h"
31
32 #import "Logging.h"
33 #import <Foundation/NSProcessInfo.h>
34 #import <wtf/MainThread.h>
35
36 @interface WebLowPowerModeObserver : NSObject
37 @property (nonatomic) WebCore::LowPowerModeNotifier* notifier;
38 @property (nonatomic, readonly) BOOL isLowPowerModeEnabled;
39 @end
40
41 @implementation WebLowPowerModeObserver {
42 }
43
44 - (WebLowPowerModeObserver *)initWithNotifier:(WebCore::LowPowerModeNotifier&)notifier
45 {
46     self = [super init];
47     if (!self)
48         return nil;
49
50     _notifier = &notifier;
51     _isLowPowerModeEnabled = [NSProcessInfo processInfo].lowPowerModeEnabled;
52     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didReceiveLowPowerModeChange) name:NSProcessInfoPowerStateDidChangeNotification object:nil];
53     return self;
54 }
55
56 - (void)dealloc
57 {
58     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSProcessInfoPowerStateDidChangeNotification object:nil];
59     [super dealloc];
60 }
61
62 - (void)_didReceiveLowPowerModeChange
63 {
64     _isLowPowerModeEnabled = [NSProcessInfo processInfo].lowPowerModeEnabled;
65     // We need to make sure we notify the client on the main thread.
66     callOnMainThread([self, protectedSelf = RetainPtr<WebLowPowerModeObserver>(self)] {
67         if (_notifier)
68             notifyLowPowerModeChanged(*_notifier, _isLowPowerModeEnabled);
69     });
70 }
71
72 @end
73
74 namespace WebCore {
75
76 LowPowerModeNotifier::LowPowerModeNotifier(LowPowerModeChangeCallback&& callback)
77     : m_observer(adoptNS([[WebLowPowerModeObserver alloc] initWithNotifier:*this]))
78     , m_callback(WTFMove(callback))
79 {
80 }
81
82 LowPowerModeNotifier::~LowPowerModeNotifier()
83 {
84     m_observer.get().notifier = nil;
85 }
86
87 bool LowPowerModeNotifier::isLowPowerModeEnabled() const
88 {
89     return m_observer.get().isLowPowerModeEnabled;
90 }
91
92 void LowPowerModeNotifier::notifyLowPowerModeChanged(bool enabled)
93 {
94     m_callback(enabled);
95 }
96
97 void notifyLowPowerModeChanged(LowPowerModeNotifier& notifier, bool enabled)
98 {
99     RELEASE_LOG(PerformanceLogging, "Low power mode state has changed to %d", enabled);
100     notifier.notifyLowPowerModeChanged(enabled);
101 }
102
103 } // namespace WebCore
104
105 #endif // PLATFORM(IOS_FAMILY)