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

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

Issue 2898733003: Split up ios/web:test_support. (Closed)
Patch Set: don't break downstream clients Created 3 years, 6 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 #import "ios/web/public/test/response_providers/delayed_response_provider.h"
6
7 #import <Foundation/Foundation.h>
8
9 #import "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 base::scoped_nsobject<GCDWebServerResponse> _response;
18 NSTimeInterval _delay;
19 }
20
21 + (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
22 delay:(NSTimeInterval)delay;
23 - (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
24 delay:(NSTimeInterval)delay;
25 @end
26
27 @implementation DelayedGCDWebServerResponse
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 dispatch_async(dispatch_get_main_queue(), ^{
52 base::WeakNSObject<GCDWebServerResponse> weakResponse(_response);
53 if ([_response
54 respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {
55 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
56 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
57 dispatch_get_main_queue(), ^{
58 base::scoped_nsobject<GCDWebServerResponse> response(
59 [weakResponse retain]);
60 [response asyncReadDataWithCompletion:block];
61 });
62 } else {
63 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
64 static_cast<int64_t>(_delay * NSEC_PER_SEC)),
65 dispatch_get_main_queue(), ^{
66 base::scoped_nsobject<GCDWebServerResponse> response(
67 [weakResponse retain]);
68 if (!response) {
69 return;
70 }
71 NSError* error = nil;
72 NSData* data = [response readData:&error];
73 block(data, error);
74 });
75 }
76 });
77 }
78
79 #pragma mark - NSProxy
80
81 - (BOOL)conformsToProtocol:(Protocol*)protocol {
82 return [[_response class] conformsToProtocol:protocol];
83 }
84
85 - (BOOL)respondsToSelector:(SEL)selector {
86 return [[_response class] instancesRespondToSelector:selector];
87 }
88
89 - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
90 return [[_response class] instanceMethodSignatureForSelector:selector];
91 }
92
93 - (void)forwardInvocation:(NSInvocation*)invocation {
94 SEL selector = [invocation selector];
95 if ([_response respondsToSelector:selector])
96 [invocation invokeWithTarget:_response];
97 }
98
99 @end
100
101 namespace web {
102
103 DelayedResponseProvider::DelayedResponseProvider(
104 std::unique_ptr<web::ResponseProvider> delayed_provider,
105 double delay)
106 : web::ResponseProvider(),
107 delayed_provider_(std::move(delayed_provider)),
108 delay_(delay) {}
109
110 DelayedResponseProvider::~DelayedResponseProvider() {}
111
112 bool DelayedResponseProvider::CanHandleRequest(const Request& request) {
113 return delayed_provider_->CanHandleRequest(request);
114 }
115
116 GCDWebServerResponse* DelayedResponseProvider::GetGCDWebServerResponse(
117 const Request& request) {
118 DelayedGCDWebServerResponse* response = [DelayedGCDWebServerResponse
119 responseWithServerResponse:delayed_provider_->GetGCDWebServerResponse(
120 request)
121 delay:delay_];
122 return base::mac::ObjCCastStrict<GCDWebServerResponse>(response);
123 }
124
125 } // namespace web
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698