1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_resource_protocols.h" 6 7 #include "base/files/file_path.h" 8 #include "base/memory/weak_ptr.h" 9 #include "base/path_service.h" 10 #include "base/threading/thread_checker.h" 11 #include "chrome/common/chrome_paths.h" 12 #include "chrome/common/extensions/extension_file_util.h" 13 #include "content/public/browser/browser_thread.h" 14 #include "net/url_request/url_request_file_job.h" 15 16 namespace { 17 18 base::FilePath ResolvePath(const GURL& url) { 19 base::FilePath root_path; 20 PathService::Get(chrome::DIR_RESOURCES_EXTENSION, &root_path); 21 return extension_file_util::ExtensionResourceURLToFilePath(url, root_path); 22 } 23 24 class ExtensionResourcesJob : public net::URLRequestFileJob { 25 public: 26 ExtensionResourcesJob(net::URLRequest* request, 27 net::NetworkDelegate* network_delegate) 28 : net::URLRequestFileJob(request, network_delegate, base::FilePath()), 29 weak_ptr_factory_(this) { 30 } 31 32 virtual void Start() OVERRIDE; 33 34 protected: 35 virtual ~ExtensionResourcesJob() {} 36 37 void ResolvePathDone(const base::FilePath& resolved_path); 38 39 private: 40 base::WeakPtrFactory<ExtensionResourcesJob> weak_ptr_factory_; 41 42 base::ThreadChecker thread_checker_; 43 44 DISALLOW_COPY_AND_ASSIGN(ExtensionResourcesJob); 45 }; 46 47 void ExtensionResourcesJob::Start() { 48 DCHECK(thread_checker_.CalledOnValidThread()); 49 content::BrowserThread::PostTaskAndReplyWithResult( 50 content::BrowserThread::FILE, FROM_HERE, 51 base::Bind(&ResolvePath, request()->url()), 52 base::Bind(&ExtensionResourcesJob::ResolvePathDone, 53 weak_ptr_factory_.GetWeakPtr())); 54 } 55 56 void ExtensionResourcesJob::ResolvePathDone( 57 const base::FilePath& resolved_path) { 58 DCHECK(thread_checker_.CalledOnValidThread()); 59 file_path_ = resolved_path; 60 net::URLRequestFileJob::Start(); 61 } 62 63 class ExtensionResourceProtocolHandler 64 : public net::URLRequestJobFactory::ProtocolHandler { 65 public: 66 ExtensionResourceProtocolHandler() {} 67 virtual ~ExtensionResourceProtocolHandler() {} 68 69 virtual net::URLRequestJob* MaybeCreateJob( 70 net::URLRequest* request, 71 net::NetworkDelegate* network_delegate) const OVERRIDE; 72 73 private: 74 DISALLOW_COPY_AND_ASSIGN(ExtensionResourceProtocolHandler); 75 }; 76 77 // Creates URLRequestJobs for chrome-extension-resource:// URLs. 78 net::URLRequestJob* 79 ExtensionResourceProtocolHandler::MaybeCreateJob( 80 net::URLRequest* request, net::NetworkDelegate* network_delegate) const { 81 return new ExtensionResourcesJob(request, network_delegate); 82 } 83 84 } // namespace 85 86 net::URLRequestJobFactory::ProtocolHandler* 87 CreateExtensionResourceProtocolHandler() { 88 return new ExtensionResourceProtocolHandler(); 89 } 90