Home | History | Annotate | Download | only in extensions
      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 
     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:
     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:
     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 
     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 
     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:
     70   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*
     83 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*
     91 CreateExtensionResourceProtocolHandler() {
     92   return new ExtensionResourceProtocolHandler();
     93 }
     94