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

Side by Side Diff: extensions/browser/guest_view/web_view/web_view_guest.cc

Issue 1143333008: Getting rid of more webview memory leaks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/browser/guest_view/web_view/web_view_guest.h" 5 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" 10 #include "components/browsing_data/storage_partition_http_cache_data_remover.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 } 159 }
160 *persist_storage = true; 160 *persist_storage = true;
161 } else { 161 } else {
162 *storage_partition_id = partition_str; 162 *storage_partition_id = partition_str;
163 *persist_storage = false; 163 *persist_storage = false;
164 } 164 }
165 } 165 }
166 166
167 void RemoveWebViewEventListenersOnIOThread( 167 void RemoveWebViewEventListenersOnIOThread(
168 void* profile, 168 void* profile,
169 const std::string& extension_id,
170 int embedder_process_id, 169 int embedder_process_id,
171 int view_instance_id) { 170 int view_instance_id) {
172 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 171 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
173 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( 172 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners(
174 profile, 173 profile,
175 extension_id,
176 embedder_process_id, 174 embedder_process_id,
177 view_instance_id); 175 view_instance_id);
178 } 176 }
179 177
180 double ConvertZoomLevelToZoomFactor(double zoom_level) { 178 double ConvertZoomLevelToZoomFactor(double zoom_level) {
181 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level); 179 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level);
182 // Because the conversion from zoom level to zoom factor isn't perfect, the 180 // Because the conversion from zoom level to zoom factor isn't perfect, the
183 // resulting zoom factor is rounded to the nearest 6th decimal place. 181 // resulting zoom factor is rounded to the nearest 6th decimal place.
184 zoom_factor = round(zoom_factor * 1000000) / 1000000; 182 zoom_factor = round(zoom_factor * 1000000) / 1000000;
185 return zoom_factor; 183 return zoom_factor;
186 } 184 }
187 185
188 } // namespace 186 } // namespace
189 187
188 using WebViewKey = std::pair<int, int>;
189 using WebViewKeyToIDMap = std::map<WebViewKey, int>;
190 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map =
lazyboy 2015/06/05 23:09:55 should we put these inside anonymous namespace?
paulmeyer 2015/06/08 17:53:59 Not sure. I didn't actually write this one, I just
191 LAZY_INSTANCE_INITIALIZER;
192
193 // static
194 void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) {
195 GuestViewBase::CleanUp(embedder_process_id, view_instance_id);
196
197 auto rph = content::RenderProcessHost::FromID(embedder_process_id);
198 auto browser_context = rph->GetBrowserContext();
lazyboy 2015/06/05 23:09:55 If I remember correctly, we were using auto only f
paulmeyer 2015/06/08 17:53:59 I was under the impression that auto should/can be
199
200 // Clean up rules registries for the WebView.
201 WebViewKey key(embedder_process_id, view_instance_id);
202 auto it = web_view_key_to_id_map.Get().find(key);
203 if (it != web_view_key_to_id_map.Get().end()) {
204 auto rules_registry_id = it->second;
205 web_view_key_to_id_map.Get().erase(it);
206 RulesRegistryService::Get(browser_context)->
207 RemoveRulesRegistriesByID(rules_registry_id);
208 }
209
210 // Clean up web request event listeners for the WebView.
211 content::BrowserThread::PostTask(
212 content::BrowserThread::IO,
213 FROM_HERE,
214 base::Bind(
215 &RemoveWebViewEventListenersOnIOThread,
216 browser_context,
217 embedder_process_id,
218 view_instance_id));
219 }
220
190 // static 221 // static
191 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) { 222 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) {
192 return new WebViewGuest(owner_web_contents); 223 return new WebViewGuest(owner_web_contents);
193 } 224 }
194 225
195 // static 226 // static
196 bool WebViewGuest::GetGuestPartitionConfigForSite( 227 bool WebViewGuest::GetGuestPartitionConfigForSite(
197 const GURL& site, 228 const GURL& site,
198 std::string* partition_domain, 229 std::string* partition_domain,
199 std::string* partition_name, 230 std::string* partition_name,
(...skipping 11 matching lines...) Expand all
211 // The partition name is user supplied value, which we have encoded when the 242 // The partition name is user supplied value, which we have encoded when the
212 // URL was created, so it needs to be decoded. 243 // URL was created, so it needs to be decoded.
213 *partition_name = 244 *partition_name =
214 net::UnescapeURLComponent(site.query(), net::UnescapeRule::NORMAL); 245 net::UnescapeURLComponent(site.query(), net::UnescapeRule::NORMAL);
215 return true; 246 return true;
216 } 247 }
217 248
218 // static 249 // static
219 const char WebViewGuest::Type[] = "webview"; 250 const char WebViewGuest::Type[] = "webview";
220 251
221 using WebViewKey = std::pair<int, int>;
222 using WebViewKeyToIDMap = std::map<WebViewKey, int>;
223 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map =
224 LAZY_INSTANCE_INITIALIZER;
225
226 // static 252 // static
227 int WebViewGuest::GetOrGenerateRulesRegistryID( 253 int WebViewGuest::GetOrGenerateRulesRegistryID(
228 int embedder_process_id, 254 int embedder_process_id,
229 int webview_instance_id) { 255 int webview_instance_id) {
230 bool is_web_view = embedder_process_id && webview_instance_id; 256 bool is_web_view = embedder_process_id && webview_instance_id;
231 if (!is_web_view) 257 if (!is_web_view)
232 return RulesRegistryService::kDefaultRulesRegistryID; 258 return RulesRegistryService::kDefaultRulesRegistryID;
233 259
234 WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id); 260 WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id);
235 auto it = web_view_key_to_id_map.Get().find(key); 261 auto it = web_view_key_to_id_map.Get().find(key);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 } 403 }
378 404
379 void WebViewGuest::EmbedderFullscreenToggled(bool entered_fullscreen) { 405 void WebViewGuest::EmbedderFullscreenToggled(bool entered_fullscreen) {
380 is_embedder_fullscreen_ = entered_fullscreen; 406 is_embedder_fullscreen_ = entered_fullscreen;
381 // If the embedder has got out of fullscreen, we get out of fullscreen 407 // If the embedder has got out of fullscreen, we get out of fullscreen
382 // mode as well. 408 // mode as well.
383 if (!entered_fullscreen) 409 if (!entered_fullscreen)
384 SetFullscreenState(false); 410 SetFullscreenState(false);
385 } 411 }
386 412
387 void WebViewGuest::EmbedderWillBeDestroyed() {
388 // Clean up rules registries for the webview.
389 RulesRegistryService::Get(browser_context())
390 ->RemoveRulesRegistriesByID(rules_registry_id_);
391 WebViewKey key(owner_web_contents()->GetRenderProcessHost()->GetID(),
392 view_instance_id());
393 web_view_key_to_id_map.Get().erase(key);
394
395 content::BrowserThread::PostTask(
396 content::BrowserThread::IO,
397 FROM_HERE,
398 base::Bind(
399 &RemoveWebViewEventListenersOnIOThread,
400 browser_context(),
401 owner_host(),
402 owner_web_contents()->GetRenderProcessHost()->GetID(),
403 view_instance_id()));
404 }
405
406 const char* WebViewGuest::GetAPINamespace() const { 413 const char* WebViewGuest::GetAPINamespace() const {
407 return webview::kAPINamespace; 414 return webview::kAPINamespace;
408 } 415 }
409 416
410 int WebViewGuest::GetTaskPrefix() const { 417 int WebViewGuest::GetTaskPrefix() const {
411 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX; 418 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX;
412 } 419 }
413 420
414 void WebViewGuest::GuestDestroyed() { 421 void WebViewGuest::GuestDestroyed() {
415 // Clean up custom context menu items for this guest. 422 // Clean up custom context menu items for this guest.
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 1442 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
1436 DispatchEventToView( 1443 DispatchEventToView(
1437 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass())); 1444 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass()));
1438 } 1445 }
1439 // Since we changed fullscreen state, sending a Resize message ensures that 1446 // Since we changed fullscreen state, sending a Resize message ensures that
1440 // renderer/ sees the change. 1447 // renderer/ sees the change.
1441 web_contents()->GetRenderViewHost()->WasResized(); 1448 web_contents()->GetRenderViewHost()->WasResized();
1442 } 1449 }
1443 1450
1444 } // namespace extensions 1451 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698