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

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: Addressed comments. 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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 } 163 }
164 *persist_storage = true; 164 *persist_storage = true;
165 } else { 165 } else {
166 *storage_partition_id = partition_str; 166 *storage_partition_id = partition_str;
167 *persist_storage = false; 167 *persist_storage = false;
168 } 168 }
169 } 169 }
170 170
171 void RemoveWebViewEventListenersOnIOThread( 171 void RemoveWebViewEventListenersOnIOThread(
172 void* profile, 172 void* profile,
173 const std::string& extension_id,
174 int embedder_process_id, 173 int embedder_process_id,
175 int view_instance_id) { 174 int view_instance_id) {
176 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 175 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
177 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( 176 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners(
178 profile, 177 profile,
179 extension_id,
180 embedder_process_id, 178 embedder_process_id,
181 view_instance_id); 179 view_instance_id);
182 } 180 }
183 181
184 double ConvertZoomLevelToZoomFactor(double zoom_level) { 182 double ConvertZoomLevelToZoomFactor(double zoom_level) {
185 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level); 183 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level);
186 // Because the conversion from zoom level to zoom factor isn't perfect, the 184 // Because the conversion from zoom level to zoom factor isn't perfect, the
187 // resulting zoom factor is rounded to the nearest 6th decimal place. 185 // resulting zoom factor is rounded to the nearest 6th decimal place.
188 zoom_factor = round(zoom_factor * 1000000) / 1000000; 186 zoom_factor = round(zoom_factor * 1000000) / 1000000;
189 return zoom_factor; 187 return zoom_factor;
190 } 188 }
191 189
190 using WebViewKey = std::pair<int, int>;
191 using WebViewKeyToIDMap = std::map<WebViewKey, int>;
192 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map =
193 LAZY_INSTANCE_INITIALIZER;
194
192 } // namespace 195 } // namespace
193 196
194 // static 197 // static
198 void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) {
199 GuestViewBase::CleanUp(embedder_process_id, view_instance_id);
200
201 auto rph = content::RenderProcessHost::FromID(embedder_process_id);
202 auto browser_context = rph->GetBrowserContext();
203
204 // Clean up rules registries for the WebView.
205 WebViewKey key(embedder_process_id, view_instance_id);
206 auto it = web_view_key_to_id_map.Get().find(key);
207 if (it != web_view_key_to_id_map.Get().end()) {
208 auto rules_registry_id = it->second;
209 web_view_key_to_id_map.Get().erase(it);
210 RulesRegistryService::Get(browser_context)
211 ->RemoveRulesRegistriesByID(rules_registry_id);
212 }
213
214 // Clean up web request event listeners for the WebView.
215 content::BrowserThread::PostTask(
216 content::BrowserThread::IO,
217 FROM_HERE,
218 base::Bind(
219 &RemoveWebViewEventListenersOnIOThread,
220 browser_context,
221 embedder_process_id,
222 view_instance_id));
223 }
224
225 // static
195 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) { 226 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) {
196 return new WebViewGuest(owner_web_contents); 227 return new WebViewGuest(owner_web_contents);
197 } 228 }
198 229
199 // static 230 // static
200 bool WebViewGuest::GetGuestPartitionConfigForSite( 231 bool WebViewGuest::GetGuestPartitionConfigForSite(
201 const GURL& site, 232 const GURL& site,
202 std::string* partition_domain, 233 std::string* partition_domain,
203 std::string* partition_name, 234 std::string* partition_name,
204 bool* in_memory) { 235 bool* in_memory) {
(...skipping 10 matching lines...) Expand all
215 // The partition name is user supplied value, which we have encoded when the 246 // The partition name is user supplied value, which we have encoded when the
216 // URL was created, so it needs to be decoded. 247 // URL was created, so it needs to be decoded.
217 *partition_name = 248 *partition_name =
218 net::UnescapeURLComponent(site.query(), net::UnescapeRule::NORMAL); 249 net::UnescapeURLComponent(site.query(), net::UnescapeRule::NORMAL);
219 return true; 250 return true;
220 } 251 }
221 252
222 // static 253 // static
223 const char WebViewGuest::Type[] = "webview"; 254 const char WebViewGuest::Type[] = "webview";
224 255
225 using WebViewKey = std::pair<int, int>;
226 using WebViewKeyToIDMap = std::map<WebViewKey, int>;
227 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map =
228 LAZY_INSTANCE_INITIALIZER;
229
230 // static 256 // static
231 int WebViewGuest::GetOrGenerateRulesRegistryID( 257 int WebViewGuest::GetOrGenerateRulesRegistryID(
232 int embedder_process_id, 258 int embedder_process_id,
233 int webview_instance_id) { 259 int webview_instance_id) {
234 bool is_web_view = embedder_process_id && webview_instance_id; 260 bool is_web_view = embedder_process_id && webview_instance_id;
235 if (!is_web_view) 261 if (!is_web_view)
236 return RulesRegistryService::kDefaultRulesRegistryID; 262 return RulesRegistryService::kDefaultRulesRegistryID;
237 263
238 WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id); 264 WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id);
239 auto it = web_view_key_to_id_map.Get().find(key); 265 auto it = web_view_key_to_id_map.Get().find(key);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 } 407 }
382 408
383 void WebViewGuest::EmbedderFullscreenToggled(bool entered_fullscreen) { 409 void WebViewGuest::EmbedderFullscreenToggled(bool entered_fullscreen) {
384 is_embedder_fullscreen_ = entered_fullscreen; 410 is_embedder_fullscreen_ = entered_fullscreen;
385 // If the embedder has got out of fullscreen, we get out of fullscreen 411 // If the embedder has got out of fullscreen, we get out of fullscreen
386 // mode as well. 412 // mode as well.
387 if (!entered_fullscreen) 413 if (!entered_fullscreen)
388 SetFullscreenState(false); 414 SetFullscreenState(false);
389 } 415 }
390 416
391 void WebViewGuest::EmbedderWillBeDestroyed() {
392 // Clean up rules registries for the webview.
393 RulesRegistryService::Get(browser_context())
394 ->RemoveRulesRegistriesByID(rules_registry_id_);
395 WebViewKey key(owner_web_contents()->GetRenderProcessHost()->GetID(),
396 view_instance_id());
397 web_view_key_to_id_map.Get().erase(key);
398
399 content::BrowserThread::PostTask(
400 content::BrowserThread::IO,
401 FROM_HERE,
402 base::Bind(
403 &RemoveWebViewEventListenersOnIOThread,
404 browser_context(),
405 owner_host(),
406 owner_web_contents()->GetRenderProcessHost()->GetID(),
407 view_instance_id()));
408 }
409
410 const char* WebViewGuest::GetAPINamespace() const { 417 const char* WebViewGuest::GetAPINamespace() const {
411 return webview::kAPINamespace; 418 return webview::kAPINamespace;
412 } 419 }
413 420
414 int WebViewGuest::GetTaskPrefix() const { 421 int WebViewGuest::GetTaskPrefix() const {
415 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX; 422 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX;
416 } 423 }
417 424
418 void WebViewGuest::GuestDestroyed() { 425 void WebViewGuest::GuestDestroyed() {
419 // Clean up custom context menu items for this guest. 426 // Clean up custom context menu items for this guest.
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 1446 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
1440 DispatchEventToView( 1447 DispatchEventToView(
1441 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass())); 1448 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass()));
1442 } 1449 }
1443 // Since we changed fullscreen state, sending a Resize message ensures that 1450 // Since we changed fullscreen state, sending a Resize message ensures that
1444 // renderer/ sees the change. 1451 // renderer/ sees the change.
1445 web_contents()->GetRenderViewHost()->WasResized(); 1452 web_contents()->GetRenderViewHost()->WasResized();
1446 } 1453 }
1447 1454
1448 } // namespace extensions 1455 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698