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

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: comments 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 "base/mac/foundation_util.h"
11 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Responses/GCDWebServerDat aResponse.h"
12
13 // A proxy class that will forward all messages to the |_response|.
14 // It will delay read operation |_delay| seconds.
15 @interface DelayedGCDWebServerResponse : NSProxy
16
17 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
18 delay:(NSTimeInterval)delay;
19 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
20 delay:(NSTimeInterval)delay;
21 @end
22
23 @implementation DelayedGCDWebServerResponse {
24 base::scoped_nsobject<GCDWebServerResponse> _response;
marq (ping after 24h) 2016/08/29 08:16:36 is ios/third_party on ARC yet?
Olivier 2016/08/29 08:48:10 GCDWebServer is ARC, yes. Should I do something sp
marq (ping after 24h) 2016/08/29 08:59:12 Two things. First, there's no need to use scoped_n
Olivier 2016/08/29 10:42:14 But this file is not compiled with ARC. GCDWebServ
25 NSTimeInterval _delay;
26 }
27
28 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
29 delay:(NSTimeInterval)delay {
30 return [[[DelayedGCDWebServerResponse alloc] initWithServerResponse:response
31 delay:delay]
32 autorelease];
33 }
34
35 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
36 delay:(NSTimeInterval)delay {
37 _response.reset([response retain]);
38 _delay = delay;
39 return self;
40 }
41
42 #pragma mark - GCDWebServerResponse
43
44 - (void)performReadDataWithCompletion:
45 (GCDWebServerBodyReaderCompletionBlock)block {
46 [self asyncReadDataWithCompletion:block];
47 }
48
49 - (void)asyncReadDataWithCompletion:
50 (GCDWebServerBodyReaderCompletionBlock)block {
51 if ([_response respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {
52 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
53 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
54 dispatch_get_main_queue(), ^{
55 [_response asyncReadDataWithCompletion:block];
marq (ping after 24h) 2016/08/29 08:16:36 This (and the block below) guarantees that the rec
Olivier 2016/08/29 08:48:10 Done.
56 });
57 } else {
58 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
59 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
60 dispatch_get_main_queue(), ^{
61 NSError* error = nil;
62 NSData* data = [_response readData:&error];
63 block(data, error);
64 });
65 }
66 }
67
68 #pragma mark - NSProxy
69
70 - (BOOL)conformsToProtocol:(Protocol*)protocol {
71 return [[_response class] conformsToProtocol:protocol];
72 }
73
74 - (BOOL)respondsToSelector:(SEL)selector {
75 return [[_response class] instancesRespondToSelector:selector];
76 }
77
78 - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
79 return [[_response class] instanceMethodSignatureForSelector:selector];
80 }
81
82 - (void)forwardInvocation:(NSInvocation*)invocation {
83 SEL selector = [invocation selector];
84 if ([_response respondsToSelector:selector])
85 [invocation invokeWithTarget:_response];
86 }
87
88 @end
89
90 namespace web {
91
92 DelayedResponseProvider::DelayedResponseProvider(
93 std::unique_ptr<web::ResponseProvider> delayed_provider,
94 double delay)
95 : web::ResponseProvider(),
96 delayed_provider_(std::move(delayed_provider)),
97 delay_(delay) {}
98
99 DelayedResponseProvider::~DelayedResponseProvider() {}
100
101 bool DelayedResponseProvider::CanHandleRequest(const Request& request) {
102 return delayed_provider_->CanHandleRequest(request);
103 }
104
105 GCDWebServerResponse* DelayedResponseProvider::GetGCDWebServerResponse(
106 const Request& request) {
107 DelayedGCDWebServerResponse* response = [DelayedGCDWebServerResponse
108 responseWithServerResponse:delayed_provider_->GetGCDWebServerResponse(
109 request)
110 delay:delay_];
111 return base::mac::ObjCCastStrict<GCDWebServerResponse>(response);
112 }
113
114 } // namespace web
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698