Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 #include "content/browser/font_access/font_access_service_impl.h" | |
|
nasko
2016/02/12 22:05:18
Empty line between the comment and the first inclu
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 5 | |
| 6 #include "base/files/file.h" | |
| 7 #include "base/files/file_util.h" | |
| 8 #include "base/sequenced_task_runner.h" | |
| 9 #include "content/browser/font_access/font_getter.h" | |
| 10 #include "content/public/browser/browser_thread.h" | |
| 11 #include "mojo/public/cpp/system/buffer.h" | |
| 12 #include "net/base/mime_util.h" | |
| 13 | |
| 14 namespace content { | |
| 15 FontAccessServiceImpl::FontAccessServiceImpl( | |
|
nasko
2016/02/12 22:05:17
Empty line after namespace and before the construc
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 16 base::Callback<scoped_ptr<FontCacheMap>(void)> getter, | |
| 17 mojo::InterfaceRequest<FontAccessService> request) | |
| 18 : binding_(this, std::move(request)), | |
| 19 cache_map_getter_(getter), | |
| 20 weak_factory_(this) {} | |
| 21 | |
| 22 FontAccessServiceImpl::~FontAccessServiceImpl() {} | |
| 23 | |
| 24 void FontAccessServiceImpl::GetFontList(const GetFontListCallback& callback) { | |
| 25 ClobberCacheAndReply(base::Bind(&FontAccessServiceImpl::GetFontListFromCache, | |
|
nasko
2016/02/12 22:05:18
What's the point of having a cache if every call t
Daniel Nishi
2016/02/12 22:49:39
The list itself may grow stale, but the cache allo
| |
| 26 weak_factory_.GetWeakPtr(), callback)); | |
| 27 } | |
| 28 | |
| 29 void FontAccessServiceImpl::GetFontData(const mojo::String& family, | |
| 30 const mojo::String& style, | |
| 31 const GetFontDataCallback& callback) { | |
| 32 std::string path = FindPathInCache(family.get(), style.get()); | |
| 33 // If service doesn't exist, or if the cache missed. | |
| 34 if (path.empty()) { | |
| 35 ClobberCacheAndReply(base::Bind(&FontAccessServiceImpl::GetFontDataInternal, | |
| 36 weak_factory_.GetWeakPtr(), family.get(), | |
| 37 style.get(), callback)); | |
| 38 return; | |
| 39 } | |
| 40 | |
| 41 BrowserThread::PostTaskAndReplyWithResult( | |
| 42 BrowserThread::FILE, FROM_HERE, | |
| 43 base::Bind(&FontAccessServiceImpl::GetFileInfo, path), | |
| 44 base::Bind(&FontAccessServiceImpl::GetFileDataCallback, | |
| 45 weak_factory_.GetWeakPtr(), callback, path)); | |
| 46 } | |
| 47 | |
| 48 void FontAccessServiceImpl::Create( | |
| 49 mojo::InterfaceRequest<FontAccessService> request) { | |
| 50 new FontAccessServiceImpl(base::Bind(&content::GetFontCacheMap), | |
| 51 std::move(request)); | |
| 52 } | |
| 53 | |
| 54 FontAccessServiceImpl::BlobInfo::BlobInfo() : size(0) {} | |
| 55 FontAccessServiceImpl::BlobInfo::~BlobInfo() {} | |
|
nasko
2016/02/12 22:05:17
Empty line between the two methods.
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 56 | |
| 57 void FontAccessServiceImpl::GetFontListFromCache( | |
| 58 const GetFontListCallback& callback) { | |
| 59 FontCacheMap::iterator iter; | |
| 60 mojo::Array<FontDescriptionPtr> font_infos(0); | |
| 61 for (auto& entry : *font_cache_map_) { | |
|
nasko
2016/02/12 22:05:18
font_cache_map_.get()
Daniel Nishi
2016/02/12 22:49:39
The operator* does a .get() and dereferences it. I
| |
| 62 for (auto& face_entry : entry.second) { | |
| 63 FontDescriptionPtr font_ptr = | |
| 64 FontDescription::New(); | |
| 65 font_ptr->family = entry.first; | |
| 66 font_ptr->style = face_entry.first; | |
| 67 font_ptr->fullName = face_entry.second.full_name; | |
| 68 font_infos.push_back(std::move(font_ptr)); | |
| 69 } | |
| 70 } | |
| 71 callback.Run(std::move(font_infos)); | |
| 72 } | |
| 73 | |
| 74 void FontAccessServiceImpl::GetFontDataInternal( | |
| 75 const std::string& family, | |
| 76 const std::string& style, | |
| 77 const GetFontDataCallback& callback) { | |
| 78 std::string path = FindPathInCache(family, style); | |
| 79 if (path == "") { | |
| 80 callback.Run(mojo::ScopedHandleBase<mojo::SharedBufferHandle>(), 0); | |
| 81 return; | |
| 82 } | |
| 83 | |
| 84 BrowserThread::PostTaskAndReplyWithResult( | |
| 85 BrowserThread::FILE, FROM_HERE, | |
| 86 base::Bind(&FontAccessServiceImpl::GetFileInfo, path), | |
| 87 base::Bind(&FontAccessServiceImpl::GetFileDataCallback, | |
| 88 weak_factory_.GetWeakPtr(), callback, path)); | |
| 89 } | |
| 90 | |
| 91 std::string FontAccessServiceImpl::FindPathInCache( | |
|
nasko
2016/02/12 22:05:17
Why is a method looking for a path returning a std
Daniel Nishi
2016/02/12 22:49:39
base::FilePath is now used.
| |
| 92 const std::string& family, | |
| 93 const std::string& style) { | |
| 94 if (!font_cache_map_.get()) | |
| 95 return std::string(); | |
| 96 | |
| 97 FontCacheMap::iterator iter; | |
| 98 iter = font_cache_map_->find(family); | |
| 99 if (iter != font_cache_map_->end()) { | |
| 100 FontStyleMap::iterator faceIter; | |
| 101 faceIter = iter->second.find(style); | |
| 102 if (faceIter != iter->second.end()) { | |
| 103 return faceIter->second.path; | |
| 104 } | |
| 105 } | |
| 106 return std::string(); | |
| 107 } | |
| 108 | |
| 109 void FontAccessServiceImpl::ClobberCacheAndReply(const base::Closure closure) { | |
| 110 base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); | |
| 111 scoped_refptr<base::SequencedTaskRunner> tr = pool->GetSequencedTaskRunner( | |
| 112 pool->GetNamedSequenceToken(std::string(kFontAccessToken))); | |
| 113 base::PostTaskAndReplyWithResult( | |
| 114 tr.get(), FROM_HERE, cache_map_getter_, | |
| 115 base::Bind(&FontAccessServiceImpl::SwapCacheAndReply, | |
| 116 weak_factory_.GetWeakPtr(), closure)); | |
| 117 } | |
| 118 | |
| 119 void FontAccessServiceImpl::SwapCacheAndReply(const base::Closure closure, | |
| 120 scoped_ptr<FontCacheMap> cache) { | |
| 121 font_cache_map_.swap(cache); | |
| 122 closure.Run(); | |
| 123 } | |
| 124 | |
| 125 // static | |
| 126 FontAccessServiceImpl::BlobInfo FontAccessServiceImpl::GetFileInfo( | |
| 127 const std::string& path) { | |
| 128 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); | |
| 129 base::FilePath filepath(base::FilePath::FromUTF8Unsafe(path)); | |
| 130 base::File::Info info; | |
| 131 BlobInfo realInfo; | |
|
nasko
2016/02/12 22:05:17
real_info
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 132 realInfo.is_valid = base::GetFileInfo(filepath, &info); | |
| 133 if (!realInfo.is_valid) { | |
| 134 return realInfo; | |
|
nasko
2016/02/12 22:05:18
style: Indent only two spaces. One line if stateme
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 135 } | |
| 136 | |
| 137 realInfo.size = info.size; | |
| 138 realInfo.last_modified = info.last_modified; | |
| 139 net::GetMimeTypeFromFile(filepath, &realInfo.mime); | |
| 140 | |
| 141 return realInfo; | |
| 142 } | |
| 143 | |
| 144 // static | |
| 145 mojo::ScopedSharedBufferHandle FontAccessServiceImpl::GetSharedBuffer( | |
| 146 const std::string& path, | |
| 147 uint64_t size) { | |
| 148 mojo::SharedBuffer buffer(size); | |
| 149 base::FilePath filepath(base::FilePath::FromUTF8Unsafe(path)); | |
| 150 base::File file(filepath, base::File::FLAG_OPEN | base::File::FLAG_READ); | |
| 151 void* data; | |
| 152 mojo::MapBuffer(buffer.handle.get(), 0, size, &data, | |
| 153 MOJO_MAP_BUFFER_FLAG_NONE); | |
| 154 bool valid_read = file.Read(0, static_cast<char*>(data), size); | |
| 155 if (!valid_read) { | |
| 156 return mojo::ScopedHandleBase<mojo::SharedBufferHandle>(); | |
|
nasko
2016/02/12 22:05:18
style: Indent only two spaces. One line if stateme
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 157 } | |
| 158 | |
| 159 | |
|
nasko
2016/02/12 22:05:18
No need for two empty lines, one is fine.
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 160 return std::move(buffer.handle); | |
| 161 } | |
| 162 | |
| 163 void FontAccessServiceImpl::GetFileDataCallback( | |
| 164 const FontAccessService::GetFontDataCallback& callback, | |
| 165 const std::string& path, | |
| 166 BlobInfo info) { | |
| 167 if (!info.is_valid) { | |
| 168 callback.Run(mojo::ScopedHandleBase<mojo::SharedBufferHandle>(), 0); | |
|
nasko
2016/02/12 22:05:18
style: Indent only two spaces.
Daniel Nishi
2016/02/12 22:49:39
Done.
| |
| 169 return; | |
| 170 } | |
| 171 | |
| 172 BrowserThread::PostTaskAndReplyWithResult( | |
| 173 BrowserThread::FILE, FROM_HERE, | |
| 174 base::Bind(&FontAccessServiceImpl::GetSharedBuffer, path, info.size), | |
| 175 base::Bind(&FontAccessServiceImpl::PassBufferAndSize, callback, | |
| 176 info.size)); | |
| 177 } | |
| 178 | |
| 179 void FontAccessServiceImpl::PassBufferAndSize( | |
| 180 const FontAccessService::GetFontDataCallback& callback, | |
| 181 uint64_t size, | |
| 182 mojo::ScopedSharedBufferHandle handle) { | |
| 183 callback.Run(std::move(handle), size); | |
| 184 } | |
| 185 | |
| 186 } // content | |
| OLD | NEW |