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

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api.cc

Issue 23514016: <webview>: Cleanup WebRequest event listeners when embedder destroyed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More fixes Created 7 years, 3 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/extensions/api/web_request/web_request_api.h" 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does 390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does
391 // not play well with event pages. See downloads.onDeterminingFilename and 391 // not play well with event pages. See downloads.onDeterminingFilename and
392 // ExtensionDownloadsEventRouter for an alternative approach. 392 // ExtensionDownloadsEventRouter for an alternative approach.
393 struct ExtensionWebRequestEventRouter::EventListener { 393 struct ExtensionWebRequestEventRouter::EventListener {
394 std::string extension_id; 394 std::string extension_id;
395 std::string extension_name; 395 std::string extension_name;
396 std::string sub_event_name; 396 std::string sub_event_name;
397 RequestFilter filter; 397 RequestFilter filter;
398 int extra_info_spec; 398 int extra_info_spec;
399 int embedder_process_id; 399 int embedder_process_id;
400 int embedder_routing_id;
401 int webview_instance_id; 400 int webview_instance_id;
402 base::WeakPtr<IPC::Sender> ipc_sender; 401 base::WeakPtr<IPC::Sender> ipc_sender;
403 mutable std::set<uint64> blocked_requests; 402 mutable std::set<uint64> blocked_requests;
404 403
405 // Comparator to work with std::set. 404 // Comparator to work with std::set.
406 bool operator<(const EventListener& that) const { 405 bool operator<(const EventListener& that) const {
407 if (extension_id < that.extension_id) 406 if (extension_id < that.extension_id)
408 return true; 407 return true;
409 if (extension_id == that.extension_id && 408 if (extension_id == that.extension_id &&
410 sub_event_name < that.sub_event_name) 409 sub_event_name < that.sub_event_name)
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 1165
1167 bool ExtensionWebRequestEventRouter::AddEventListener( 1166 bool ExtensionWebRequestEventRouter::AddEventListener(
1168 void* profile, 1167 void* profile,
1169 const std::string& extension_id, 1168 const std::string& extension_id,
1170 const std::string& extension_name, 1169 const std::string& extension_name,
1171 const std::string& event_name, 1170 const std::string& event_name,
1172 const std::string& sub_event_name, 1171 const std::string& sub_event_name,
1173 const RequestFilter& filter, 1172 const RequestFilter& filter,
1174 int extra_info_spec, 1173 int extra_info_spec,
1175 int embedder_process_id, 1174 int embedder_process_id,
1176 int embedder_routing_id,
1177 int webview_instance_id, 1175 int webview_instance_id,
1178 base::WeakPtr<IPC::Sender> ipc_sender) { 1176 base::WeakPtr<IPC::Sender> ipc_sender) {
1179 1177
1180 if (!IsWebRequestEvent(event_name)) 1178 if (!IsWebRequestEvent(event_name))
1181 return false; 1179 return false;
1182 1180
1183 EventListener listener; 1181 EventListener listener;
1184 listener.extension_id = extension_id; 1182 listener.extension_id = extension_id;
1185 listener.extension_name = extension_name; 1183 listener.extension_name = extension_name;
1186 listener.sub_event_name = sub_event_name; 1184 listener.sub_event_name = sub_event_name;
1187 listener.filter = filter; 1185 listener.filter = filter;
1188 listener.extra_info_spec = extra_info_spec; 1186 listener.extra_info_spec = extra_info_spec;
1189 listener.ipc_sender = ipc_sender; 1187 listener.ipc_sender = ipc_sender;
1190 listener.embedder_process_id = embedder_process_id; 1188 listener.embedder_process_id = embedder_process_id;
1191 listener.embedder_routing_id = embedder_routing_id;
1192 listener.webview_instance_id = webview_instance_id; 1189 listener.webview_instance_id = webview_instance_id;
1193 if (listener.webview_instance_id) 1190 if (listener.webview_instance_id)
1194 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener")); 1191 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener"));
1195 1192
1196 if (listeners_[profile][event_name].count(listener) != 0u) { 1193 if (listeners_[profile][event_name].count(listener) != 0u) {
1197 // This is likely an abuse of the API by a malicious extension. 1194 // This is likely an abuse of the API by a malicious extension.
1198 return false; 1195 return false;
1199 } 1196 }
1200 listeners_[profile][event_name].insert(listener); 1197 listeners_[profile][event_name].insert(listener);
1201 return true; 1198 return true;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 1231
1235 listeners_[profile][event_name].erase(listener); 1232 listeners_[profile][event_name].erase(listener);
1236 1233
1237 helpers::ClearCacheOnNavigation(); 1234 helpers::ClearCacheOnNavigation();
1238 } 1235 }
1239 1236
1240 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( 1237 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners(
1241 void* profile, 1238 void* profile,
1242 const std::string& extension_id, 1239 const std::string& extension_id,
1243 int embedder_process_id, 1240 int embedder_process_id,
1244 int embedder_routing_id,
1245 int webview_instance_id) { 1241 int webview_instance_id) {
1246 // Iterate over all listeners of all WebRequest events to delete 1242 // Iterate over all listeners of all WebRequest events to delete
1247 // any listeners that belong to the provided <webview>. 1243 // any listeners that belong to the provided <webview>.
1248 ListenerMapForProfile& map_for_profile = listeners_[profile]; 1244 ListenerMapForProfile& map_for_profile = listeners_[profile];
1249 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); 1245 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin();
1250 event_iter != map_for_profile.end(); ++event_iter) { 1246 event_iter != map_for_profile.end(); ++event_iter) {
1251 std::vector<EventListener> listeners_to_delete; 1247 std::vector<EventListener> listeners_to_delete;
1252 std::set<EventListener>& listeners = event_iter->second; 1248 std::set<EventListener>& listeners = event_iter->second;
1253 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); 1249 for (std::set<EventListener>::iterator listener_iter = listeners.begin();
1254 listener_iter != listeners.end(); ++listener_iter) { 1250 listener_iter != listeners.end(); ++listener_iter) {
1255 const EventListener& listener = *listener_iter; 1251 const EventListener& listener = *listener_iter;
1256 // TODO(fsamuel): Investigate making <webview> instance IDs unique within 1252 // TODO(fsamuel): Investigate making <webview> instance IDs unique within
lazyboy 2013/08/30 17:10:11 This is what you are fixing too, so remove this TO
Fady Samuel 2013/08/30 17:20:15 Done.
1257 // a process. 1253 // a process.
1258 if (listener.embedder_process_id == embedder_process_id && 1254 if (listener.embedder_process_id == embedder_process_id &&
1259 listener.embedder_routing_id == embedder_routing_id &&
1260 listener.webview_instance_id == webview_instance_id) 1255 listener.webview_instance_id == webview_instance_id)
1261 listeners_to_delete.push_back(listener); 1256 listeners_to_delete.push_back(listener);
1262 } 1257 }
1263 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { 1258 for (size_t i = 0; i < listeners_to_delete.size(); ++i) {
1264 EventListener& listener = listeners_to_delete[i]; 1259 EventListener& listener = listeners_to_delete[i];
1265 content::BrowserThread::PostTask( 1260 content::BrowserThread::PostTask(
1266 content::BrowserThread::UI, 1261 content::BrowserThread::UI,
1267 FROM_HERE, 1262 FROM_HERE,
1268 base::Bind(&RemoveEventListenerOnUI, 1263 base::Bind(&RemoveEventListenerOnUI,
1269 profile, 1264 profile,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 for (std::set<EventListener>::iterator it = listeners.begin(); 1366 for (std::set<EventListener>::iterator it = listeners.begin();
1372 it != listeners.end(); ++it) { 1367 it != listeners.end(); ++it) {
1373 if (!it->ipc_sender.get()) { 1368 if (!it->ipc_sender.get()) {
1374 // The IPC sender has been deleted. This listener will be removed soon 1369 // The IPC sender has been deleted. This listener will be removed soon
1375 // via a call to RemoveEventListener. For now, just skip it. 1370 // via a call to RemoveEventListener. For now, just skip it.
1376 continue; 1371 continue;
1377 } 1372 }
1378 1373
1379 if (is_guest && 1374 if (is_guest &&
1380 (it->embedder_process_id != webview_info.embedder_process_id || 1375 (it->embedder_process_id != webview_info.embedder_process_id ||
1381 it->embedder_routing_id != webview_info.embedder_routing_id ||
1382 it->webview_instance_id != webview_info.instance_id)) 1376 it->webview_instance_id != webview_info.instance_id))
1383 continue; 1377 continue;
1384 1378
1385 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) 1379 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url))
1386 continue; 1380 continue;
1387 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) 1381 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id)
1388 continue; 1382 continue;
1389 if (it->filter.window_id != -1 && window_id != it->filter.window_id) 1383 if (it->filter.window_id != -1 && window_id != it->filter.window_id)
1390 continue; 1384 continue;
1391 if (!it->filter.types.empty() && 1385 if (!it->filter.types.empty() &&
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
2082 std::string sub_event_name; 2076 std::string sub_event_name;
2083 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); 2077 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name));
2084 2078
2085 int webview_instance_id = 0; 2079 int webview_instance_id = 0;
2086 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); 2080 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id));
2087 2081
2088 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak(); 2082 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak();
2089 2083
2090 int embedder_process_id = 2084 int embedder_process_id =
2091 ipc_sender.get() ? ipc_sender->render_process_id() : -1; 2085 ipc_sender.get() ? ipc_sender->render_process_id() : -1;
2092 int embedder_routing_id = routing_id();
2093 2086
2094 const Extension* extension = 2087 const Extension* extension =
2095 extension_info_map()->extensions().GetByID(extension_id()); 2088 extension_info_map()->extensions().GetByID(extension_id());
2096 std::string extension_name = extension ? extension->name() : extension_id(); 2089 std::string extension_name = extension ? extension->name() : extension_id();
2097 2090
2098 bool is_guest = webview_instance_id != 0; 2091 bool is_guest = webview_instance_id != 0;
2099 // We check automatically whether the extension has the 'webRequest' 2092 // We check automatically whether the extension has the 'webRequest'
2100 // permission. For blocking calls we require the additional permission 2093 // permission. For blocking calls we require the additional permission
2101 // 'webRequestBlocking'. 2094 // 'webRequestBlocking'.
2102 if ((!is_guest && extra_info_spec & 2095 if ((!is_guest && extra_info_spec &
(...skipping 14 matching lines...) Expand all
2117 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions( 2110 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions(
2118 extension).is_empty()) { 2111 extension).is_empty()) {
2119 error_ = keys::kHostPermissionsRequired; 2112 error_ = keys::kHostPermissionsRequired;
2120 return false; 2113 return false;
2121 } 2114 }
2122 2115
2123 bool success = 2116 bool success =
2124 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 2117 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
2125 profile_id(), extension_id(), extension_name, 2118 profile_id(), extension_id(), extension_name,
2126 event_name, sub_event_name, filter, extra_info_spec, 2119 event_name, sub_event_name, filter, extra_info_spec,
2127 embedder_process_id, embedder_routing_id, webview_instance_id, 2120 embedder_process_id, webview_instance_id, ipc_sender_weak());
2128 ipc_sender_weak());
2129 EXTENSION_FUNCTION_VALIDATE(success); 2121 EXTENSION_FUNCTION_VALIDATE(success);
2130 2122
2131 helpers::ClearCacheOnNavigation(); 2123 helpers::ClearCacheOnNavigation();
2132 2124
2133 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 2125 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
2134 &helpers::NotifyWebRequestAPIUsed, 2126 &helpers::NotifyWebRequestAPIUsed,
2135 profile_id(), make_scoped_refptr(GetExtension()))); 2127 profile_id(), make_scoped_refptr(GetExtension())));
2136 2128
2137 return true; 2129 return true;
2138 } 2130 }
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2298 } else if ((*it)->name().find("AdBlock") != std::string::npos) { 2290 } else if ((*it)->name().find("AdBlock") != std::string::npos) {
2299 adblock = true; 2291 adblock = true;
2300 } else { 2292 } else {
2301 other = true; 2293 other = true;
2302 } 2294 }
2303 } 2295 }
2304 } 2296 }
2305 2297
2306 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); 2298 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other));
2307 } 2299 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698