15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h"
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service_unittest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/user_script_listener.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_controller.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_throttle.h"
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_filter.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceController;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceThrottle;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMatchingUrl[] = "http://google.com/";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotMatchingUrl[] = "http://example.com/";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestData[] = "Hello, World!";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThrottleController : public base::SupportsUserData::Data,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public ResourceController {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThrottleController(net::URLRequest* request, ResourceThrottle* throttle)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : request_(request),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        throttle_(throttle) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttle_->set_controller_for_testing(this);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceController implementation:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Resume() OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_->Start();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Cancel() OVERRIDE {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelAndIgnore() OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelWithError(int error_code) OVERRIDE {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequest* request_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResourceThrottle> throttle_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple test net::URLRequestJob. We don't care what it does, only that
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it starts and finishes.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SimpleTestJob : public net::URLRequestTestJob {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTestJob(net::URLRequest* request,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                net::NetworkDelegate* network_delegate)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : net::URLRequestTestJob(request,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               network_delegate,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               test_headers(),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               kTestData,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               true) {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SimpleTestJob() {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Yoinked from extension_manifest_unittest.cc.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryValue* LoadManifestFile(const base::FilePath path,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  std::string* error) {
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(path));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONFileValueSerializer serializer(path);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<DictionaryValue*>(serializer.Deserialize(NULL, error));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> LoadExtension(const std::string& filename,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       std::string* error) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_TEST_DATA, &path);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppendASCII("extensions").
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppendASCII("manifest_tests").
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppendASCII(filename.c_str());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> value(LoadManifestFile(path, error));
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!value)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Extension::Create(path.DirName(), Manifest::UNPACKED, *value,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Extension::NO_FLAGS, error);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SimpleTestJobProtocolHandler
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public net::URLRequestJobFactory::ProtocolHandler {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTestJobProtocolHandler() {}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SimpleTestJobProtocolHandler() {}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // net::URLRequestJobFactory::ProtocolHandler
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual net::URLRequestJob* MaybeCreateJob(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::URLRequest* request,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::NetworkDelegate* network_delegate) const OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new SimpleTestJob(request, network_delegate);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SimpleTestJobProtocolHandler);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UserScriptListenerTest : public ExtensionServiceTestBase {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserScriptListenerTest() {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "http", "google.com",
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new SimpleTestJobProtocolHandler()));
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "http", "example.com",
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new SimpleTestJobProtocolHandler()));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~UserScriptListenerTest() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->RemoveHostnameHandler("http",
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                                "google.com");
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->RemoveHostnameHandler("http",
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                                "example.com");
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionServiceTestBase::SetUp();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitializeEmptyExtensionService();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_->Init();
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_ = new UserScriptListener();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_ = NULL;
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionServiceTestBase::TearDown();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequest* StartTestRequest(net::URLRequest::Delegate* delegate,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        const std::string& url_string,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        net::TestURLRequestContext* context) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(url_string);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::TestURLRequest* request =
1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        new net::TestURLRequest(url, net::DEFAULT_PRIORITY, delegate, context);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceThrottle* throttle =
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        listener_->CreateResourceThrottle(url, ResourceType::MAIN_FRAME);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool defer = false;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (throttle) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request->SetUserData(NULL, new ThrottleController(request, throttle));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttle->WillStartRequest(&defer);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!defer)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request->Start();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return request;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadTestExtension() {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_dir;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath extension_path = test_dir
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("good")
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("Extensions")
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("1.0.0.0");
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnpackedInstaller::Create(service_)->Load(extension_path);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadTestExtension() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(service_->extensions()->is_empty());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_->UnloadExtension((*service_->extensions()->begin())->id(),
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              UnloadedExtensionInfo::REASON_DISABLE);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<UserScriptListener> listener_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, DelayAndUpdate) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StartTestRequest(&delegate, kMatchingUrl, &context));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_USER_SCRIPTS_UPDATED,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_.get()),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTestData, delegate.data_received());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, DelayAndUnload) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StartTestRequest(&delegate, kMatchingUrl, &context));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnloadTestExtension();
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is still not enough to start delayed requests. We have to notify the
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // listener that the user scripts have been updated.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_USER_SCRIPTS_UPDATED,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_.get()),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTestData, delegate.data_received());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, NoDelayNoExtension) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StartTestRequest(&delegate, kMatchingUrl, &context));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The request should be started immediately.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(request->is_pending());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTestData, delegate.data_received());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, NoDelayNotMatching) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(StartTestRequest(&delegate,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           kNotMatchingUrl,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           &context));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The request should be started immediately.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(request->is_pending());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTestData, delegate.data_received());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, MultiProfile) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fire up a second profile and have it load and extension with a content
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile2;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension = LoadExtension(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "content_script_yahoo.json", &error);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension.get());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_EXTENSION_LOADED,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(&profile2),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Details<Extension>(extension.get()));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StartTestRequest(&delegate, kMatchingUrl, &context));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the first profile's user scripts are ready, the request should still
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be blocked waiting for profile2.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_USER_SCRIPTS_UPDATED,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_.get()),
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(delegate.data_received().empty());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After profile2 is ready, the request should proceed.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_USER_SCRIPTS_UPDATED,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(&profile2),
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTestData, delegate.data_received());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test when the script updated notification occurs before the throttle's
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WillStartRequest function is called.  This can occur when there are multiple
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// throttles.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UserScriptListenerTest, ResumeBeforeStart) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestDelegate delegate;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLRequestContext context;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(kMatchingUrl);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::TestURLRequest> request(
3300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new net::TestURLRequest(url, net::DEFAULT_PRIORITY, &delegate, &context));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceThrottle* throttle =
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      listener_->CreateResourceThrottle(url, ResourceType::MAIN_FRAME);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(throttle);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request->SetUserData(NULL, new ThrottleController(request.get(), throttle));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(request->is_pending());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_USER_SCRIPTS_UPDATED,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_.get()),
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool defer = false;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  throttle->WillStartRequest(&defer);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(defer);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
353