OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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 "ios/web/public/test/response_providers/delayed_response_provider.h" | |
6 | |
7 #import <Foundation/Foundation.h> | |
8 | |
9 #import "base/mac/scoped_nsobject.h" | |
10 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Responses/GCDWebServerDat aResponse.h" | |
11 | |
12 @interface DelayedGCDWebServerResponse : NSProxy | |
stkhapugin
2016/08/26 13:06:48
Class comment here.
Olivier
2016/08/26 14:10:04
Done.
| |
13 | |
14 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response | |
15 delay:(NSTimeInterval)delay; | |
16 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response | |
17 delay:(NSTimeInterval)delay; | |
18 @end | |
19 | |
20 @implementation DelayedGCDWebServerResponse { | |
21 base::scoped_nsobject<GCDWebServerResponse> _response; | |
22 NSTimeInterval _delay; | |
23 } | |
24 | |
25 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response | |
26 delay:(NSTimeInterval)delay { | |
27 return [[[DelayedGCDWebServerResponse alloc] initWithServerResponse:response | |
28 delay:delay] | |
29 autorelease]; | |
30 } | |
31 | |
32 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response | |
33 delay:(NSTimeInterval)delay { | |
34 _response.reset([response retain]); | |
35 _delay = delay; | |
36 return self; | |
37 } | |
38 | |
39 #pragma mark - GCDWebServerResponse | |
40 | |
41 - (void)performReadDataWithCompletion: | |
42 (GCDWebServerBodyReaderCompletionBlock)block { | |
43 [self asyncReadDataWithCompletion:block]; | |
44 } | |
45 | |
46 - (void)asyncReadDataWithCompletion: | |
47 (GCDWebServerBodyReaderCompletionBlock)block { | |
48 if ([_response respondsToSelector:@selector(asyncReadDataWithCompletion:)]) { | |
49 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, | |
50 static_cast<int64_t>(_delay * NSEC_PER_SEC)), | |
51 dispatch_get_main_queue(), ^{ | |
52 [_response asyncReadDataWithCompletion:block]; | |
53 }); | |
54 } else { | |
55 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, | |
56 static_cast<int64_t>(_delay * NSEC_PER_SEC)), | |
57 dispatch_get_main_queue(), ^{ | |
58 NSError* error = nil; | |
59 NSData* data = [_response readData:&error]; | |
60 block(data, error); | |
61 }); | |
62 } | |
63 } | |
64 | |
65 #pragma mark - NSProxy | |
66 | |
67 - (BOOL)conformsToProtocol:(Protocol*)protocol { | |
68 return [[_response class] conformsToProtocol:protocol]; | |
69 } | |
70 | |
71 - (BOOL)respondsToSelector:(SEL)selector { | |
72 return [[_response class] instancesRespondToSelector:selector]; | |
73 } | |
74 | |
75 - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { | |
76 return [[_response class] instanceMethodSignatureForSelector:selector]; | |
77 } | |
78 | |
79 - (void)forwardInvocation:(NSInvocation*)invocation { | |
80 SEL selector = [invocation selector]; | |
81 if ([_response respondsToSelector:selector]) | |
82 [invocation invokeWithTarget:_response]; | |
83 } | |
84 | |
85 @end | |
86 | |
87 namespace web { | |
88 | |
89 DelayedResponseProvider::DelayedResponseProvider( | |
90 std::unique_ptr<web::ResponseProvider> delayed_provider, | |
91 double delay) | |
92 : web::ResponseProvider(), | |
93 delayed_provider_(std::move(delayed_provider)), | |
94 delay_(delay) {} | |
95 | |
96 DelayedResponseProvider::~DelayedResponseProvider() {} | |
97 | |
98 bool DelayedResponseProvider::CanHandleRequest(const Request& request) { | |
99 return delayed_provider_->CanHandleRequest(request); | |
100 } | |
101 | |
102 GCDWebServerResponse* DelayedResponseProvider::GetGCDWebServerResponse( | |
103 const Request& request) { | |
104 return static_cast<id>([DelayedGCDWebServerResponse | |
stkhapugin
2016/08/26 13:06:48
ObjCCastStrict or ObjCCast instead of static_cast;
Olivier
2016/08/26 14:10:03
Done.
| |
105 responseWithServerResponse:delayed_provider_->GetGCDWebServerResponse( | |
106 request) | |
107 delay:delay_]); | |
108 } | |
109 | |
110 } // namespace web | |
OLD | NEW |