• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/sequenced_worker_pool.h"
11 #include "base/threading/thread_checker.h"
12 #include "chrome/common/chrome_paths.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "extensions/common/file_util.h"
15 #include "net/url_request/url_request_file_job.h"
16 
17 namespace {
18 
ResolvePath(const GURL & url)19 base::FilePath ResolvePath(const GURL& url) {
20   base::FilePath root_path;
21   PathService::Get(chrome::DIR_RESOURCES_EXTENSION, &root_path);
22   return extensions::file_util::ExtensionResourceURLToFilePath(url, root_path);
23 }
24 
25 class ExtensionResourcesJob : public net::URLRequestFileJob {
26  public:
ExtensionResourcesJob(net::URLRequest * request,net::NetworkDelegate * network_delegate)27   ExtensionResourcesJob(net::URLRequest* request,
28                         net::NetworkDelegate* network_delegate)
29       : net::URLRequestFileJob(
30             request, network_delegate, base::FilePath(),
31             content::BrowserThread::GetBlockingPool()->
32                 GetTaskRunnerWithShutdownBehavior(
33                     base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)),
34         weak_ptr_factory_(this) {}
35 
36   virtual void Start() OVERRIDE;
37 
38  protected:
~ExtensionResourcesJob()39   virtual ~ExtensionResourcesJob() {}
40 
41   void ResolvePathDone(const base::FilePath& resolved_path);
42 
43  private:
44   base::WeakPtrFactory<ExtensionResourcesJob> weak_ptr_factory_;
45 
46   base::ThreadChecker thread_checker_;
47 
48   DISALLOW_COPY_AND_ASSIGN(ExtensionResourcesJob);
49 };
50 
Start()51 void ExtensionResourcesJob::Start() {
52   DCHECK(thread_checker_.CalledOnValidThread());
53   content::BrowserThread::PostTaskAndReplyWithResult(
54       content::BrowserThread::FILE, FROM_HERE,
55       base::Bind(&ResolvePath, request()->url()),
56       base::Bind(&ExtensionResourcesJob::ResolvePathDone,
57           weak_ptr_factory_.GetWeakPtr()));
58 }
59 
ResolvePathDone(const base::FilePath & resolved_path)60 void ExtensionResourcesJob::ResolvePathDone(
61     const base::FilePath& resolved_path) {
62   DCHECK(thread_checker_.CalledOnValidThread());
63   file_path_ = resolved_path;
64   net::URLRequestFileJob::Start();
65 }
66 
67 class ExtensionResourceProtocolHandler
68     : public net::URLRequestJobFactory::ProtocolHandler {
69  public:
ExtensionResourceProtocolHandler()70   ExtensionResourceProtocolHandler() {}
~ExtensionResourceProtocolHandler()71   virtual ~ExtensionResourceProtocolHandler() {}
72 
73   virtual net::URLRequestJob* MaybeCreateJob(
74       net::URLRequest* request,
75       net::NetworkDelegate* network_delegate) const OVERRIDE;
76 
77  private:
78   DISALLOW_COPY_AND_ASSIGN(ExtensionResourceProtocolHandler);
79 };
80 
81 // Creates URLRequestJobs for chrome-extension-resource:// URLs.
82 net::URLRequestJob*
MaybeCreateJob(net::URLRequest * request,net::NetworkDelegate * network_delegate) const83 ExtensionResourceProtocolHandler::MaybeCreateJob(
84     net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
85   return new ExtensionResourcesJob(request, network_delegate);
86 }
87 
88 }  // namespace
89 
90 net::URLRequestJobFactory::ProtocolHandler*
CreateExtensionResourceProtocolHandler()91 CreateExtensionResourceProtocolHandler() {
92   return new ExtensionResourceProtocolHandler();
93 }
94