• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/ui/webui/shared_resources_data_source.h"
6 
7 #include <string>
8 
9 #include "base/memory/singleton.h"
10 #include "base/threading/thread_restrictions.h"
11 #include "chrome/browser/io_thread.h"
12 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
13 #include "chrome/common/url_constants.h"
14 #include "content/browser/browser_thread.h"
15 #include "grit/app_resources.h"
16 #include "grit/generated_resources.h"
17 #include "grit/shared_resources.h"
18 #include "grit/shared_resources_map.h"
19 #include "grit/theme_resources.h"
20 #include "net/base/mime_util.h"
21 #include "ui/base/resource/resource_bundle.h"
22 
23 namespace {
24 
PathToIDR(const std::string & path)25 int PathToIDR(const std::string& path) {
26   int idr = -1;
27   if (path == "app/resources/folder_closed.png") {
28     idr = IDR_FOLDER_CLOSED;
29   } else if (path == "app/resources/folder_closed_rtl.png") {
30     idr = IDR_FOLDER_CLOSED_RTL;
31   } else if (path == "app/resources/folder_open.png") {
32     idr = IDR_FOLDER_OPEN;
33   } else if (path == "app/resources/folder_open_rtl.png") {
34     idr = IDR_FOLDER_OPEN_RTL;
35   } else if (path == "app/resources/throbber.png") {
36     idr = IDR_THROBBER;
37   } else {
38     // The name of the files in the grd list are prefixed with the following
39     // directory:
40     std::string key("shared/");
41     key += path;
42 
43     for (size_t i = 0; i < kSharedResourcesSize; ++i) {
44       if (kSharedResources[i].name == key) {
45         idr = kSharedResources[i].value;
46         break;
47       }
48     }
49   }
50 
51   return idr;
52 }
53 
54 }  // namespace
55 
SharedResourcesDataSource()56 SharedResourcesDataSource::SharedResourcesDataSource()
57     : DataSource(chrome::kChromeUIResourcesHost, NULL) {
58 }
59 
~SharedResourcesDataSource()60 SharedResourcesDataSource::~SharedResourcesDataSource() {
61 }
62 
StartDataRequest(const std::string & path,bool is_incognito,int request_id)63 void SharedResourcesDataSource::StartDataRequest(const std::string& path,
64                                                  bool is_incognito,
65                                                  int request_id) {
66   int idr = PathToIDR(path);
67   DCHECK_NE(-1, idr) << " path: " << path;
68   const ResourceBundle& rb = ResourceBundle::GetSharedInstance();
69   scoped_refptr<RefCountedStaticMemory> bytes(rb.LoadDataResourceBytes(idr));
70   SendResponse(request_id, bytes);
71 }
72 
GetMimeType(const std::string & path) const73 std::string SharedResourcesDataSource::GetMimeType(
74     const std::string& path) const {
75   // Requests should not block on the disk!  On Windows this goes to the
76   // registry.
77   //   http://code.google.com/p/chromium/issues/detail?id=59849
78   base::ThreadRestrictions::ScopedAllowIO allow_io;
79 
80   std::string mime_type;
81   net::GetMimeTypeFromFile(FilePath().AppendASCII(path), &mime_type);
82   return mime_type;
83 }
84