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