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

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
« no previous file with comments | « ios/web/public/test/response_providers/delayed_response_provider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "base/ios/weak_nsobject.h"
10 #import "base/mac/scoped_nsobject.h"
11 #import "base/mac/foundation_util.h"
12 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Responses/GCDWebServerDat aResponse.h"
13
14 // A proxy class that will forward all messages to the |_response|.
15 // It will delay read operation |_delay| seconds.
16 @interface DelayedGCDWebServerResponse : NSProxy
17
18 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
19 delay:(NSTimeInterval)delay;
20 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
21 delay:(NSTimeInterval)delay;
22 @end
23
24 @implementation DelayedGCDWebServerResponse {
25 base::scoped_nsobject<GCDWebServerResponse> _response;
marq (ping after 24h) 2016/08/29 08:59:12 Missed this earlier: chromium style is to not put
Olivier 2016/08/29 10:42:14 Done.
26 NSTimeInterval _delay;
27 }
28
29 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
30 delay:(NSTimeInterval)delay {
31 return [[[DelayedGCDWebServerResponse alloc] initWithServerResponse:response
32 delay:delay]
33 autorelease];
34 }
35
36 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
37 delay:(NSTimeInterval)delay {
38 _response.reset([response retain]);
marq (ping after 24h) 2016/08/29 08:59:12 If this file was compiled under ARC, then the -ret
Olivier 2016/08/29 10:42:14 This file is not compiled with ARC. As said above,
marq (ping after 24h) 2016/08/29 16:03:19 Sorry, I misunderstood. If this file isn't compile
Olivier 2016/08/29 16:11:50 Acknowledged.
39 _delay = delay;
40 return self;
41 }
42
43 #pragma mark - GCDWebServerResponse
44
45 - (void)performReadDataWithCompletion:
46 (GCDWebServerBodyReaderCompletionBlock)block {
47 [self asyncReadDataWithCompletion:block];
48 }
49
50 - (void)asyncReadDataWithCompletion:
51 (GCDWebServerBodyReaderCompletionBlock)block {
52 dispatch_async(dispatch_get_main_queue(), ^{
53 base::WeakNSObject<GCDWebServerResponse> weakResponse(_response);
54 if ([_response
55 respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {
56 dispatch_after(
57 dispatch_time(DISPATCH_TIME_NOW,
58 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
59 dispatch_get_main_queue(), ^{
60 base::scoped_nsobject<GCDWebServerResponse> response(_response);
61 [response asyncReadDataWithCompletion:block];
62 });
63 } else {
64 dispatch_after(
65 dispatch_time(DISPATCH_TIME_NOW,
66 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
67 dispatch_get_main_queue(), ^{
68 base::scoped_nsobject<GCDWebServerResponse> response(_response);
69 if (!response) {
70 return;
71 }
72 NSError* error = nil;
73 NSData* data = [response readData:&error];
74 block(data, error);
75 });
76 }
77 });
78 }
79
80 #pragma mark - NSProxy
81
82 - (BOOL)conformsToProtocol:(Protocol*)protocol {
83 return [[_response class] conformsToProtocol:protocol];
84 }
85
86 - (BOOL)respondsToSelector:(SEL)selector {
87 return [[_response class] instancesRespondToSelector:selector];
88 }
89
90 - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
91 return [[_response class] instanceMethodSignatureForSelector:selector];
92 }
93
94 - (void)forwardInvocation:(NSInvocation*)invocation {
95 SEL selector = [invocation selector];
96 if ([_response respondsToSelector:selector])
97 [invocation invokeWithTarget:_response];
98 }
99
100 @end
101
102 namespace web {
103
104 DelayedResponseProvider::DelayedResponseProvider(
105 std::unique_ptr<web::ResponseProvider> delayed_provider,
106 double delay)
107 : web::ResponseProvider(),
108 delayed_provider_(std::move(delayed_provider)),
109 delay_(delay) {}
110
111 DelayedResponseProvider::~DelayedResponseProvider() {}
112
113 bool DelayedResponseProvider::CanHandleRequest(const Request& request) {
114 return delayed_provider_->CanHandleRequest(request);
115 }
116
117 GCDWebServerResponse* DelayedResponseProvider::GetGCDWebServerResponse(
118 const Request& request) {
119 DelayedGCDWebServerResponse* response = [DelayedGCDWebServerResponse
120 responseWithServerResponse:delayed_provider_->GetGCDWebServerResponse(
121 request)
122 delay:delay_];
123 return base::mac::ObjCCastStrict<GCDWebServerResponse>(response);
124 }
125
126 } // namespace web
OLDNEW
« no previous file with comments | « ios/web/public/test/response_providers/delayed_response_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698