Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "extensions/browser/api/web_request/web_request_api.h" | 5 #include "extensions/browser/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 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does | 451 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does |
| 452 // not play well with event pages. See downloads.onDeterminingFilename and | 452 // not play well with event pages. See downloads.onDeterminingFilename and |
| 453 // ExtensionDownloadsEventRouter for an alternative approach. | 453 // ExtensionDownloadsEventRouter for an alternative approach. |
| 454 struct ExtensionWebRequestEventRouter::EventListener { | 454 struct ExtensionWebRequestEventRouter::EventListener { |
| 455 std::string extension_id; | 455 std::string extension_id; |
| 456 std::string extension_name; | 456 std::string extension_name; |
| 457 std::string sub_event_name; | 457 std::string sub_event_name; |
| 458 RequestFilter filter; | 458 RequestFilter filter; |
| 459 int extra_info_spec; | 459 int extra_info_spec; |
| 460 int embedder_process_id; | 460 int embedder_process_id; |
| 461 int webview_instance_id; | 461 int web_view_instance_id; |
|
Devlin
2015/01/21 22:31:45
why the change? It looks like webview is more pop
Fady Samuel
2015/01/21 23:05:41
This matches the naming in extensions/browser/gues
| |
| 462 base::WeakPtr<IPC::Sender> ipc_sender; | 462 base::WeakPtr<IPC::Sender> ipc_sender; |
| 463 mutable std::set<uint64> blocked_requests; | 463 mutable std::set<uint64> blocked_requests; |
| 464 | 464 |
| 465 // Comparator to work with std::set. | 465 // Comparator to work with std::set. |
| 466 bool operator<(const EventListener& that) const { | 466 bool operator<(const EventListener& that) const { |
| 467 if (extension_id < that.extension_id) | 467 if (extension_id < that.extension_id) |
|
Devlin
2015/01/21 22:31:45
instead, do:
if (extension_id != that.extension_id
Fady Samuel
2015/01/21 23:05:41
Done.
| |
| 468 return true; | 468 return true; |
| 469 | |
| 469 if (extension_id == that.extension_id && | 470 if (extension_id == that.extension_id && |
| 470 sub_event_name < that.sub_event_name) | 471 sub_event_name < that.sub_event_name) { |
| 471 return true; | 472 return true; |
| 473 } | |
| 474 | |
| 475 if (extension_id == that.extension_id && | |
| 476 sub_event_name == that.sub_event_name && | |
| 477 embedder_process_id < that.embedder_process_id) { | |
| 478 return true; | |
| 479 } | |
| 480 | |
| 481 if (extension_id == that.extension_id && | |
| 482 sub_event_name == that.sub_event_name && | |
| 483 embedder_process_id == that.embedder_process_id && | |
| 484 web_view_instance_id < that.web_view_instance_id) { | |
| 485 return true; | |
| 486 } | |
| 487 | |
| 472 return false; | 488 return false; |
| 473 } | 489 } |
| 474 | 490 |
| 475 EventListener() : extra_info_spec(0) {} | 491 EventListener() : extra_info_spec(0) {} |
| 476 }; | 492 }; |
| 477 | 493 |
| 478 // Contains info about requests that are blocked waiting for a response from | 494 // Contains info about requests that are blocked waiting for a response from |
| 479 // an extension. | 495 // an extension. |
| 480 struct ExtensionWebRequestEventRouter::BlockedRequest { | 496 struct ExtensionWebRequestEventRouter::BlockedRequest { |
| 481 // The request that is being blocked. | 497 // The request that is being blocked. |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1272 | 1288 |
| 1273 bool ExtensionWebRequestEventRouter::AddEventListener( | 1289 bool ExtensionWebRequestEventRouter::AddEventListener( |
| 1274 void* browser_context, | 1290 void* browser_context, |
| 1275 const std::string& extension_id, | 1291 const std::string& extension_id, |
| 1276 const std::string& extension_name, | 1292 const std::string& extension_name, |
| 1277 const std::string& event_name, | 1293 const std::string& event_name, |
| 1278 const std::string& sub_event_name, | 1294 const std::string& sub_event_name, |
| 1279 const RequestFilter& filter, | 1295 const RequestFilter& filter, |
| 1280 int extra_info_spec, | 1296 int extra_info_spec, |
| 1281 int embedder_process_id, | 1297 int embedder_process_id, |
| 1282 int webview_instance_id, | 1298 int web_view_instance_id, |
| 1283 base::WeakPtr<IPC::Sender> ipc_sender) { | 1299 base::WeakPtr<IPC::Sender> ipc_sender) { |
| 1284 if (!IsWebRequestEvent(event_name)) | 1300 if (!IsWebRequestEvent(event_name)) |
| 1285 return false; | 1301 return false; |
| 1286 | 1302 |
| 1287 EventListener listener; | 1303 EventListener listener; |
| 1288 listener.extension_id = extension_id; | 1304 listener.extension_id = extension_id; |
| 1289 listener.extension_name = extension_name; | 1305 listener.extension_name = extension_name; |
| 1290 listener.sub_event_name = sub_event_name; | 1306 listener.sub_event_name = sub_event_name; |
| 1291 listener.filter = filter; | 1307 listener.filter = filter; |
| 1292 listener.extra_info_spec = extra_info_spec; | 1308 listener.extra_info_spec = extra_info_spec; |
| 1293 listener.ipc_sender = ipc_sender; | 1309 listener.ipc_sender = ipc_sender; |
| 1294 listener.embedder_process_id = embedder_process_id; | 1310 listener.embedder_process_id = embedder_process_id; |
| 1295 listener.webview_instance_id = webview_instance_id; | 1311 listener.web_view_instance_id = web_view_instance_id; |
| 1296 if (listener.webview_instance_id) { | 1312 if (listener.web_view_instance_id) { |
| 1297 content::RecordAction( | 1313 content::RecordAction( |
| 1298 base::UserMetricsAction("WebView.WebRequest.AddListener")); | 1314 base::UserMetricsAction("WebView.WebRequest.AddListener")); |
| 1299 } | 1315 } |
| 1300 | 1316 |
| 1301 if (listeners_[browser_context][event_name].count(listener) != 0u) { | 1317 if (listeners_[browser_context][event_name].count(listener) != 0u) { |
| 1302 // This is likely an abuse of the API by a malicious extension. | 1318 // This is likely an abuse of the API by a malicious extension. |
| 1303 return false; | 1319 return false; |
| 1304 } | 1320 } |
| 1305 listeners_[browser_context][event_name].insert(listener); | 1321 listeners_[browser_context][event_name].insert(listener); |
| 1306 return true; | 1322 return true; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1337 | 1353 |
| 1338 listeners_[browser_context][event_name].erase(listener); | 1354 listeners_[browser_context][event_name].erase(listener); |
| 1339 | 1355 |
| 1340 helpers::ClearCacheOnNavigation(); | 1356 helpers::ClearCacheOnNavigation(); |
| 1341 } | 1357 } |
| 1342 | 1358 |
| 1343 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( | 1359 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( |
| 1344 void* browser_context, | 1360 void* browser_context, |
| 1345 const std::string& extension_id, | 1361 const std::string& extension_id, |
| 1346 int embedder_process_id, | 1362 int embedder_process_id, |
| 1347 int webview_instance_id) { | 1363 int web_view_instance_id) { |
| 1348 // Iterate over all listeners of all WebRequest events to delete | 1364 // Iterate over all listeners of all WebRequest events to delete |
| 1349 // any listeners that belong to the provided <webview>. | 1365 // any listeners that belong to the provided <webview>. |
| 1350 ListenerMapForBrowserContext& map_for_browser_context = | 1366 ListenerMapForBrowserContext& map_for_browser_context = |
| 1351 listeners_[browser_context]; | 1367 listeners_[browser_context]; |
| 1352 for (ListenerMapForBrowserContext::iterator event_iter = | 1368 for (ListenerMapForBrowserContext::iterator event_iter = |
| 1353 map_for_browser_context.begin(); | 1369 map_for_browser_context.begin(); |
| 1354 event_iter != map_for_browser_context.end(); ++event_iter) { | 1370 event_iter != map_for_browser_context.end(); ++event_iter) { |
| 1355 std::vector<EventListener> listeners_to_delete; | 1371 std::vector<EventListener> listeners_to_delete; |
| 1356 std::set<EventListener>& listeners = event_iter->second; | 1372 std::set<EventListener>& listeners = event_iter->second; |
| 1357 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); | 1373 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); |
| 1358 listener_iter != listeners.end(); ++listener_iter) { | 1374 listener_iter != listeners.end(); ++listener_iter) { |
| 1359 const EventListener& listener = *listener_iter; | 1375 const EventListener& listener = *listener_iter; |
| 1360 if (listener.embedder_process_id == embedder_process_id && | 1376 if (listener.embedder_process_id == embedder_process_id && |
| 1361 listener.webview_instance_id == webview_instance_id) | 1377 listener.web_view_instance_id == web_view_instance_id) |
| 1362 listeners_to_delete.push_back(listener); | 1378 listeners_to_delete.push_back(listener); |
| 1363 } | 1379 } |
| 1364 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { | 1380 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { |
| 1365 EventListener& listener = listeners_to_delete[i]; | 1381 EventListener& listener = listeners_to_delete[i]; |
| 1366 content::BrowserThread::PostTask( | 1382 content::BrowserThread::PostTask( |
| 1367 content::BrowserThread::UI, | 1383 content::BrowserThread::UI, |
| 1368 FROM_HERE, | 1384 FROM_HERE, |
| 1369 base::Bind(&RemoveEventListenerOnUI, | 1385 base::Bind(&RemoveEventListenerOnUI, |
| 1370 browser_context, | 1386 browser_context, |
| 1371 listener.sub_event_name, | 1387 listener.sub_event_name, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1475 for (std::set<EventListener>::iterator it = listeners.begin(); | 1491 for (std::set<EventListener>::iterator it = listeners.begin(); |
| 1476 it != listeners.end(); ++it) { | 1492 it != listeners.end(); ++it) { |
| 1477 if (!it->ipc_sender.get()) { | 1493 if (!it->ipc_sender.get()) { |
| 1478 // The IPC sender has been deleted. This listener will be removed soon | 1494 // The IPC sender has been deleted. This listener will be removed soon |
| 1479 // via a call to RemoveEventListener. For now, just skip it. | 1495 // via a call to RemoveEventListener. For now, just skip it. |
| 1480 continue; | 1496 continue; |
| 1481 } | 1497 } |
| 1482 | 1498 |
| 1483 if (is_web_view_guest && | 1499 if (is_web_view_guest && |
| 1484 (it->embedder_process_id != web_view_info.embedder_process_id || | 1500 (it->embedder_process_id != web_view_info.embedder_process_id || |
| 1485 it->webview_instance_id != web_view_info.instance_id)) | 1501 it->web_view_instance_id != web_view_info.instance_id)) |
| 1486 continue; | 1502 continue; |
| 1487 | 1503 |
| 1488 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) | 1504 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) |
| 1489 continue; | 1505 continue; |
| 1490 if (web_request_event_router_delegate_ && | 1506 if (web_request_event_router_delegate_ && |
| 1491 web_request_event_router_delegate_->OnGetMatchingListenersImplCheck( | 1507 web_request_event_router_delegate_->OnGetMatchingListenersImplCheck( |
| 1492 it->filter.tab_id, it->filter.window_id, request)) | 1508 it->filter.tab_id, it->filter.window_id, request)) |
| 1493 continue; | 1509 continue; |
| 1494 if (!it->filter.types.empty() && | 1510 if (!it->filter.types.empty() && |
| 1495 std::find(it->filter.types.begin(), it->filter.types.end(), | 1511 std::find(it->filter.types.begin(), it->filter.types.end(), |
| (...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2198 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( | 2214 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( |
| 2199 *value, &extra_info_spec)); | 2215 *value, &extra_info_spec)); |
| 2200 } | 2216 } |
| 2201 | 2217 |
| 2202 std::string event_name; | 2218 std::string event_name; |
| 2203 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); | 2219 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); |
| 2204 | 2220 |
| 2205 std::string sub_event_name; | 2221 std::string sub_event_name; |
| 2206 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); | 2222 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); |
| 2207 | 2223 |
| 2208 int webview_instance_id = 0; | 2224 int web_view_instance_id = 0; |
| 2209 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); | 2225 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &web_view_instance_id)); |
| 2210 | 2226 |
| 2211 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = | 2227 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = |
| 2212 ipc_sender_weak(); | 2228 ipc_sender_weak(); |
| 2213 int embedder_process_id = | 2229 int embedder_process_id = |
| 2214 ipc_sender.get() ? ipc_sender->render_process_id() : -1; | 2230 ipc_sender.get() ? ipc_sender->render_process_id() : -1; |
| 2215 | 2231 |
| 2216 const Extension* extension = | 2232 const Extension* extension = |
| 2217 extension_info_map()->extensions().GetByID(extension_id_safe()); | 2233 extension_info_map()->extensions().GetByID(extension_id_safe()); |
| 2218 std::string extension_name = | 2234 std::string extension_name = |
| 2219 extension ? extension->name() : extension_id_safe(); | 2235 extension ? extension->name() : extension_id_safe(); |
| 2220 | 2236 |
| 2221 if (webview_instance_id == 0) { | 2237 if (web_view_instance_id == 0) { |
| 2222 // We check automatically whether the extension has the 'webRequest' | 2238 // We check automatically whether the extension has the 'webRequest' |
| 2223 // permission. For blocking calls we require the additional permission | 2239 // permission. For blocking calls we require the additional permission |
| 2224 // 'webRequestBlocking'. | 2240 // 'webRequestBlocking'. |
| 2225 if ((extra_info_spec & | 2241 if ((extra_info_spec & |
| 2226 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | | 2242 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | |
| 2227 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && | 2243 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && |
| 2228 !extension->permissions_data()->HasAPIPermission( | 2244 !extension->permissions_data()->HasAPIPermission( |
| 2229 extensions::APIPermission::kWebRequestBlocking)) { | 2245 extensions::APIPermission::kWebRequestBlocking)) { |
| 2230 error_ = keys::kBlockingPermissionRequired; | 2246 error_ = keys::kBlockingPermissionRequired; |
| 2231 return false; | 2247 return false; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2242 .is_empty()) { | 2258 .is_empty()) { |
| 2243 error_ = keys::kHostPermissionsRequired; | 2259 error_ = keys::kHostPermissionsRequired; |
| 2244 return false; | 2260 return false; |
| 2245 } | 2261 } |
| 2246 } | 2262 } |
| 2247 | 2263 |
| 2248 bool success = | 2264 bool success = |
| 2249 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2265 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 2250 profile_id(), extension_id_safe(), extension_name, | 2266 profile_id(), extension_id_safe(), extension_name, |
| 2251 event_name, sub_event_name, filter, extra_info_spec, | 2267 event_name, sub_event_name, filter, extra_info_spec, |
| 2252 embedder_process_id, webview_instance_id, ipc_sender_weak()); | 2268 embedder_process_id, web_view_instance_id, ipc_sender_weak()); |
| 2253 EXTENSION_FUNCTION_VALIDATE(success); | 2269 EXTENSION_FUNCTION_VALIDATE(success); |
| 2254 | 2270 |
| 2255 helpers::ClearCacheOnNavigation(); | 2271 helpers::ClearCacheOnNavigation(); |
| 2256 | 2272 |
| 2257 if (!extension_id_safe().empty()) { | 2273 if (!extension_id_safe().empty()) { |
| 2258 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 2274 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 2259 base::Bind(&helpers::NotifyWebRequestAPIUsed, | 2275 base::Bind(&helpers::NotifyWebRequestAPIUsed, |
| 2260 profile_id(), extension_id_safe())); | 2276 profile_id(), extension_id_safe())); |
| 2261 } | 2277 } |
| 2262 | 2278 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2455 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); | 2471 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); |
| 2456 | 2472 |
| 2457 // Continue gracefully. | 2473 // Continue gracefully. |
| 2458 RunSync(); | 2474 RunSync(); |
| 2459 } | 2475 } |
| 2460 | 2476 |
| 2461 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2477 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
| 2462 helpers::ClearCacheOnNavigation(); | 2478 helpers::ClearCacheOnNavigation(); |
| 2463 return true; | 2479 return true; |
| 2464 } | 2480 } |
| OLD | NEW |