[email protected] | e689367 | 2014-05-01 17:29:13 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | e689367 | 2014-05-01 17:29:13 | [diff] [blame] | 5 | #include "extensions/renderer/resource_bundle_source_map.h" |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 6 | |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 7 | #include "base/logging.h" |
Lei Zhang | 28e01caf | 2018-10-05 00:26:50 | [diff] [blame] | 8 | #include "base/stl_util.h" |
lazyboy | ce33396 | 2016-04-12 18:22:04 | [diff] [blame] | 9 | #include "base/strings/string_piece.h" |
| 10 | #include "extensions/renderer/static_v8_external_one_byte_string_resource.h" |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 11 | #include "third_party/zlib/google/compression_utils.h" |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 12 | #include "ui/base/resource/resource_bundle.h" |
| 13 | |
[email protected] | e689367 | 2014-05-01 17:29:13 | [diff] [blame] | 14 | namespace extensions { |
| 15 | |
lazyboy | ce33396 | 2016-04-12 18:22:04 | [diff] [blame] | 16 | namespace { |
| 17 | |
| 18 | v8::Local<v8::String> ConvertString(v8::Isolate* isolate, |
| 19 | const base::StringPiece& string) { |
| 20 | // v8 takes ownership of the StaticV8ExternalOneByteStringResource (see |
Dan Elphick | 378e7ab0 | 2018-12-19 17:13:41 | [diff] [blame] | 21 | // v8::String::NewExternalOneByte()). |
| 22 | return v8::String::NewExternalOneByte( |
| 23 | isolate, new StaticV8ExternalOneByteStringResource(string)) |
| 24 | .FromMaybe(v8::Local<v8::String>()); |
lazyboy | ce33396 | 2016-04-12 18:22:04 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | } // namespace |
| 28 | |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 29 | ResourceBundleSourceMap::ResourceInfo::ResourceInfo() = default; |
dpapad | 1aba5c34 | 2019-05-13 23:44:36 | [diff] [blame] | 30 | ResourceBundleSourceMap::ResourceInfo::ResourceInfo(int in_id) : id(in_id) {} |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 31 | ResourceBundleSourceMap::ResourceInfo::ResourceInfo(ResourceInfo&& other) = |
| 32 | default; |
| 33 | |
| 34 | ResourceBundleSourceMap::ResourceInfo::~ResourceInfo() = default; |
| 35 | |
| 36 | ResourceBundleSourceMap::ResourceInfo& ResourceBundleSourceMap::ResourceInfo:: |
| 37 | operator=(ResourceInfo&& other) = default; |
| 38 | |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 39 | ResourceBundleSourceMap::ResourceBundleSourceMap( |
| 40 | const ui::ResourceBundle* resource_bundle) |
| 41 | : resource_bundle_(resource_bundle) { |
| 42 | } |
| 43 | |
| 44 | ResourceBundleSourceMap::~ResourceBundleSourceMap() { |
| 45 | } |
| 46 | |
dcheng | 2842817 | 2017-02-06 05:39:29 | [diff] [blame] | 47 | void ResourceBundleSourceMap::RegisterSource(const char* const name, |
dpapad | 1aba5c34 | 2019-05-13 23:44:36 | [diff] [blame] | 48 | int resource_id) { |
| 49 | resource_map_.emplace(name, resource_id); |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 50 | } |
| 51 | |
rdevlin.cronin | 1ed2e89 | 2016-12-06 21:35:43 | [diff] [blame] | 52 | v8::Local<v8::String> ResourceBundleSourceMap::GetSource( |
[email protected] | 6f59d3b | 2013-12-02 12:50:50 | [diff] [blame] | 53 | v8::Isolate* isolate, |
lazyboy | ce33396 | 2016-04-12 18:22:04 | [diff] [blame] | 54 | const std::string& name) const { |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 55 | auto resource_iter = resource_map_.find(name); |
| 56 | if (resource_iter == resource_map_.end()) { |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 57 | NOTREACHED() << "No module is registered with name \"" << name << "\""; |
rdevlin.cronin | 1ed2e89 | 2016-12-06 21:35:43 | [diff] [blame] | 58 | return v8::Local<v8::String>(); |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 59 | } |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 60 | |
| 61 | const ResourceInfo& info = resource_iter->second; |
| 62 | if (info.cached) |
| 63 | return ConvertString(isolate, *info.cached); |
| 64 | |
| 65 | base::StringPiece resource = resource_bundle_->GetRawDataResource(info.id); |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 66 | if (resource.empty()) { |
| 67 | NOTREACHED() |
| 68 | << "Module resource registered as \"" << name << "\" not found"; |
rdevlin.cronin | 1ed2e89 | 2016-12-06 21:35:43 | [diff] [blame] | 69 | return v8::Local<v8::String>(); |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 70 | } |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 71 | |
dpapad | 1aba5c34 | 2019-05-13 23:44:36 | [diff] [blame] | 72 | bool is_gzipped = resource_bundle_->IsGzipped(info.id); |
| 73 | if (is_gzipped) { |
Yuzhu Shen | bcd734d | 2017-11-15 20:40:58 | [diff] [blame] | 74 | info.cached = std::make_unique<std::string>(); |
| 75 | uint32_t size = compression::GetUncompressedSize(resource); |
| 76 | info.cached->resize(size); |
| 77 | base::StringPiece uncompressed(*info.cached); |
| 78 | if (!compression::GzipUncompress(resource, uncompressed)) { |
| 79 | // Let |info.cached| point to an empty string, so that the next time when |
| 80 | // the resource is requested, the method returns an empty string directly, |
| 81 | // instead of trying to uncompress again. |
| 82 | info.cached->clear(); |
| 83 | return v8::Local<v8::String>(); |
| 84 | } |
| 85 | resource = uncompressed; |
| 86 | } |
| 87 | |
kalman | 714075f | 2015-04-09 17:57:07 | [diff] [blame] | 88 | return ConvertString(isolate, resource); |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 89 | } |
| 90 | |
lazyboy | ce33396 | 2016-04-12 18:22:04 | [diff] [blame] | 91 | bool ResourceBundleSourceMap::Contains(const std::string& name) const { |
Jan Wilken Dörrie | 0fd53a2 | 2019-06-07 09:55:46 | [diff] [blame] | 92 | return base::Contains(resource_map_, name); |
[email protected] | ecde191 | 2012-03-16 06:25:31 | [diff] [blame] | 93 | } |
| 94 | |
[email protected] | e689367 | 2014-05-01 17:29:13 | [diff] [blame] | 95 | } // namespace extensions |