172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service_unittest.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/user_script_listener.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_file_util.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/global_request_id.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host_request_info.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_handler.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_queue.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_test_job.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/url_request/url_request_test_util.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kMatchingUrl[] = "http://google.com/";
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNotMatchingUrl[] = "http://example.com/";
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kTestData[] = "Hello, World!";
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Dummy ResourceHandler required for ResourceDispatcherHostRequestInfo.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DummyResourceHandler : public ResourceHandler {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DummyResourceHandler() {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnUploadProgress(int request_id, uint64 position, uint64 size) {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnRequestRedirected(int request_id, const GURL& url,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   ResourceResponse* response,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   bool* defer) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnResponseStarted(int request_id,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 ResourceResponse* response) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnWillStart(int request_id,
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const GURL& url,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           bool* defer) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnWillRead(int request_id,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          net::IOBuffer** buf,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          int* buf_size,
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          int min_size) {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnReadCompleted(int request_id, int* bytes_read) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnResponseCompleted(int request_id,
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   const net::URLRequestStatus& status,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const std::string& security_info) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnRequestClosed() {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DummyResourceHandler);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochResourceDispatcherHostRequestInfo* CreateRequestInfo(int request_id) {
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new ResourceDispatcherHostRequestInfo(
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new DummyResourceHandler(), ChildProcessInfo::RENDER_PROCESS, 0, 0,
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      request_id, ResourceType::MAIN_FRAME, 0, false, false, false);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// A simple test net::URLRequestJob. We don't care what it does, only that
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// whether it starts and finishes.
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass SimpleTestJob : public net::URLRequestTestJob {
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  explicit SimpleTestJob(net::URLRequest* request)
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : net::URLRequestTestJob(request, test_headers(), kTestData, true) {}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~SimpleTestJob() {}
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserScriptListenerTest
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : public ExtensionServiceTestBase,
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      public net::URLRequest::Interceptor {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UserScriptListenerTest() {
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    net::URLRequest::RegisterRequestInterceptor(this);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~UserScriptListenerTest() {
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    net::URLRequest::UnregisterRequestInterceptor(this);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ExtensionServiceTestBase::SetUp();
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    InitializeEmptyExtensionService();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    service_->Init();
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->RunAllPending();
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    listener_ = new UserScriptListener();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ResourceQueue::DelegateSet delegates;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegates.insert(listener_.get());
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    resource_queue_.Initialize(delegates);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    resource_queue_.Shutdown();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    listener_ = NULL;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->RunAllPending();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // net::URLRequest::Interceptor
13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request) {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return new SimpleTestJob(request);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TestURLRequest* StartTestRequest(net::URLRequest::Delegate* delegate,
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const std::string& url) {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TestURLRequest* request = new TestURLRequest(GURL(url), delegate);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<ResourceDispatcherHostRequestInfo> rdh_info(
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        CreateRequestInfo(0));
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    resource_queue_.AddRequest(request, *rdh_info.get());
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return request;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadTestExtension() {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath test_dir;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath extension_path = test_dir
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .AppendASCII("extensions")
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .AppendASCII("good")
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .AppendASCII("Extensions")
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .AppendASCII("1.0.0.0");
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    service_->LoadExtension(extension_path);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UnloadTestExtension() {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_FALSE(service_->extensions()->empty());
16621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service_->UnloadExtension(service_->extensions()->at(0)->id(),
16721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                              UnloadedExtensionInfo::DISABLE);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<UserScriptListener> listener_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceQueue resource_queue_;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserScriptListenerTest, DelayAndUpdate) {
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestDelegate delegate;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kMatchingUrl));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(request->is_pending());
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::USER_SCRIPTS_UPDATED,
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile_.get()),
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::NoDetails());
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kTestData, delegate.data_received());
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserScriptListenerTest, DelayAndUnload) {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestDelegate delegate;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kMatchingUrl));
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(request->is_pending());
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UnloadTestExtension();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is still not enough to start delayed requests. We have to notify the
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // listener that the user scripts have been updated.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(request->is_pending());
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::USER_SCRIPTS_UPDATED,
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile_.get()),
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::NoDetails());
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kTestData, delegate.data_received());
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserScriptListenerTest, NoDelayNoExtension) {
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestDelegate delegate;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kMatchingUrl));
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The request should be started immediately.
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(request->is_pending());
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kTestData, delegate.data_received());
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserScriptListenerTest, NoDelayNotMatching) {
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestDelegate delegate;
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      kNotMatchingUrl));
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The request should be started immediately.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(request->is_pending());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kTestData, delegate.data_received());
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
242