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

Side by Side Diff: chrome/browser/extensions/api/streams_private/streams_resource_throttle_unittest.cc

Issue 12381035: Move Mime type handling to streamsPrivate API, so that it works on Desktop Chrome. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Initialize test variable Created 7 years, 9 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop.h" 5 #include "base/message_loop.h"
6 #include "chrome/browser/chromeos/extensions/file_browser_handler.h" 6 #include "chrome/browser/extensions/api/streams_private/streams_resource_throttl e.h"
7 #include "chrome/browser/chromeos/extensions/file_browser_resource_throttle.h"
8 #include "chrome/browser/extensions/extension_info_map.h" 7 #include "chrome/browser/extensions/extension_info_map.h"
9 #include "chrome/common/extensions/extension.h" 8 #include "chrome/common/extensions/extension.h"
10 #include "chrome/common/extensions/extension_builder.h" 9 #include "chrome/common/extensions/extension_builder.h"
11 #include "chrome/common/extensions/extension_constants.h" 10 #include "chrome/common/extensions/extension_constants.h"
12 #include "chrome/common/extensions/manifest_handler.h" 11 #include "chrome/common/extensions/manifest_handler.h"
12 #include "chrome/common/extensions/mime_types_handler.h"
13 #include "chrome/common/extensions/value_builder.h" 13 #include "chrome/common/extensions/value_builder.h"
14 #include "content/public/browser/resource_controller.h" 14 #include "content/public/browser/resource_controller.h"
15 #include "content/public/test/test_browser_thread.h" 15 #include "content/public/test/test_browser_thread.h"
16 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 18
19 using content::BrowserThread; 19 using content::BrowserThread;
20 using extensions::DictionaryBuilder; 20 using extensions::DictionaryBuilder;
21 using extensions::Extension; 21 using extensions::Extension;
22 using extensions::ExtensionBuilder; 22 using extensions::ExtensionBuilder;
23 using extensions::ListBuilder; 23 using extensions::ListBuilder;
24 using testing::_; 24 using testing::_;
25 25
26 namespace { 26 namespace {
27 27
28 // Mock file browser handler event router to be used in the test. 28 // Mock file browser handler event router to be used in the test.
29 class MockFileBrowserHandlerEventRouter 29 class MockStreamsPrivateEventRouter
30 : public FileBrowserResourceThrottle::FileBrowserHandlerEventRouter { 30 : public StreamsResourceThrottle::StreamsPrivateEventRouter {
31 public: 31 public:
32 virtual ~MockFileBrowserHandlerEventRouter() {} 32 virtual ~MockStreamsPrivateEventRouter() {}
33 33
34 MOCK_METHOD5(DispatchMimeTypeHandlerEvent, 34 MOCK_METHOD5(DispatchMimeTypeHandlerEvent,
35 void(int render_process_id, 35 void(int render_process_id,
36 int render_process_view, 36 int render_process_view,
37 const std::string& mime_type, 37 const std::string& mime_type,
38 const GURL& request_url, 38 const GURL& request_url,
39 const std::string& extension_id)); 39 const std::string& extension_id));
40 }; 40 };
41 41
42 // Resource controller to be used in the tests. 42 // Resource controller to be used in the tests.
43 class MockResourceController : public content::ResourceController { 43 class MockResourceController : public content::ResourceController {
44 public: 44 public:
45 virtual ~MockResourceController() {} 45 virtual ~MockResourceController() {}
46 MOCK_METHOD0(Cancel, void()); 46 MOCK_METHOD0(Cancel, void());
47 MOCK_METHOD0(CancelAndIgnore, void()); 47 MOCK_METHOD0(CancelAndIgnore, void());
48 MOCK_METHOD1(CancelWithError, void(int error_code)); 48 MOCK_METHOD1(CancelWithError, void(int error_code));
49 MOCK_METHOD0(Resume, void()); 49 MOCK_METHOD0(Resume, void());
50 }; 50 };
51 51
52 class FileBrowserResourceThrottleTest : public testing::Test { 52 class StreamsResourceThrottleTest : public testing::Test {
53 public: 53 public:
54 typedef FileBrowserResourceThrottle::FileBrowserHandlerEventRouter 54 typedef StreamsResourceThrottle::StreamsPrivateEventRouter
55 HandlerEventRouter; 55 HandlerEventRouter;
56 56
57 FileBrowserResourceThrottleTest() 57 StreamsResourceThrottleTest()
58 : test_extension_id_("test_extension_id"), 58 : test_extension_id_(extension_misc::kStreamsPrivateTestExtensionId),
59 test_render_process_id_(2), 59 test_render_process_id_(2),
60 test_render_view_id_(12), 60 test_render_view_id_(12),
61 test_request_url_("http://some_url/file.txt"), 61 test_request_url_("http://some_url/file.txt"),
62 ui_thread_(content::BrowserThread::UI, &message_loop_), 62 ui_thread_(content::BrowserThread::UI, &message_loop_),
63 io_thread_(content::BrowserThread::IO, &message_loop_) { 63 io_thread_(content::BrowserThread::IO, &message_loop_) {
64 } 64 }
65 65
66 virtual ~FileBrowserResourceThrottleTest() {} 66 virtual ~StreamsResourceThrottleTest() {}
67 67
68 virtual void SetUp() OVERRIDE { 68 virtual void SetUp() OVERRIDE {
69 (new FileBrowserHandlerParser)->Register(); 69 (new MimeTypesHandlerParser)->Register();
70 // Extension info map must be created before |CreateAndInstallTestExtension| 70 // Extension info map must be created before |CreateAndInstallTestExtension|
71 // is called (the method will add created extension to the info map). 71 // is called (the method will add created extension to the info map).
72 extension_info_map_ = new ExtensionInfoMap(); 72 extension_info_map_ = new ExtensionInfoMap();
73 CreateAndInstallTestExtension(); 73 CreateAndInstallTestExtension();
74 InitResourceController(); 74 InitResourceController();
75 } 75 }
76 76
77 virtual void TearDown() OVERRIDE { 77 virtual void TearDown() OVERRIDE {
78 FileBrowserHandler::set_extension_whitelisted_for_test(NULL); 78 MimeTypesHandler::set_extension_whitelisted_for_test(NULL);
79 extensions::ManifestHandler::ClearRegistryForTesting(); 79 extensions::ManifestHandler::ClearRegistryForTesting();
80 } 80 }
81 81
82 protected: 82 protected:
83 // Creates the test extension, and adds it to the |extension_info_map_|. 83 // Creates the test extension, and adds it to the |extension_info_map_|.
84 // The extension has separate file browser handlers that can handle 84 // The extension has separate file browser handlers that can handle
85 // 'plain/html' and 'plain/text' MIME types. 85 // 'plain/html' and 'plain/text' MIME types.
86 void CreateAndInstallTestExtension() { 86 void CreateAndInstallTestExtension() {
87 // The extension must be white-listed in order to be successfully created. 87 // The extension must be white-listed in order to be successfully created.
88 FileBrowserHandler::set_extension_whitelisted_for_test( 88 MimeTypesHandler::set_extension_whitelisted_for_test(
89 &test_extension_id_); 89 &test_extension_id_);
90 90
91 extension_ = 91 extension_ =
92 ExtensionBuilder() 92 ExtensionBuilder()
93 .SetManifest(DictionaryBuilder() 93 .SetManifest(DictionaryBuilder()
94 .Set("name", "file browser handler test") 94 .Set("name", "file browser handler test")
95 .Set("version", "1.0.0") 95 .Set("version", "1.0.0")
96 .Set("manifest_version", 2) 96 .Set("manifest_version", 2)
97 .Set("file_browser_handlers", ListBuilder() 97 .Set("mime_types", ListBuilder()
98 .Append(DictionaryBuilder() 98 .Append("random/mime1")
99 // Handler that handles 'plain/html', among others. 99 .Append("random/mime2")
100 .Set("id", "ID_handle_html") 100 .Append("plain/html")
101 .Set("default_title", "Default title") 101 .Append("plain/text")))
102 .Set("default_icon", "icon.png")
103 // file_filters_field is mandatory, even though
104 // it's not used in the tests.
105 .Set("file_filters", ListBuilder()
106 .Append("filesystem:*.html"))
107 .Set("mime_types", ListBuilder()
108 .Append("random/mime1")
109 .Append("random/mime2")
110 .Append("plain/html")))
111 .Append(DictionaryBuilder()
112 // Handler that handles only 'plain/text'.
113 .Set("id", "ID_handle_text")
114 .Set("default_title", "Default title")
115 .Set("default_icon", "icon.png")
116 // file_filters_field is mandatory, even though
117 // it's not used in the tests.
118 .Set("file_filters", ListBuilder()
119 .Append("filesystem:*.txt"))
120 .Set("mime_types", ListBuilder()
121 .Append("plain/text")))))
122 .SetID(test_extension_id_) 102 .SetID(test_extension_id_)
123 .Build(); 103 .Build();
124 104
125 // 'Install' the extension. 105 // 'Install' the extension.
126 extension_info_map_->AddExtension(extension_, 106 extension_info_map_->AddExtension(extension_,
127 base::Time(), // install time 107 base::Time(), // install time
128 true); // enable_incognito 108 true); // enable_incognito
129 } 109 }
130 110
131 // Initiates the default mock_resource_controller_ expectations. 111 // Initiates the default mock_resource_controller_ expectations.
(...skipping 16 matching lines...) Expand all
148 test_extension_id_, extension_misc::UNLOAD_REASON_UNINSTALL); 128 test_extension_id_, extension_misc::UNLOAD_REASON_UNINSTALL);
149 extension_info_map_->AddExtension(extension_, 129 extension_info_map_->AddExtension(extension_,
150 base::Time(), // install_time 130 base::Time(), // install_time
151 false); // enable incognito 131 false); // enable incognito
152 } 132 }
153 133
154 // Creates the resource throttle that should be tested. 134 // Creates the resource throttle that should be tested.
155 // It's setup with |mock_event_router| passed to the method and 135 // It's setup with |mock_event_router| passed to the method and
156 // |mock_resource_throttle_|. 136 // |mock_resource_throttle_|.
157 // |mock_event_router|'s expectations must be set before calling this method. 137 // |mock_event_router|'s expectations must be set before calling this method.
158 scoped_ptr<FileBrowserResourceThrottle> CreateThrottleToTest( 138 scoped_ptr<StreamsResourceThrottle> CreateThrottleToTest(
159 bool is_incognito, 139 bool is_incognito,
160 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router, 140 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router,
161 const std::string& mime_type) { 141 const std::string& mime_type) {
162 scoped_ptr<HandlerEventRouter> event_router(mock_event_router.release()); 142 scoped_ptr<HandlerEventRouter> event_router(mock_event_router.release());
163 scoped_ptr<FileBrowserResourceThrottle> test_throttle( 143 scoped_ptr<StreamsResourceThrottle> test_throttle(
164 FileBrowserResourceThrottle::CreateForTest(test_render_process_id_, 144 StreamsResourceThrottle::CreateForTest(test_render_process_id_,
165 test_render_view_id_, 145 test_render_view_id_,
166 mime_type, 146 mime_type,
167 test_request_url_, 147 test_request_url_,
168 is_incognito, 148 is_incognito,
169 extension_info_map_.get(), 149 extension_info_map_.get(),
170 event_router.Pass())); 150 event_router.Pass()));
171 151
172 test_throttle->set_controller_for_testing(&mock_resource_controller_); 152 test_throttle->set_controller_for_testing(&mock_resource_controller_);
173 153
174 return test_throttle.Pass(); 154 return test_throttle.Pass();
175 } 155 }
176 156
177 // The test extension's id. 157 // The test extension's id.
178 std::string test_extension_id_; 158 std::string test_extension_id_;
179 // The test extension. 159 // The test extension.
180 scoped_refptr<const Extension> extension_; 160 scoped_refptr<const Extension> extension_;
(...skipping 13 matching lines...) Expand all
194 private: 174 private:
195 // ExtensionInfoMap needs IO thread. 175 // ExtensionInfoMap needs IO thread.
196 MessageLoop message_loop_; 176 MessageLoop message_loop_;
197 content::TestBrowserThread ui_thread_; 177 content::TestBrowserThread ui_thread_;
198 content::TestBrowserThread io_thread_; 178 content::TestBrowserThread io_thread_;
199 }; 179 };
200 180
201 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is 181 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is
202 // called) and the event_router is invoked when a white-listed extension has a 182 // called) and the event_router is invoked when a white-listed extension has a
203 // file browser handler that can handle the request's MIME type. 183 // file browser handler that can handle the request's MIME type.
204 TEST_F(FileBrowserResourceThrottleTest, HandlerWhiteListed) { 184 TEST_F(StreamsResourceThrottleTest, HandlerWhiteListed) {
205 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1); 185 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1);
206 186
207 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 187 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
208 new MockFileBrowserHandlerEventRouter()); 188 new MockStreamsPrivateEventRouter());
209 EXPECT_CALL(*mock_event_router, 189 EXPECT_CALL(*mock_event_router,
210 DispatchMimeTypeHandlerEvent(test_render_process_id_, 190 DispatchMimeTypeHandlerEvent(test_render_process_id_,
211 test_render_view_id_, 191 test_render_view_id_,
212 "plain/html", 192 "plain/html",
213 test_request_url_, 193 test_request_url_,
214 test_extension_id_)) 194 test_extension_id_))
215 .Times(1); 195 .Times(1);
216 196
217 scoped_ptr<FileBrowserResourceThrottle> throttle( 197 scoped_ptr<StreamsResourceThrottle> throttle(
218 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/html")); 198 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/html"));
219 199
220 bool defer = false; 200 bool defer = false;
221 throttle->WillProcessResponse(&defer); 201 throttle->WillProcessResponse(&defer);
222 EXPECT_FALSE(defer); 202 EXPECT_FALSE(defer);
223 } 203 }
224 204
225 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is 205 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is
226 // called) and the event_router is invoked when a white-listed extension has a 206 // called) and the event_router is invoked when a white-listed extension has a
227 // file browser handler that can handle the request's MIME type, even when the 207 // file browser handler that can handle the request's MIME type, even when the
228 // file browser handler is not first in the extension's file browser handler 208 // file browser handler is not first in the extension's file browser handler
229 // list. 209 // list.
230 TEST_F(FileBrowserResourceThrottleTest, SecondHandlerWhiteListed) { 210 TEST_F(StreamsResourceThrottleTest, SecondHandlerWhiteListed) {
231 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1); 211 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1);
232 212
233 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 213 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
234 new MockFileBrowserHandlerEventRouter()); 214 new MockStreamsPrivateEventRouter());
235 EXPECT_CALL(*mock_event_router, 215 EXPECT_CALL(*mock_event_router,
236 DispatchMimeTypeHandlerEvent(test_render_process_id_, 216 DispatchMimeTypeHandlerEvent(test_render_process_id_,
237 test_render_view_id_, 217 test_render_view_id_,
238 "plain/text", 218 "plain/text",
239 test_request_url_, 219 test_request_url_,
240 test_extension_id_)) 220 test_extension_id_))
241 .Times(1); 221 .Times(1);
242 222
243 scoped_ptr<FileBrowserResourceThrottle> throttle( 223 scoped_ptr<StreamsResourceThrottle> throttle(
244 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/text")); 224 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/text"));
245 225
246 bool defer = false; 226 bool defer = false;
247 throttle->WillProcessResponse(&defer); 227 throttle->WillProcessResponse(&defer);
248 EXPECT_FALSE(defer); 228 EXPECT_FALSE(defer);
249 } 229 }
250 230
251 // Tests that the request is not canceled and the event router is not invoked 231 // Tests that the request is not canceled and the event router is not invoked
252 // if there is no file browser handlers registered for the request's MIME type. 232 // if there is no file browser handlers registered for the request's MIME type.
253 TEST_F(FileBrowserResourceThrottleTest, NoWhiteListedHandler) { 233 TEST_F(StreamsResourceThrottleTest, NoWhiteListedHandler) {
254 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 234 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
255 new MockFileBrowserHandlerEventRouter()); 235 new MockStreamsPrivateEventRouter());
256 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _)) 236 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _))
257 .Times(0); 237 .Times(0);
258 238
259 scoped_ptr<FileBrowserResourceThrottle> throttle( 239 scoped_ptr<StreamsResourceThrottle> throttle(
260 CreateThrottleToTest(false, mock_event_router.Pass(), 240 CreateThrottleToTest(false, mock_event_router.Pass(),
261 "random_mime_type")); 241 "random_mime_type"));
262 242
263 bool defer = false; 243 bool defer = false;
264 throttle->WillProcessResponse(&defer); 244 throttle->WillProcessResponse(&defer);
265 EXPECT_FALSE(defer); 245 EXPECT_FALSE(defer);
266 } 246 }
267 247
268 // Tests that the request is not canceled and the event router is not invoked 248 // Tests that the request is not canceled and the event router is not invoked
269 // if there is an extension with the file browser handler that can handle the 249 // if there is an extension with the file browser handler that can handle the
270 // request's MIME type, but the extension is disabled. 250 // request's MIME type, but the extension is disabled.
271 TEST_F(FileBrowserResourceThrottleTest, HandlerWhiteListedAndDisabled) { 251 TEST_F(StreamsResourceThrottleTest, HandlerWhiteListedAndDisabled) {
272 DisableTestExtension(); 252 DisableTestExtension();
273 253
274 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 254 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
275 new MockFileBrowserHandlerEventRouter()); 255 new MockStreamsPrivateEventRouter());
276 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _)) 256 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _))
277 .Times(0); 257 .Times(0);
278 258
279 scoped_ptr<FileBrowserResourceThrottle> throttle( 259 scoped_ptr<StreamsResourceThrottle> throttle(
280 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/text")); 260 CreateThrottleToTest(false, mock_event_router.Pass(), "plain/text"));
281 261
282 bool defer = false; 262 bool defer = false;
283 throttle->WillProcessResponse(&defer); 263 throttle->WillProcessResponse(&defer);
284 EXPECT_FALSE(defer); 264 EXPECT_FALSE(defer);
285 } 265 }
286 266
287 // Tests that the request is not canceled and the event router is not invoked 267 // Tests that the request is not canceled and the event router is not invoked
288 // in incognito mode if the extension that handles the request's MIME type is 268 // in incognito mode if the extension that handles the request's MIME type is
289 // not incognito enabled. 269 // not incognito enabled.
290 TEST_F(FileBrowserResourceThrottleTest, IncognitoExtensionNotEnabled) { 270 TEST_F(StreamsResourceThrottleTest, IncognitoExtensionNotEnabled) {
291 ReloadTestExtensionIncognitoDisabled(); 271 ReloadTestExtensionIncognitoDisabled();
292 272
293 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 273 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
294 new MockFileBrowserHandlerEventRouter()); 274 new MockStreamsPrivateEventRouter());
295 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _)) 275 EXPECT_CALL(*mock_event_router, DispatchMimeTypeHandlerEvent(_, _, _, _, _))
296 .Times(0); 276 .Times(0);
297 277
298 scoped_ptr<FileBrowserResourceThrottle> throttle( 278 scoped_ptr<StreamsResourceThrottle> throttle(
299 CreateThrottleToTest(true, mock_event_router.Pass(), "plain/text")); 279 CreateThrottleToTest(true, mock_event_router.Pass(), "plain/text"));
300 280
301 bool defer = false; 281 bool defer = false;
302 throttle->WillProcessResponse(&defer); 282 throttle->WillProcessResponse(&defer);
303 EXPECT_FALSE(defer); 283 EXPECT_FALSE(defer);
304 } 284 }
305 285
306 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is 286 // Tests that the request gets canceled (mock_resource_controller_.Cancel() is
307 // called) and the event_router is invoked in incognito when a white-listed 287 // called) and the event_router is invoked in incognito when a white-listed
308 // extension that handles request's MIME type is incognito enabled. 288 // extension that handles request's MIME type is incognito enabled.
309 TEST_F(FileBrowserResourceThrottleTest, IncognitoExtensionEnabled) { 289 TEST_F(StreamsResourceThrottleTest, IncognitoExtensionEnabled) {
310 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1); 290 EXPECT_CALL(mock_resource_controller_, CancelAndIgnore()).Times(1);
311 291
312 scoped_ptr<MockFileBrowserHandlerEventRouter> mock_event_router( 292 scoped_ptr<MockStreamsPrivateEventRouter> mock_event_router(
313 new MockFileBrowserHandlerEventRouter()); 293 new MockStreamsPrivateEventRouter());
314 EXPECT_CALL(*mock_event_router, 294 EXPECT_CALL(*mock_event_router,
315 DispatchMimeTypeHandlerEvent(test_render_process_id_, 295 DispatchMimeTypeHandlerEvent(test_render_process_id_,
316 test_render_view_id_, 296 test_render_view_id_,
317 "plain/html", 297 "plain/html",
318 test_request_url_, 298 test_request_url_,
319 test_extension_id_)) 299 test_extension_id_))
320 .Times(1); 300 .Times(1);
321 301
322 scoped_ptr<FileBrowserResourceThrottle> throttle( 302 scoped_ptr<StreamsResourceThrottle> throttle(
323 CreateThrottleToTest(true, mock_event_router.Pass(), "plain/html")); 303 CreateThrottleToTest(true, mock_event_router.Pass(), "plain/html"));
324 304
325 bool defer = false; 305 bool defer = false;
326 throttle->WillProcessResponse(&defer); 306 throttle->WillProcessResponse(&defer);
327 EXPECT_FALSE(defer); 307 EXPECT_FALSE(defer);
328 } 308 }
329 309
330 } // namespace 310 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698