Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: chrome/browser/media_galleries/media_file_system_registry.cc

Issue 2442953002: Remove stl_util's deletion function use from chrome/. (Closed)
Patch Set: fix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media_galleries/media_file_system_registry.h" 5 #include "chrome/browser/media_galleries/media_file_system_registry.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback.h" 13 #include "base/callback.h"
14 #include "base/files/file_path.h" 14 #include "base/files/file_path.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/memory/ptr_util.h"
16 #include "base/stl_util.h" 17 #include "base/stl_util.h"
17 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" 18 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
18 #include "chrome/browser/media_galleries/gallery_watch_manager.h" 19 #include "chrome/browser/media_galleries/gallery_watch_manager.h"
19 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h" 20 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
20 #include "chrome/browser/media_galleries/media_file_system_context.h" 21 #include "chrome/browser/media_galleries/media_file_system_context.h"
21 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 22 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
22 #include "chrome/browser/media_galleries/media_galleries_histograms.h" 23 #include "chrome/browser/media_galleries/media_galleries_histograms.h"
23 #include "chrome/browser/media_galleries/media_galleries_preferences_factory.h" 24 #include "chrome/browser/media_galleries/media_galleries_preferences_factory.h"
24 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile.h"
25 #include "chrome/common/chrome_paths.h" 26 #include "chrome/common/chrome_paths.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 // back informs the caller. 88 // back informs the caller.
88 class RPHReferenceManager { 89 class RPHReferenceManager {
89 public: 90 public:
90 // |no_references_callback| is called when the last WebContents reference 91 // |no_references_callback| is called when the last WebContents reference
91 // goes away. WebContents references are added through 92 // goes away. WebContents references are added through
92 // ReferenceFromWebContents(). 93 // ReferenceFromWebContents().
93 explicit RPHReferenceManager(const base::Closure& no_references_callback); 94 explicit RPHReferenceManager(const base::Closure& no_references_callback);
94 virtual ~RPHReferenceManager(); 95 virtual ~RPHReferenceManager();
95 96
96 // Remove all references, but don't call |no_references_callback|. 97 // Remove all references, but don't call |no_references_callback|.
97 void Reset() { base::STLDeleteValues(&observer_map_); } 98 void Reset() { observer_map_.clear(); }
98 99
99 // Returns true if there are no references; 100 // Returns true if there are no references.
100 bool empty() const { return observer_map_.empty(); } 101 bool empty() const { return observer_map_.empty(); }
101 102
102 // Adds a reference to the passed |contents|. Calling this multiple times with 103 // Adds a reference to the passed |contents|. Calling this multiple times with
103 // the same |contents| is a no-op. 104 // the same |contents| is a no-op.
104 void ReferenceFromWebContents(content::WebContents* contents); 105 void ReferenceFromWebContents(content::WebContents* contents);
105 106
106 private: 107 private:
107 class RPHWebContentsObserver : public content::WebContentsObserver { 108 class RPHWebContentsObserver : public content::WebContentsObserver {
108 public: 109 public:
109 RPHWebContentsObserver(RPHReferenceManager* manager, 110 RPHWebContentsObserver(RPHReferenceManager* manager,
(...skipping 17 matching lines...) Expand all
127 void RemoveWebContentsObserver(WebContents* web_contents); 128 void RemoveWebContentsObserver(WebContents* web_contents);
128 bool HasWebContentsObservers() { 129 bool HasWebContentsObservers() {
129 return observed_web_contentses_.size() > 0; 130 return observed_web_contentses_.size() > 0;
130 } 131 }
131 132
132 private: 133 private:
133 void RenderProcessHostDestroyed(RenderProcessHost* host) override; 134 void RenderProcessHostDestroyed(RenderProcessHost* host) override;
134 135
135 RPHReferenceManager* manager_; 136 RPHReferenceManager* manager_;
136 RenderProcessHost* host_; 137 RenderProcessHost* host_;
137 typedef std::map<WebContents*, RPHWebContentsObserver*> WCObserverMap; 138 std::map<WebContents*, std::unique_ptr<RPHWebContentsObserver>>
138 WCObserverMap observed_web_contentses_; 139 observed_web_contentses_;
139 }; 140 };
140 typedef std::map<const RenderProcessHost*, RPHObserver*> RPHObserverMap;
141 141
142 // Handlers for observed events. 142 // Handlers for observed events.
143 void OnRenderProcessHostDestroyed(RenderProcessHost* rph); 143 void OnRenderProcessHostDestroyed(RenderProcessHost* rph);
144 void OnWebContentsDestroyedOrNavigated(WebContents* contents); 144 void OnWebContentsDestroyedOrNavigated(WebContents* contents);
145 145
146 // A callback to call when the last RVH reference goes away. 146 // A callback to call when the last RVH reference goes away.
147 base::Closure no_references_callback_; 147 base::Closure no_references_callback_;
148 148
149 // The set of render processes and web contents that may have references to 149 // The set of render processes and web contents that may have references to
150 // the file system ids this instance manages. 150 // the file system ids this instance manages.
151 RPHObserverMap observer_map_; 151 std::map<const RenderProcessHost*, std::unique_ptr<RPHObserver>>
152 observer_map_;
152 }; 153 };
153 154
154 RPHReferenceManager::RPHReferenceManager( 155 RPHReferenceManager::RPHReferenceManager(
155 const base::Closure& no_references_callback) 156 const base::Closure& no_references_callback)
156 : no_references_callback_(no_references_callback) { 157 : no_references_callback_(no_references_callback) {
157 } 158 }
158 159
159 RPHReferenceManager::~RPHReferenceManager() { 160 RPHReferenceManager::~RPHReferenceManager() {
160 Reset(); 161 Reset();
161 } 162 }
162 163
163 void RPHReferenceManager::ReferenceFromWebContents( 164 void RPHReferenceManager::ReferenceFromWebContents(
164 content::WebContents* contents) { 165 content::WebContents* contents) {
165 RenderProcessHost* rph = contents->GetRenderProcessHost(); 166 RenderProcessHost* rph = contents->GetRenderProcessHost();
166 RPHObserver* state = NULL;
167 if (!base::ContainsKey(observer_map_, rph)) { 167 if (!base::ContainsKey(observer_map_, rph)) {
168 state = new RPHObserver(this, rph); 168 observer_map_[rph] = base::MakeUnique<RPHObserver>(this, rph);
169 observer_map_[rph] = state;
170 } else {
171 state = observer_map_[rph];
172 } 169 }
173 170 observer_map_[rph]->AddWebContentsObserver(contents);
174 state->AddWebContentsObserver(contents);
175 } 171 }
176 172
177 RPHReferenceManager::RPHWebContentsObserver::RPHWebContentsObserver( 173 RPHReferenceManager::RPHWebContentsObserver::RPHWebContentsObserver(
178 RPHReferenceManager* manager, 174 RPHReferenceManager* manager,
179 WebContents* web_contents) 175 WebContents* web_contents)
180 : content::WebContentsObserver(web_contents), 176 : content::WebContentsObserver(web_contents),
181 manager_(manager) { 177 manager_(manager) {
182 } 178 }
183 179
184 void RPHReferenceManager::RPHWebContentsObserver::WebContentsDestroyed() { 180 void RPHReferenceManager::RPHWebContentsObserver::WebContentsDestroyed() {
185 manager_->OnWebContentsDestroyedOrNavigated(web_contents()); 181 manager_->OnWebContentsDestroyedOrNavigated(web_contents());
186 } 182 }
187 183
188 void RPHReferenceManager::RPHWebContentsObserver::NavigationEntryCommitted( 184 void RPHReferenceManager::RPHWebContentsObserver::NavigationEntryCommitted(
189 const content::LoadCommittedDetails& load_details) { 185 const content::LoadCommittedDetails& load_details) {
190 if (load_details.is_in_page) 186 if (load_details.is_in_page)
191 return; 187 return;
192 188
193 manager_->OnWebContentsDestroyedOrNavigated(web_contents()); 189 manager_->OnWebContentsDestroyedOrNavigated(web_contents());
194 } 190 }
195 191
196 RPHReferenceManager::RPHObserver::RPHObserver( 192 RPHReferenceManager::RPHObserver::RPHObserver(
197 RPHReferenceManager* manager, RenderProcessHost* host) 193 RPHReferenceManager* manager, RenderProcessHost* host)
198 : manager_(manager), 194 : manager_(manager),
199 host_(host) { 195 host_(host) {
200 host->AddObserver(this); 196 host->AddObserver(this);
201 } 197 }
202 198
203 RPHReferenceManager::RPHObserver::~RPHObserver() { 199 RPHReferenceManager::RPHObserver::~RPHObserver() {
204 base::STLDeleteValues(&observed_web_contentses_); 200 observed_web_contentses_.clear();
205 if (host_) 201 if (host_)
206 host_->RemoveObserver(this); 202 host_->RemoveObserver(this);
207 } 203 }
208 204
209 void RPHReferenceManager::RPHObserver::AddWebContentsObserver( 205 void RPHReferenceManager::RPHObserver::AddWebContentsObserver(
210 WebContents* web_contents) { 206 WebContents* web_contents) {
211 if (base::ContainsKey(observed_web_contentses_, web_contents)) 207 if (base::ContainsKey(observed_web_contentses_, web_contents))
212 return; 208 return;
213 209
214 RPHWebContentsObserver* observer = 210 observed_web_contentses_[web_contents] =
215 new RPHWebContentsObserver(manager_, web_contents); 211 base::MakeUnique<RPHWebContentsObserver>(manager_, web_contents);
216 observed_web_contentses_[web_contents] = observer;
217 } 212 }
218 213
219 void RPHReferenceManager::RPHObserver::RemoveWebContentsObserver( 214 void RPHReferenceManager::RPHObserver::RemoveWebContentsObserver(
220 WebContents* web_contents) { 215 WebContents* web_contents) {
221 WCObserverMap::iterator wco_iter = 216 DCHECK(observed_web_contentses_.find(web_contents) !=
222 observed_web_contentses_.find(web_contents); 217 observed_web_contentses_.end());
223 DCHECK(wco_iter != observed_web_contentses_.end()); 218 observed_web_contentses_.erase(web_contents);
224 delete wco_iter->second;
225 observed_web_contentses_.erase(wco_iter);
226 } 219 }
227 220
228 void RPHReferenceManager::RPHObserver::RenderProcessHostDestroyed( 221 void RPHReferenceManager::RPHObserver::RenderProcessHostDestroyed(
229 RenderProcessHost* host) { 222 RenderProcessHost* host) {
230 host_ = NULL; 223 host_ = NULL;
231 manager_->OnRenderProcessHostDestroyed(host); 224 manager_->OnRenderProcessHostDestroyed(host);
232 } 225 }
233 226
234 void RPHReferenceManager::OnRenderProcessHostDestroyed( 227 void RPHReferenceManager::OnRenderProcessHostDestroyed(
235 RenderProcessHost* rph) { 228 RenderProcessHost* rph) {
236 RPHObserverMap::iterator rph_info = observer_map_.find(rph); 229 auto rph_info = observer_map_.find(rph);
237 // This could be a potential problem if the RPH is navigated to a page on the 230 // This could be a potential problem if the RPH is navigated to a page on the
238 // same renderer (triggering OnWebContentsDestroyedOrNavigated()) and then the 231 // same renderer (triggering OnWebContentsDestroyedOrNavigated()) and then the
239 // renderer crashes. 232 // renderer crashes.
240 if (rph_info == observer_map_.end()) { 233 if (rph_info == observer_map_.end()) {
241 NOTREACHED(); 234 NOTREACHED();
242 return; 235 return;
243 } 236 }
244 delete rph_info->second;
245 observer_map_.erase(rph_info); 237 observer_map_.erase(rph_info);
246 if (observer_map_.empty()) 238 if (observer_map_.empty())
247 no_references_callback_.Run(); 239 no_references_callback_.Run();
248 } 240 }
249 241
250 void RPHReferenceManager::OnWebContentsDestroyedOrNavigated( 242 void RPHReferenceManager::OnWebContentsDestroyedOrNavigated(
251 WebContents* contents) { 243 WebContents* contents) {
252 RenderProcessHost* rph = contents->GetRenderProcessHost(); 244 RenderProcessHost* rph = contents->GetRenderProcessHost();
253 RPHObserverMap::iterator rph_info = observer_map_.find(rph); 245 auto rph_info = observer_map_.find(rph);
254 DCHECK(rph_info != observer_map_.end()); 246 DCHECK(rph_info != observer_map_.end());
255 247
256 rph_info->second->RemoveWebContentsObserver(contents); 248 rph_info->second->RemoveWebContentsObserver(contents);
257 if (!rph_info->second->HasWebContentsObservers()) 249 if (!rph_info->second->HasWebContentsObservers())
258 OnRenderProcessHostDestroyed(rph); 250 OnRenderProcessHostDestroyed(rph);
259 } 251 }
260 252
261 } // namespace 253 } // namespace
262 254
263 MediaFileSystemInfo::MediaFileSystemInfo(const base::string16& fs_name, 255 MediaFileSystemInfo::MediaFileSystemInfo(const base::string16& fs_name,
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
878 DCHECK_CURRENTLY_ON(BrowserThread::UI); 870 DCHECK_CURRENTLY_ON(BrowserThread::UI);
879 871
880 auto extension_hosts_it = extension_hosts_map_.find(profile); 872 auto extension_hosts_it = extension_hosts_map_.find(profile);
881 DCHECK(extension_hosts_it != extension_hosts_map_.end()); 873 DCHECK(extension_hosts_it != extension_hosts_map_.end());
882 extension_hosts_map_.erase(extension_hosts_it); 874 extension_hosts_map_.erase(extension_hosts_it);
883 875
884 auto profile_subscription_it = profile_subscription_map_.find(profile); 876 auto profile_subscription_it = profile_subscription_map_.find(profile);
885 DCHECK(profile_subscription_it != profile_subscription_map_.end()); 877 DCHECK(profile_subscription_it != profile_subscription_map_.end());
886 profile_subscription_map_.erase(profile_subscription_it); 878 profile_subscription_map_.erase(profile_subscription_it);
887 } 879 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698