| Index: chrome/browser/extensions/user_script_listener_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/user_script_listener_unittest.cc (revision 24418)
|
| +++ chrome/browser/extensions/user_script_listener_unittest.cc (working copy)
|
| @@ -1,306 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <algorithm>
|
| -#include <vector>
|
| -
|
| -#include "base/message_loop.h"
|
| -#include "base/thread.h"
|
| -#include "chrome/browser/extensions/extensions_service.h"
|
| -#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_plugin_lib.h"
|
| -#include "chrome/common/notification_service.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "chrome/test/testing_profile.h"
|
| -#include "ipc/ipc_message.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "net/url_request/url_request_test_job.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -// A simple test URLRequestJob. We don't care what it does, only that whether it
|
| -// starts and finishes.
|
| -class SimpleTestJob : public URLRequestTestJob {
|
| - public:
|
| - explicit SimpleTestJob(URLRequest* request)
|
| - : URLRequestTestJob(request, test_headers(), test_data_1(), true) {}
|
| -};
|
| -
|
| -class MockUserScriptMaster : public UserScriptMaster {
|
| -public:
|
| - MockUserScriptMaster(MessageLoop* worker, const FilePath& script_dir) :
|
| - UserScriptMaster(worker, script_dir) { }
|
| -
|
| - virtual void StartScan() {
|
| - // Do nothing. We want to manually control when scans occur.
|
| - }
|
| - void TestStartScan() {
|
| - UserScriptMaster::StartScan();
|
| - }
|
| -};
|
| -
|
| -class MockIOThread : public base::Thread {
|
| - public:
|
| - MockIOThread() : base::Thread("IO") {}
|
| - virtual ~MockIOThread() { Stop(); }
|
| -
|
| - private:
|
| - virtual void Init() {
|
| - service_.reset(new NotificationService());
|
| - }
|
| - virtual void CleanUp() {
|
| - ChromePluginLib::UnloadAllPlugins();
|
| - service_.reset();
|
| - }
|
| -
|
| - scoped_ptr<NotificationService> service_;
|
| -};
|
| -
|
| -// A class to help with making and handling resource requests.
|
| -class ResourceDispatcherHostTester :
|
| - public ResourceDispatcherHost::Receiver,
|
| - public URLRequest::Interceptor,
|
| - public base::RefCountedThreadSafe<ResourceDispatcherHostTester> {
|
| - public:
|
| - ResourceDispatcherHostTester(MessageLoop* io_loop)
|
| - : Receiver(ChildProcessInfo::RENDER_PROCESS),
|
| - host_(io_loop),
|
| - ui_loop_(MessageLoop::current()),
|
| - io_loop_(io_loop) {
|
| - URLRequest::RegisterRequestInterceptor(this);
|
| - }
|
| - virtual ~ResourceDispatcherHostTester() {
|
| - URLRequest::UnregisterRequestInterceptor(this);
|
| - }
|
| -
|
| - void MakeTestRequest(int request_id, const GURL& url) {
|
| - io_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
| - this, &ResourceDispatcherHostTester::MakeTestRequestOnIOThread,
|
| - request_id, url));
|
| - MessageLoop::current()->Run(); // wait for Quit from IO thread
|
| - }
|
| -
|
| - void WaitForScan(MockUserScriptMaster* master) {
|
| - master->TestStartScan();
|
| - MessageLoop::current()->RunAllPending(); // run the scan
|
| - io_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
| - this, &ResourceDispatcherHostTester::RunPending));
|
| - MessageLoop::current()->Run(); // wait for Quit from IO thread
|
| - }
|
| -
|
| - bool IsRequestStarted(int request_id) {
|
| - return std::find(started_requests_.begin(), started_requests_.end(),
|
| - request_id) != started_requests_.end();
|
| - }
|
| -
|
| - bool IsRequestComplete(int request_id) {
|
| - return std::find(completed_requests_.begin(), completed_requests_.end(),
|
| - request_id) != completed_requests_.end();
|
| - }
|
| -
|
| - private:
|
| - // URLRequest::Interceptor
|
| - virtual URLRequestJob* MaybeIntercept(URLRequest* request) {
|
| - return new SimpleTestJob(request);
|
| - }
|
| -
|
| - // ResourceDispatcherHost::Receiver implementation
|
| - virtual bool Send(IPC::Message* msg) {
|
| - IPC_BEGIN_MESSAGE_MAP(ResourceDispatcherHostTester, *msg)
|
| - IPC_MESSAGE_HANDLER(ViewMsg_Resource_ReceivedResponse, OnReceivedResponse)
|
| - IPC_MESSAGE_HANDLER(ViewMsg_Resource_RequestComplete, OnRequestComplete)
|
| - IPC_END_MESSAGE_MAP()
|
| - delete msg;
|
| - return true;
|
| - }
|
| -
|
| - URLRequestContext* GetRequestContext(
|
| - uint32 request_id,
|
| - const ViewHostMsg_Resource_Request& request_data) {
|
| - return NULL;
|
| - }
|
| -
|
| - // TODO(mpcomplete): Some of this stuff is copied from
|
| - // resource_dispatcher_host_unittest.cc. Consider sharing.
|
| - static ViewHostMsg_Resource_Request CreateResourceRequest(const char* method,
|
| - const GURL& url) {
|
| - ViewHostMsg_Resource_Request request;
|
| - request.method = std::string(method);
|
| - request.url = url;
|
| - request.first_party_for_cookies = url; // bypass third-party cookie
|
| - // blocking
|
| - request.resource_type = ResourceType::MAIN_FRAME;
|
| - request.load_flags = 0;
|
| - // init the rest to default values to prevent getting UMR.
|
| - request.frame_origin = "null";
|
| - request.main_frame_origin = "null";
|
| - request.origin_pid = 0;
|
| - request.request_context = 0;
|
| - return request;
|
| - }
|
| -
|
| - void RunPending() {
|
| - MessageLoop::current()->SetNestableTasksAllowed(true);
|
| - MessageLoop::current()->RunAllPending();
|
| - MessageLoop::current()->SetNestableTasksAllowed(false);
|
| -
|
| - // return control to UI thread.
|
| - ui_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - }
|
| -
|
| - void MakeTestRequestOnIOThread(int request_id, const GURL& url) {
|
| - ViewHostMsg_Resource_Request request = CreateResourceRequest("GET", url);
|
| - ViewHostMsg_RequestResource msg(0, request_id, request);
|
| - bool msg_was_ok;
|
| - host_.OnMessageReceived(msg, this, &msg_was_ok);
|
| - RunPending();
|
| - }
|
| -
|
| - void OnReceivedResponse(int request_id,
|
| - const ResourceResponseHead& response_head) {
|
| - started_requests_.push_back(request_id);
|
| - }
|
| -
|
| - void OnRequestComplete(int request_id,
|
| - const URLRequestStatus& status,
|
| - const std::string& security_info) {
|
| - completed_requests_.push_back(request_id);
|
| - }
|
| -
|
| - ResourceDispatcherHost host_;
|
| - MessageLoop* ui_loop_;
|
| - MessageLoop* io_loop_;
|
| -
|
| - // Note: these variables are accessed on both threads, but since we only
|
| - // one thread executes at a time, they are safe.
|
| - std::vector<int> started_requests_;
|
| - std::vector<int> completed_requests_;
|
| -};
|
| -
|
| -class UserScriptListenerTest : public testing::Test {
|
| - public:
|
| - virtual void SetUp() {
|
| - io_thread_.reset(new MockIOThread());
|
| - base::Thread::Options options(MessageLoop::TYPE_IO, 0);
|
| - io_thread_->StartWithOptions(options);
|
| - DCHECK(io_thread_->message_loop());
|
| - DCHECK(io_thread_->IsRunning());
|
| -
|
| - FilePath install_dir = profile_.GetPath()
|
| - .AppendASCII(ExtensionsService::kInstallDirectoryName);
|
| -
|
| - resource_tester_ =
|
| - new ResourceDispatcherHostTester(io_thread_->message_loop());
|
| -
|
| - master_ = new MockUserScriptMaster(&loop_, install_dir);
|
| -
|
| - service_ = new ExtensionsService(&profile_,
|
| - CommandLine::ForCurrentProcess(),
|
| - profile_.GetPrefs(),
|
| - install_dir,
|
| - &loop_,
|
| - &loop_,
|
| - false);
|
| - service_->set_extensions_enabled(true);
|
| - service_->set_show_extensions_prompts(false);
|
| - service_->ClearProvidersForTesting();
|
| - service_->Init();
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - io_thread_.reset();
|
| - resource_tester_ = NULL;
|
| - }
|
| -
|
| - protected:
|
| - TestingProfile profile_;
|
| - MessageLoopForUI loop_;
|
| - scoped_ptr<MockIOThread> io_thread_;
|
| - scoped_refptr<ResourceDispatcherHostTester> resource_tester_;
|
| - scoped_refptr<MockUserScriptMaster> master_;
|
| - scoped_refptr<ExtensionsService> service_;
|
| -};
|
| -
|
| -// Loads a single extension and ensures that requests to URLs with content
|
| -// scripts are delayed.
|
| -TEST_F(UserScriptListenerTest, SingleExtension) {
|
| - FilePath extensions_path;
|
| - ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));
|
| - extensions_path = extensions_path.AppendASCII("extensions");
|
| - FilePath ext1 = extensions_path
|
| - .AppendASCII("good")
|
| - .AppendASCII("Extensions")
|
| - .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
|
| - .AppendASCII("1.0.0.0");
|
| - service_->LoadExtension(ext1);
|
| - loop_.RunAllPending();
|
| - ASSERT_EQ(1u, service_->extensions()->size());
|
| -
|
| - // Our extension has a content script on google.com. That request should be
|
| - // delayed.
|
| - resource_tester_->MakeTestRequest(0, GURL("http://google.com/"));
|
| - resource_tester_->MakeTestRequest(1, GURL("http://yahoo.com/"));
|
| -
|
| - EXPECT_FALSE(resource_tester_->IsRequestStarted(0));
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(1));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(1));
|
| -
|
| - // After scanning, the user scripts should be ready and the request can
|
| - // go through.
|
| - resource_tester_->WaitForScan(master_.get());
|
| -
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(0));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(0));
|
| -}
|
| -
|
| -// Loads a single extension and ensures that requests to URLs with content
|
| -// scripts are delayed.
|
| -TEST_F(UserScriptListenerTest, UnloadExtension) {
|
| - FilePath extensions_path;
|
| - ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));
|
| - extensions_path = extensions_path.AppendASCII("extensions");
|
| -
|
| - FilePath ext1 = extensions_path
|
| - .AppendASCII("good")
|
| - .AppendASCII("Extensions")
|
| - .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
|
| - .AppendASCII("1.0.0.0");
|
| - service_->LoadExtension(ext1);
|
| - loop_.RunAllPending();
|
| - ASSERT_EQ(1u, service_->extensions()->size());
|
| -
|
| - FilePath ext2 = extensions_path
|
| - .AppendASCII("good")
|
| - .AppendASCII("Extensions")
|
| - .AppendASCII("bjafgdebaacbbbecmhlhpofkepfkgcpa")
|
| - .AppendASCII("1.0");
|
| - service_->LoadExtension(ext2);
|
| - loop_.RunAllPending();
|
| - ASSERT_EQ(2u, service_->extensions()->size());
|
| -
|
| - // Our extension has a content script on google.com. That request should be
|
| - // delayed.
|
| - resource_tester_->MakeTestRequest(0, GURL("http://google.com/"));
|
| - resource_tester_->MakeTestRequest(1, GURL("http://yahoo.com/"));
|
| -
|
| - EXPECT_FALSE(resource_tester_->IsRequestStarted(0));
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(1));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(1));
|
| -
|
| - // Unload the first extension and run a scan. Request should complete.
|
| - service_->UnloadExtension("behllobkkfkfnphdnhnkndlbkcpglgmj");
|
| - resource_tester_->WaitForScan(master_.get());
|
| -
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(0));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(0));
|
| -
|
| - // Make the same requests, and they should complete instantly.
|
| - resource_tester_->MakeTestRequest(2, GURL("http://google.com/"));
|
| - resource_tester_->MakeTestRequest(3, GURL("http://yahoo.com/"));
|
| -
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(2));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(2));
|
| - EXPECT_TRUE(resource_tester_->IsRequestStarted(3));
|
| - EXPECT_TRUE(resource_tester_->IsRequestComplete(3));
|
| -}
|
|
|