OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/open_from_clipboard/clipboard_recent_content_ios.h" | 5 #import "components/open_from_clipboard/clipboard_recent_content_ios.h" |
6 | 6 |
7 #import <UIKit/UIKit.h> | 7 #import <UIKit/UIKit.h> |
8 | 8 |
9 #include "base/ios/ios_util.h" | 9 #import "base/ios/ios_util.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "base/memory/singleton.h" | |
13 #include "base/metrics/user_metrics.h" | 12 #include "base/metrics/user_metrics.h" |
14 #include "base/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
15 #include "base/sys_info.h" | 14 #include "base/sys_info.h" |
16 #include "url/gurl.h" | 15 #include "url/gurl.h" |
17 #include "url/url_constants.h" | 16 #include "url/url_constants.h" |
18 | 17 |
19 ClipboardRecentContent* ClipboardRecentContent::GetInstance() { | 18 // Bridge that forwards pasteboard change notifications to its delegate. |
20 return ClipboardRecentContentIOS::GetInstance(); | 19 @interface PasteboardNotificationListenerBridge : NSObject |
| 20 |
| 21 // Initialize the PasteboardNotificationListenerBridge with |delegate| which |
| 22 // must not be null. |
| 23 - (instancetype)initWithDelegate:(ClipboardRecentContentIOS*)delegate |
| 24 NS_DESIGNATED_INITIALIZER; |
| 25 |
| 26 - (instancetype)init NS_UNAVAILABLE; |
| 27 |
| 28 @end |
| 29 |
| 30 @implementation PasteboardNotificationListenerBridge { |
| 31 ClipboardRecentContentIOS* _delegate; |
21 } | 32 } |
22 | 33 |
23 // Bridge that forwards pasteboard change notifications to its delegate. | 34 - (instancetype)init { |
24 @interface PasteboardNotificationListenerBridge : NSObject { | 35 NOTREACHED(); |
25 ClipboardRecentContentIOS* _delegate; | 36 return nil; |
26 } | 37 } |
27 @end | |
28 | 38 |
29 @implementation PasteboardNotificationListenerBridge | 39 - (instancetype)initWithDelegate:(ClipboardRecentContentIOS*)delegate { |
30 | |
31 - (id)initWithDelegate:(ClipboardRecentContentIOS*)delegate { | |
32 DCHECK(delegate); | 40 DCHECK(delegate); |
33 self = [super init]; | 41 self = [super init]; |
34 if (self) { | 42 if (self) { |
35 _delegate = delegate; | 43 _delegate = delegate; |
36 [[NSNotificationCenter defaultCenter] | 44 [[NSNotificationCenter defaultCenter] |
37 addObserver:self | 45 addObserver:self |
38 selector:@selector(pasteboardChangedNotification:) | 46 selector:@selector(pasteboardChangedNotification:) |
39 name:UIPasteboardChangedNotification | 47 name:UIPasteboardChangedNotification |
40 object:[UIPasteboard generalPasteboard]]; | 48 object:[UIPasteboard generalPasteboard]]; |
41 [[NSNotificationCenter defaultCenter] | 49 [[NSNotificationCenter defaultCenter] |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 base::TimeDelta kMaximumAgeOfClipboard = base::TimeDelta::FromHours(3); | 85 base::TimeDelta kMaximumAgeOfClipboard = base::TimeDelta::FromHours(3); |
78 // Schemes accepted by the ClipboardRecentContentIOS. | 86 // Schemes accepted by the ClipboardRecentContentIOS. |
79 const char* kAuthorizedSchemes[] = { | 87 const char* kAuthorizedSchemes[] = { |
80 url::kHttpScheme, | 88 url::kHttpScheme, |
81 url::kHttpsScheme, | 89 url::kHttpsScheme, |
82 url::kDataScheme, | 90 url::kDataScheme, |
83 url::kAboutScheme, | 91 url::kAboutScheme, |
84 }; | 92 }; |
85 } // namespace | 93 } // namespace |
86 | 94 |
87 ClipboardRecentContentIOS* ClipboardRecentContentIOS::GetInstance() { | |
88 return Singleton<ClipboardRecentContentIOS>::get(); | |
89 } | |
90 | |
91 bool ClipboardRecentContentIOS::GetRecentURLFromClipboard(GURL* url) const { | 95 bool ClipboardRecentContentIOS::GetRecentURLFromClipboard(GURL* url) const { |
92 DCHECK(url); | 96 DCHECK(url); |
93 if (GetClipboardContentAge() > kMaximumAgeOfClipboard || | 97 if (GetClipboardContentAge() > kMaximumAgeOfClipboard || |
94 [UIPasteboard generalPasteboard].changeCount == | 98 [UIPasteboard generalPasteboard].changeCount == |
95 suppressedPasteboardEntryCount_) { | 99 suppressedPasteboardEntryCount_) { |
96 return false; | 100 return false; |
97 } | 101 } |
98 | 102 |
99 if (urlFromPasteboardCache_.is_valid()) { | 103 if (urlFromPasteboardCache_.is_valid()) { |
100 *url = urlFromPasteboardCache_; | 104 *url = urlFromPasteboardCache_; |
(...skipping 19 matching lines...) Expand all Loading... |
120 base::RecordAction( | 124 base::RecordAction( |
121 base::UserMetricsAction("MobileOmniboxClipboardChanged")); | 125 base::UserMetricsAction("MobileOmniboxClipboardChanged")); |
122 } | 126 } |
123 lastPasteboardChangeDate_.reset([[NSDate date] retain]); | 127 lastPasteboardChangeDate_.reset([[NSDate date] retain]); |
124 lastPasteboardChangeCount_ = [UIPasteboard generalPasteboard].changeCount; | 128 lastPasteboardChangeCount_ = [UIPasteboard generalPasteboard].changeCount; |
125 if (lastPasteboardChangeCount_ != suppressedPasteboardEntryCount_) { | 129 if (lastPasteboardChangeCount_ != suppressedPasteboardEntryCount_) { |
126 suppressedPasteboardEntryCount_ = NSIntegerMax; | 130 suppressedPasteboardEntryCount_ = NSIntegerMax; |
127 } | 131 } |
128 } | 132 } |
129 | 133 |
130 ClipboardRecentContentIOS::ClipboardRecentContentIOS() { | 134 ClipboardRecentContentIOS::ClipboardRecentContentIOS( |
| 135 const std::string& application_scheme) |
| 136 : application_scheme_(application_scheme) { |
131 Init(base::TimeDelta::FromMilliseconds(base::SysInfo::Uptime())); | 137 Init(base::TimeDelta::FromMilliseconds(base::SysInfo::Uptime())); |
132 } | 138 } |
133 | 139 |
134 ClipboardRecentContentIOS::ClipboardRecentContentIOS(base::TimeDelta uptime) { | 140 ClipboardRecentContentIOS::ClipboardRecentContentIOS( |
| 141 const std::string& application_scheme, |
| 142 base::TimeDelta uptime) |
| 143 : application_scheme_(application_scheme) { |
135 Init(uptime); | 144 Init(uptime); |
136 } | 145 } |
137 | 146 |
138 void ClipboardRecentContentIOS::Init(base::TimeDelta uptime) { | 147 void ClipboardRecentContentIOS::Init(base::TimeDelta uptime) { |
139 lastPasteboardChangeCount_ = NSIntegerMax; | 148 lastPasteboardChangeCount_ = NSIntegerMax; |
140 suppressedPasteboardEntryCount_ = NSIntegerMax; | 149 suppressedPasteboardEntryCount_ = NSIntegerMax; |
141 urlFromPasteboardCache_ = URLFromPasteboard(); | 150 urlFromPasteboardCache_ = URLFromPasteboard(); |
142 LoadFromUserDefaults(); | 151 LoadFromUserDefaults(); |
143 | 152 |
144 // On iOS 7 (unlike on iOS 8, despite what the documentation says), the change | 153 // On iOS 7 (unlike on iOS 8, despite what the documentation says), the change |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 226 |
218 void ClipboardRecentContentIOS::SaveToUserDefaults() { | 227 void ClipboardRecentContentIOS::SaveToUserDefaults() { |
219 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 228 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
220 [defaults setInteger:lastPasteboardChangeCount_ | 229 [defaults setInteger:lastPasteboardChangeCount_ |
221 forKey:kPasteboardChangeCountKey]; | 230 forKey:kPasteboardChangeCountKey]; |
222 [defaults setObject:lastPasteboardChangeDate_ | 231 [defaults setObject:lastPasteboardChangeDate_ |
223 forKey:kPasteboardChangeDateKey]; | 232 forKey:kPasteboardChangeDateKey]; |
224 [defaults setInteger:suppressedPasteboardEntryCount_ | 233 [defaults setInteger:suppressedPasteboardEntryCount_ |
225 forKey:kSuppressedPasteboardEntryCountKey]; | 234 forKey:kSuppressedPasteboardEntryCountKey]; |
226 } | 235 } |
OLD | NEW |