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

Side by Side Diff: extensions/browser/guest_view/app_view/app_view_guest.cc

Issue 1181893003: Kill bad apps. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a Missing File Created 5 years, 5 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/app_view/app_view_guest.h" 5 #include "extensions/browser/guest_view/app_view/app_view_guest.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "components/guest_view/browser/guest_view_manager.h" 8 #include "components/guest_view/browser/guest_view_manager.h"
9 #include "content/public/browser/render_view_host.h" 9 #include "content/public/browser/render_process_host.h"
10 #include "content/public/browser/user_metrics.h"
10 #include "content/public/common/renderer_preferences.h" 11 #include "content/public/common/renderer_preferences.h"
11 #include "extensions/browser/api/app_runtime/app_runtime_api.h" 12 #include "extensions/browser/api/app_runtime/app_runtime_api.h"
12 #include "extensions/browser/api/extensions_api_client.h" 13 #include "extensions/browser/api/extensions_api_client.h"
13 #include "extensions/browser/app_window/app_delegate.h" 14 #include "extensions/browser/app_window/app_delegate.h"
14 #include "extensions/browser/event_router.h" 15 #include "extensions/browser/event_router.h"
15 #include "extensions/browser/extension_host.h" 16 #include "extensions/browser/extension_host.h"
16 #include "extensions/browser/extension_registry.h" 17 #include "extensions/browser/extension_registry.h"
17 #include "extensions/browser/guest_view/app_view/app_view_constants.h" 18 #include "extensions/browser/guest_view/app_view/app_view_constants.h"
18 #include "extensions/browser/lazy_background_task_queue.h" 19 #include "extensions/browser/lazy_background_task_queue.h"
19 #include "extensions/browser/process_manager.h" 20 #include "extensions/browser/process_manager.h"
(...skipping 26 matching lines...) Expand all
46 app_view_guest(app_view_guest), 47 app_view_guest(app_view_guest),
47 callback(callback) {} 48 callback(callback) {}
48 49
49 ~ResponseInfo() {} 50 ~ResponseInfo() {}
50 }; 51 };
51 52
52 typedef std::map<int, linked_ptr<ResponseInfo> > PendingResponseMap; 53 typedef std::map<int, linked_ptr<ResponseInfo> > PendingResponseMap;
53 static base::LazyInstance<PendingResponseMap> pending_response_map = 54 static base::LazyInstance<PendingResponseMap> pending_response_map =
54 LAZY_INSTANCE_INITIALIZER; 55 LAZY_INSTANCE_INITIALIZER;
55 56
57 void KillRenderProcessHostAndRecordUMAMetric(int render_process_host_id) {
58 content::RecordAction(
59 base::UserMetricsAction("BadExtensionTerminate_AppViewTag"));
60 content::RenderProcessHost::FromID(render_process_host_id)
61 ->Shutdown(-1, false);
62 }
63
56 } // namespace 64 } // namespace
57 65
58 // static. 66 // static.
59 const char AppViewGuest::Type[] = "appview"; 67 const char AppViewGuest::Type[] = "appview";
60 68
61 // static. 69 // static.
62 bool AppViewGuest::CompletePendingRequest( 70 bool AppViewGuest::CompletePendingRequest(
63 content::BrowserContext* browser_context, 71 content::BrowserContext* browser_context,
64 const GURL& url, 72 const GURL& url,
65 int guest_instance_id, 73 int guest_instance_id,
66 const std::string& guest_extension_id) { 74 const std::string& guest_extension_id,
75 int guest_render_process_host_id) {
67 PendingResponseMap* response_map = pending_response_map.Pointer(); 76 PendingResponseMap* response_map = pending_response_map.Pointer();
68 PendingResponseMap::iterator it = response_map->find(guest_instance_id); 77 PendingResponseMap::iterator it = response_map->find(guest_instance_id);
69 if (it == response_map->end()) { 78 if (it == response_map->end()) {
70 // TODO(fsamuel): An app is sending invalid responses. We should probably 79 // The app is asking for a non-existent <appview>.
71 // kill it. 80 KillRenderProcessHostAndRecordUMAMetric(guest_render_process_host_id);
72 return false; 81 return false;
73 } 82 }
74 83
75 linked_ptr<ResponseInfo> response_info = it->second; 84 linked_ptr<ResponseInfo> response_info = it->second;
76 if (!response_info->app_view_guest || 85 if (!response_info->app_view_guest ||
77 (response_info->guest_extension->id() != guest_extension_id)) { 86 (response_info->guest_extension->id() != guest_extension_id)) {
78 // TODO(fsamuel): An app is trying to respond to an <appview> that didn't 87 // The app is trying to communicate with an <appview> not assigned to it.
79 // initiate communication with it. We should kill the app here. 88 KillRenderProcessHostAndRecordUMAMetric(guest_render_process_host_id);
80 return false; 89 return false;
81 } 90 }
82 91
83 response_info->app_view_guest->CompleteCreateWebContents( 92 response_info->app_view_guest->CompleteCreateWebContents(
84 url, response_info->guest_extension.get(), response_info->callback); 93 url, response_info->guest_extension.get(), response_info->callback);
85 94
86 response_map->erase(guest_instance_id); 95 response_map->erase(guest_instance_id);
87 return true; 96 return true;
88 } 97 }
89 98
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 embed_request->SetString(appview::kEmbedderID, owner_host()); 272 embed_request->SetString(appview::kEmbedderID, owner_host());
264 embed_request->Set(appview::kData, data.release()); 273 embed_request->Set(appview::kData, data.release());
265 AppRuntimeEventRouter::DispatchOnEmbedRequestedEvent( 274 AppRuntimeEventRouter::DispatchOnEmbedRequestedEvent(
266 browser_context(), embed_request.Pass(), extension_host->extension()); 275 browser_context(), embed_request.Pass(), extension_host->extension());
267 } 276 }
268 277
269 void AppViewGuest::SetAppDelegateForTest(AppDelegate* delegate) { 278 void AppViewGuest::SetAppDelegateForTest(AppDelegate* delegate) {
270 app_delegate_.reset(delegate); 279 app_delegate_.reset(delegate);
271 } 280 }
272 281
282 // static
283 base::WeakPtr<AppViewGuest>
284 AppViewGuest::GetAppViewGuestFromExtensionIdForTesting(
285 const std::string& extension_id) {
286 for (auto it = pending_response_map.Get().begin();
287 it != pending_response_map.Get().end(); ++it) {
288 if (it->second->guest_extension->id() == extension_id) {
289 return it->second->app_view_guest->weak_ptr_factory_.GetWeakPtr();
290 }
291 }
292 return base::WeakPtr<AppViewGuest>();
293 }
294
295 void AppViewGuest::SetAppViewGuestForExtensionIdForTesting(
296 const std::string& extension_id,
297 base::WeakPtr<AppViewGuest> weak_ptr) {
298 for (auto it = pending_response_map.Get().begin();
299 it != pending_response_map.Get().end(); ++it) {
300 if (it->second->guest_extension->id() == extension_id) {
301 it->second->app_view_guest = weak_ptr;
302 }
303 }
304 }
305
306 std::vector<int> AppViewGuest::GetAllRegisteredInstanceIdsForTesting() {
307 std::vector<int> instances;
308 for (auto it = pending_response_map.Get().begin();
309 it != pending_response_map.Get().end(); ++it) {
310 instances.push_back(it->first);
311 }
312 return instances;
313 }
314
273 } // namespace extensions 315 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698