Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(749)

Side by Side Diff: ios/web/public/test/response_providers/delayed_response_provider.mm

Issue 2282463002: Create a Delayed Response Provider for GCDWebServer. (Closed)
Patch Set: namespace Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698