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 2195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2206 | 2206 |
2207 int webview_instance_id = 0; | 2207 int webview_instance_id = 0; |
2208 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); | 2208 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); |
2209 | 2209 |
2210 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = | 2210 base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender = |
2211 ipc_sender_weak(); | 2211 ipc_sender_weak(); |
2212 int embedder_process_id = | 2212 int embedder_process_id = |
2213 ipc_sender.get() ? ipc_sender->render_process_id() : -1; | 2213 ipc_sender.get() ? ipc_sender->render_process_id() : -1; |
2214 | 2214 |
2215 const Extension* extension = | 2215 const Extension* extension = |
2216 extension_info_map()->extensions().GetByID(extension_id()); | 2216 extension_info_map()->extensions().GetByID(extension_id_safe()); |
2217 std::string extension_name = extension ? extension->name() : extension_id(); | 2217 std::string extension_name = |
| 2218 extension ? extension->name() : extension_id_safe(); |
2218 | 2219 |
2219 bool is_web_view_guest = webview_instance_id != 0; | 2220 bool is_web_view_guest = webview_instance_id != 0; |
2220 // We check automatically whether the extension has the 'webRequest' | 2221 // We check automatically whether the extension has the 'webRequest' |
2221 // permission. For blocking calls we require the additional permission | 2222 // permission. For blocking calls we require the additional permission |
2222 // 'webRequestBlocking'. | 2223 // 'webRequestBlocking'. |
2223 if ((!is_web_view_guest && | 2224 if ((!is_web_view_guest && |
2224 extra_info_spec & | 2225 extra_info_spec & |
2225 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | | 2226 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | |
2226 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && | 2227 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && |
2227 !extension->permissions_data()->HasAPIPermission( | 2228 !extension->permissions_data()->HasAPIPermission( |
2228 extensions::APIPermission::kWebRequestBlocking)) { | 2229 extensions::APIPermission::kWebRequestBlocking)) { |
2229 error_ = keys::kBlockingPermissionRequired; | 2230 error_ = keys::kBlockingPermissionRequired; |
2230 return false; | 2231 return false; |
2231 } | 2232 } |
2232 | 2233 |
2233 // We allow to subscribe to patterns that are broader than the host | 2234 // We allow to subscribe to patterns that are broader than the host |
2234 // permissions. E.g., we could subscribe to http://www.example.com/* | 2235 // permissions. E.g., we could subscribe to http://www.example.com/* |
2235 // while having host permissions for http://www.example.com/foo/* and | 2236 // while having host permissions for http://www.example.com/foo/* and |
2236 // http://www.example.com/bar/*. | 2237 // http://www.example.com/bar/*. |
2237 // For this reason we do only a coarse check here to warn the extension | 2238 // For this reason we do only a coarse check here to warn the extension |
2238 // developer if he does something obviously wrong. | 2239 // developer if he does something obviously wrong. |
2239 if (!is_web_view_guest && | 2240 if (!is_web_view_guest && |
2240 extension->permissions_data()->GetEffectiveHostPermissions().is_empty()) { | 2241 extension->permissions_data()->GetEffectiveHostPermissions().is_empty()) { |
2241 error_ = keys::kHostPermissionsRequired; | 2242 error_ = keys::kHostPermissionsRequired; |
2242 return false; | 2243 return false; |
2243 } | 2244 } |
2244 | 2245 |
2245 bool success = | 2246 bool success = |
2246 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2247 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
2247 profile_id(), extension_id(), extension_name, | 2248 profile_id(), extension_id_safe(), extension_name, |
2248 event_name, sub_event_name, filter, extra_info_spec, | 2249 event_name, sub_event_name, filter, extra_info_spec, |
2249 embedder_process_id, webview_instance_id, ipc_sender_weak()); | 2250 embedder_process_id, webview_instance_id, ipc_sender_weak()); |
2250 EXTENSION_FUNCTION_VALIDATE(success); | 2251 EXTENSION_FUNCTION_VALIDATE(success); |
2251 | 2252 |
2252 helpers::ClearCacheOnNavigation(); | 2253 helpers::ClearCacheOnNavigation(); |
2253 | 2254 |
2254 BrowserThread::PostTask(BrowserThread::UI, | 2255 BrowserThread::PostTask(BrowserThread::UI, |
2255 FROM_HERE, | 2256 FROM_HERE, |
2256 base::Bind(&helpers::NotifyWebRequestAPIUsed, | 2257 base::Bind(&helpers::NotifyWebRequestAPIUsed, |
2257 profile_id(), | 2258 profile_id(), |
2258 make_scoped_refptr(extension))); | 2259 make_scoped_refptr(extension))); |
2259 | 2260 |
2260 return true; | 2261 return true; |
2261 } | 2262 } |
2262 | 2263 |
2263 void WebRequestInternalEventHandledFunction::RespondWithError( | 2264 void WebRequestInternalEventHandledFunction::RespondWithError( |
2264 const std::string& event_name, | 2265 const std::string& event_name, |
2265 const std::string& sub_event_name, | 2266 const std::string& sub_event_name, |
2266 uint64 request_id, | 2267 uint64 request_id, |
2267 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response, | 2268 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response, |
2268 const std::string& error) { | 2269 const std::string& error) { |
2269 error_ = error; | 2270 error_ = error; |
2270 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 2271 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
2271 profile_id(), | 2272 profile_id(), |
2272 extension_id(), | 2273 extension_id_safe(), |
2273 event_name, | 2274 event_name, |
2274 sub_event_name, | 2275 sub_event_name, |
2275 request_id, | 2276 request_id, |
2276 response.release()); | 2277 response.release()); |
2277 } | 2278 } |
2278 | 2279 |
2279 bool WebRequestInternalEventHandledFunction::RunSync() { | 2280 bool WebRequestInternalEventHandledFunction::RunSync() { |
2280 std::string event_name; | 2281 std::string event_name; |
2281 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 2282 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
2282 | 2283 |
2283 std::string sub_event_name; | 2284 std::string sub_event_name; |
2284 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &sub_event_name)); | 2285 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &sub_event_name)); |
2285 | 2286 |
2286 std::string request_id_str; | 2287 std::string request_id_str; |
2287 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &request_id_str)); | 2288 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &request_id_str)); |
2288 uint64 request_id; | 2289 uint64 request_id; |
2289 EXTENSION_FUNCTION_VALIDATE(base::StringToUint64(request_id_str, | 2290 EXTENSION_FUNCTION_VALIDATE(base::StringToUint64(request_id_str, |
2290 &request_id)); | 2291 &request_id)); |
2291 | 2292 |
2292 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response; | 2293 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response; |
2293 if (HasOptionalArgument(3)) { | 2294 if (HasOptionalArgument(3)) { |
2294 base::DictionaryValue* value = NULL; | 2295 base::DictionaryValue* value = NULL; |
2295 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(3, &value)); | 2296 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(3, &value)); |
2296 | 2297 |
2297 if (!value->empty()) { | 2298 if (!value->empty()) { |
2298 base::Time install_time = | 2299 base::Time install_time = |
2299 extension_info_map()->GetInstallTime(extension_id()); | 2300 extension_info_map()->GetInstallTime(extension_id_safe()); |
2300 response.reset(new ExtensionWebRequestEventRouter::EventResponse( | 2301 response.reset(new ExtensionWebRequestEventRouter::EventResponse( |
2301 extension_id(), install_time)); | 2302 extension_id_safe(), install_time)); |
2302 } | 2303 } |
2303 | 2304 |
2304 if (value->HasKey("cancel")) { | 2305 if (value->HasKey("cancel")) { |
2305 // Don't allow cancel mixed with other keys. | 2306 // Don't allow cancel mixed with other keys. |
2306 if (value->size() != 1) { | 2307 if (value->size() != 1) { |
2307 RespondWithError(event_name, | 2308 RespondWithError(event_name, |
2308 sub_event_name, | 2309 sub_event_name, |
2309 request_id, | 2310 request_id, |
2310 response.Pass(), | 2311 response.Pass(), |
2311 keys::kInvalidBlockingResponse); | 2312 keys::kInvalidBlockingResponse); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2414 EXTENSION_FUNCTION_VALIDATE( | 2415 EXTENSION_FUNCTION_VALIDATE( |
2415 credentials_value->GetString(keys::kUsernameKey, &username)); | 2416 credentials_value->GetString(keys::kUsernameKey, &username)); |
2416 EXTENSION_FUNCTION_VALIDATE( | 2417 EXTENSION_FUNCTION_VALIDATE( |
2417 credentials_value->GetString(keys::kPasswordKey, &password)); | 2418 credentials_value->GetString(keys::kPasswordKey, &password)); |
2418 response->auth_credentials.reset( | 2419 response->auth_credentials.reset( |
2419 new net::AuthCredentials(username, password)); | 2420 new net::AuthCredentials(username, password)); |
2420 } | 2421 } |
2421 } | 2422 } |
2422 | 2423 |
2423 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 2424 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
2424 profile_id(), extension_id(), event_name, sub_event_name, request_id, | 2425 profile_id(), extension_id_safe(), event_name, sub_event_name, request_id, |
2425 response.release()); | 2426 response.release()); |
2426 | 2427 |
2427 return true; | 2428 return true; |
2428 } | 2429 } |
2429 | 2430 |
2430 void WebRequestHandlerBehaviorChangedFunction::GetQuotaLimitHeuristics( | 2431 void WebRequestHandlerBehaviorChangedFunction::GetQuotaLimitHeuristics( |
2431 extensions::QuotaLimitHeuristics* heuristics) const { | 2432 extensions::QuotaLimitHeuristics* heuristics) const { |
2432 extensions::QuotaLimitHeuristic::Config config = { | 2433 extensions::QuotaLimitHeuristic::Config config = { |
2433 // See web_request.json for current value. | 2434 // See web_request.json for current value. |
2434 web_request::MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES, | 2435 web_request::MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES, |
2435 base::TimeDelta::FromMinutes(10)}; | 2436 base::TimeDelta::FromMinutes(10)}; |
2436 extensions::QuotaLimitHeuristic::BucketMapper* bucket_mapper = | 2437 extensions::QuotaLimitHeuristic::BucketMapper* bucket_mapper = |
2437 new extensions::QuotaLimitHeuristic::SingletonBucketMapper(); | 2438 new extensions::QuotaLimitHeuristic::SingletonBucketMapper(); |
2438 ClearCacheQuotaHeuristic* heuristic = | 2439 ClearCacheQuotaHeuristic* heuristic = |
2439 new ClearCacheQuotaHeuristic(config, bucket_mapper); | 2440 new ClearCacheQuotaHeuristic(config, bucket_mapper); |
2440 heuristics->push_back(heuristic); | 2441 heuristics->push_back(heuristic); |
2441 } | 2442 } |
2442 | 2443 |
2443 void WebRequestHandlerBehaviorChangedFunction::OnQuotaExceeded( | 2444 void WebRequestHandlerBehaviorChangedFunction::OnQuotaExceeded( |
2444 const std::string& violation_error) { | 2445 const std::string& violation_error) { |
2445 // Post warning message. | 2446 // Post warning message. |
2446 WarningSet warnings; | 2447 WarningSet warnings; |
2447 warnings.insert( | 2448 warnings.insert( |
2448 Warning::CreateRepeatedCacheFlushesWarning(extension_id())); | 2449 Warning::CreateRepeatedCacheFlushesWarning(extension_id_safe())); |
2449 BrowserThread::PostTask( | 2450 BrowserThread::PostTask( |
2450 BrowserThread::UI, | 2451 BrowserThread::UI, |
2451 FROM_HERE, | 2452 FROM_HERE, |
2452 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); | 2453 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); |
2453 | 2454 |
2454 // Continue gracefully. | 2455 // Continue gracefully. |
2455 RunSync(); | 2456 RunSync(); |
2456 } | 2457 } |
2457 | 2458 |
2458 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2459 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
2459 helpers::ClearCacheOnNavigation(); | 2460 helpers::ClearCacheOnNavigation(); |
2460 return true; | 2461 return true; |
2461 } | 2462 } |
OLD | NEW |