Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/extension_webrequest_api.h" | 5 #include "chrome/browser/extensions/extension_webrequest_api.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 net::HttpRequestHeaders* request_headers; | 331 net::HttpRequestHeaders* request_headers; |
| 332 | 332 |
| 333 // The response headers that were received from the server. Only valid for | 333 // The response headers that were received from the server. Only valid for |
| 334 // OnHeadersReceived. | 334 // OnHeadersReceived. |
| 335 scoped_refptr<net::HttpResponseHeaders> original_response_headers; | 335 scoped_refptr<net::HttpResponseHeaders> original_response_headers; |
| 336 | 336 |
| 337 // Location where to override response headers. Only valid for | 337 // Location where to override response headers. Only valid for |
| 338 // OnHeadersReceived. | 338 // OnHeadersReceived. |
| 339 scoped_refptr<net::HttpResponseHeaders>* override_response_headers; | 339 scoped_refptr<net::HttpResponseHeaders>* override_response_headers; |
| 340 | 340 |
| 341 // If non-empty, this contains the auth credentials that may be filled in. | |
| 342 // Only valid for OnAuthRequired. | |
| 343 net::AuthCredentials* auth_credentials; | |
| 344 | |
| 345 // The callback to invoke for auth. If |auth_callback.is_null()| is false, | |
| 346 // |callback| must be NULL. | |
| 347 // Only valid for OnAuthRequired. | |
| 348 net::NetworkDelegate::AuthCallback auth_callback; | |
| 349 | |
| 341 // Time the request was paused. Used for logging purposes. | 350 // Time the request was paused. Used for logging purposes. |
| 342 base::Time blocking_time; | 351 base::Time blocking_time; |
| 343 | 352 |
| 344 // Changes requested by extensions. | 353 // Changes requested by extensions. |
| 345 EventResponseDeltas response_deltas; | 354 EventResponseDeltas response_deltas; |
| 346 | 355 |
| 347 BlockedRequest() | 356 BlockedRequest() |
| 348 : request(NULL), | 357 : request(NULL), |
| 349 event(kInvalidEvent), | 358 event(kInvalidEvent), |
| 350 num_handlers_blocking(0), | 359 num_handlers_blocking(0), |
| 351 net_log(NULL), | 360 net_log(NULL), |
| 352 callback(NULL), | 361 callback(NULL), |
| 353 new_url(NULL), | 362 new_url(NULL), |
| 354 request_headers(NULL), | 363 request_headers(NULL), |
| 355 override_response_headers(NULL) {} | 364 override_response_headers(NULL), |
| 365 auth_credentials(NULL) {} | |
| 356 }; | 366 }; |
| 357 | 367 |
| 358 bool ExtensionWebRequestEventRouter::RequestFilter::InitFromValue( | 368 bool ExtensionWebRequestEventRouter::RequestFilter::InitFromValue( |
| 359 const DictionaryValue& value, std::string* error) { | 369 const DictionaryValue& value, std::string* error) { |
| 360 for (DictionaryValue::key_iterator key = value.begin_keys(); | 370 for (DictionaryValue::key_iterator key = value.begin_keys(); |
| 361 key != value.end_keys(); ++key) { | 371 key != value.end_keys(); ++key) { |
| 362 if (*key == "urls") { | 372 if (*key == "urls") { |
| 363 ListValue* urls_value = NULL; | 373 ListValue* urls_value = NULL; |
| 364 if (!value.GetList("urls", &urls_value)) | 374 if (!value.GetList("urls", &urls_value)) |
| 365 return false; | 375 return false; |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 blocked_requests_[request->identifier()].net_log = &request->net_log(); | 639 blocked_requests_[request->identifier()].net_log = &request->net_log(); |
| 630 blocked_requests_[request->identifier()].override_response_headers = | 640 blocked_requests_[request->identifier()].override_response_headers = |
| 631 override_response_headers; | 641 override_response_headers; |
| 632 blocked_requests_[request->identifier()].original_response_headers = | 642 blocked_requests_[request->identifier()].original_response_headers = |
| 633 original_response_headers; | 643 original_response_headers; |
| 634 return net::ERR_IO_PENDING; | 644 return net::ERR_IO_PENDING; |
| 635 } | 645 } |
| 636 return net::OK; | 646 return net::OK; |
| 637 } | 647 } |
| 638 | 648 |
| 639 void ExtensionWebRequestEventRouter::OnAuthRequired( | 649 net::NetworkDelegate::AuthRequiredResponse |
| 650 ExtensionWebRequestEventRouter::OnAuthRequired( | |
| 640 void* profile, | 651 void* profile, |
| 641 ExtensionInfoMap* extension_info_map, | 652 ExtensionInfoMap* extension_info_map, |
| 642 net::URLRequest* request, | 653 net::URLRequest* request, |
| 643 const net::AuthChallengeInfo& auth_info) { | 654 const net::AuthChallengeInfo& auth_info, |
| 655 const net::NetworkDelegate::AuthCallback& callback, | |
| 656 net::AuthCredentials* credentials) { | |
| 657 // No profile means that this is for authentication challenges in the | |
| 658 // system context. Skip in that case. | |
| 644 if (!profile) | 659 if (!profile) |
| 645 return; | 660 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 646 | 661 |
| 647 if (!HasWebRequestScheme(request->url())) | 662 if (!HasWebRequestScheme(request->url())) |
| 648 return; | 663 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 649 | 664 |
| 650 int extra_info_spec = 0; | 665 int extra_info_spec = 0; |
| 651 std::vector<const EventListener*> listeners = | 666 std::vector<const EventListener*> listeners = |
| 652 GetMatchingListeners(profile, extension_info_map, | 667 GetMatchingListeners(profile, extension_info_map, |
| 653 keys::kOnAuthRequired, request, &extra_info_spec); | 668 keys::kOnAuthRequired, request, &extra_info_spec); |
| 654 if (listeners.empty()) | 669 if (listeners.empty()) |
| 655 return; | 670 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 656 | 671 |
| 657 ListValue args; | 672 ListValue args; |
| 658 DictionaryValue* dict = new DictionaryValue(); | 673 DictionaryValue* dict = new DictionaryValue(); |
| 659 ExtractRequestInfo(request, dict); | 674 ExtractRequestInfo(request, dict); |
| 660 dict->SetBoolean(keys::kIsProxyKey, auth_info.is_proxy); | 675 dict->SetBoolean(keys::kIsProxyKey, auth_info.is_proxy); |
| 661 if (!auth_info.scheme.empty()) | 676 if (!auth_info.scheme.empty()) |
| 662 dict->SetString(keys::kSchemeKey, auth_info.scheme); | 677 dict->SetString(keys::kSchemeKey, auth_info.scheme); |
| 663 if (!auth_info.realm.empty()) | 678 if (!auth_info.realm.empty()) |
| 664 dict->SetString(keys::kRealmKey, auth_info.realm); | 679 dict->SetString(keys::kRealmKey, auth_info.realm); |
| 665 DictionaryValue* challenger = new DictionaryValue(); | 680 DictionaryValue* challenger = new DictionaryValue(); |
| 666 challenger->SetString(keys::kHostKey, auth_info.challenger.host()); | 681 challenger->SetString(keys::kHostKey, auth_info.challenger.host()); |
| 667 challenger->SetInteger(keys::kPortKey, auth_info.challenger.port()); | 682 challenger->SetInteger(keys::kPortKey, auth_info.challenger.port()); |
| 668 dict->Set(keys::kChallengerKey, challenger); | 683 dict->Set(keys::kChallengerKey, challenger); |
| 669 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); | 684 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); |
| 670 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { | 685 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { |
| 671 dict->Set(keys::kResponseHeadersKey, | 686 dict->Set(keys::kResponseHeadersKey, |
| 672 GetResponseHeadersList(request->response_headers())); | 687 GetResponseHeadersList(request->response_headers())); |
| 673 } | 688 } |
| 674 args.Append(dict); | 689 args.Append(dict); |
| 675 | 690 |
| 676 DispatchEvent(profile, request, listeners, args); | 691 if (DispatchEvent(profile, request, listeners, args)) { |
| 692 blocked_requests_[request->identifier()].event = kOnAuthRequired; | |
| 693 blocked_requests_[request->identifier()].auth_callback = callback; | |
| 694 blocked_requests_[request->identifier()].auth_credentials = credentials; | |
| 695 blocked_requests_[request->identifier()].net_log = &request->net_log(); | |
| 696 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING; | |
| 697 } | |
| 698 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; | |
| 677 } | 699 } |
| 678 | 700 |
| 679 void ExtensionWebRequestEventRouter::OnBeforeRedirect( | 701 void ExtensionWebRequestEventRouter::OnBeforeRedirect( |
| 680 void* profile, | 702 void* profile, |
| 681 ExtensionInfoMap* extension_info_map, | 703 ExtensionInfoMap* extension_info_map, |
| 682 net::URLRequest* request, | 704 net::URLRequest* request, |
| 683 const GURL& new_location) { | 705 const GURL& new_location) { |
| 684 if (!profile) | 706 if (!profile) |
| 685 return; | 707 return; |
| 686 | 708 |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1140 old_headers->GetStatusLine() + "\n" + | 1162 old_headers->GetStatusLine() + "\n" + |
| 1141 response->response_headers_string; | 1163 response->response_headers_string; |
| 1142 | 1164 |
| 1143 result->new_response_headers = | 1165 result->new_response_headers = |
| 1144 new net::HttpResponseHeaders( | 1166 new net::HttpResponseHeaders( |
| 1145 net::HttpUtil::AssembleRawHeaders(new_headers_string.c_str(), | 1167 net::HttpUtil::AssembleRawHeaders(new_headers_string.c_str(), |
| 1146 new_headers_string.length())); | 1168 new_headers_string.length())); |
| 1147 } | 1169 } |
| 1148 } | 1170 } |
| 1149 | 1171 |
| 1172 if (blocked_request->event == kOnAuthRequired) | |
| 1173 result->auth_credentials.swap(response->auth_credentials); | |
| 1174 | |
| 1150 return result; | 1175 return result; |
| 1151 } | 1176 } |
| 1152 | 1177 |
| 1153 void ExtensionWebRequestEventRouter::MergeOnBeforeRequestResponses( | 1178 void ExtensionWebRequestEventRouter::MergeOnBeforeRequestResponses( |
| 1154 BlockedRequest* request, | 1179 BlockedRequest* request, |
| 1155 std::list<std::string>* conflicting_extensions) const { | 1180 std::list<std::string>* conflicting_extensions) const { |
| 1156 EventResponseDeltas::iterator delta; | 1181 EventResponseDeltas::iterator delta; |
| 1157 EventResponseDeltas& deltas = request->response_deltas; | 1182 EventResponseDeltas& deltas = request->response_deltas; |
| 1158 | 1183 |
| 1159 bool redirected = false; | 1184 bool redirected = false; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1184 EventResponseDeltas& deltas = request->response_deltas; | 1209 EventResponseDeltas& deltas = request->response_deltas; |
| 1185 | 1210 |
| 1186 // Here we collect which headers we have removed or set to new values | 1211 // Here we collect which headers we have removed or set to new values |
| 1187 // so far due to extensions of higher precedence. | 1212 // so far due to extensions of higher precedence. |
| 1188 std::set<std::string> removed_headers; | 1213 std::set<std::string> removed_headers; |
| 1189 std::set<std::string> set_headers; | 1214 std::set<std::string> set_headers; |
| 1190 | 1215 |
| 1191 // We assume here that the deltas are sorted in decreasing extension | 1216 // We assume here that the deltas are sorted in decreasing extension |
| 1192 // precedence (i.e. decreasing extension installation time). | 1217 // precedence (i.e. decreasing extension installation time). |
| 1193 for (delta = deltas.begin(); delta != deltas.end(); ++delta) { | 1218 for (delta = deltas.begin(); delta != deltas.end(); ++delta) { |
| 1194 | |
| 1195 if ((*delta)->modified_request_headers.IsEmpty() && | 1219 if ((*delta)->modified_request_headers.IsEmpty() && |
| 1196 (*delta)->deleted_request_headers.empty()) { | 1220 (*delta)->deleted_request_headers.empty()) { |
| 1197 continue; | 1221 continue; |
| 1198 } | 1222 } |
| 1199 | 1223 |
| 1200 scoped_refptr<NetLogModificationParameter> log( | 1224 scoped_refptr<NetLogModificationParameter> log( |
| 1201 new NetLogModificationParameter((*delta)->extension_id)); | 1225 new NetLogModificationParameter((*delta)->extension_id)); |
| 1202 | 1226 |
| 1203 // Check whether any modification affects a request header that | 1227 // Check whether any modification affects a request header that |
| 1204 // has been modified differently before. As deltas is sorted by decreasing | 1228 // has been modified differently before. As deltas is sorted by decreasing |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1307 } else { | 1331 } else { |
| 1308 conflicting_extensions->push_back((*delta)->extension_id); | 1332 conflicting_extensions->push_back((*delta)->extension_id); |
| 1309 request->net_log->AddEvent( | 1333 request->net_log->AddEvent( |
| 1310 net::NetLog::TYPE_CHROME_EXTENSION_IGNORED_DUE_TO_CONFLICT, | 1334 net::NetLog::TYPE_CHROME_EXTENSION_IGNORED_DUE_TO_CONFLICT, |
| 1311 make_scoped_refptr( | 1335 make_scoped_refptr( |
| 1312 new NetLogExtensionIdParameter((*delta)->extension_id))); | 1336 new NetLogExtensionIdParameter((*delta)->extension_id))); |
| 1313 } | 1337 } |
| 1314 } | 1338 } |
| 1315 } | 1339 } |
| 1316 | 1340 |
| 1341 bool ExtensionWebRequestEventRouter::MergeOnAuthRequiredResponses( | |
| 1342 BlockedRequest* request, | |
| 1343 std::list<std::string>* conflicting_extensions) const { | |
| 1344 CHECK(request); | |
| 1345 CHECK(request->auth_credentials); | |
| 1346 bool credentials_set = false; | |
| 1347 | |
| 1348 const EventResponseDeltas& deltas = request->response_deltas; | |
| 1349 for (EventResponseDeltas::const_iterator delta = deltas.begin(); | |
| 1350 delta != deltas.end(); | |
| 1351 ++delta) { | |
| 1352 if (!(*delta)->auth_credentials.get()) | |
| 1353 continue; | |
| 1354 if (credentials_set) { | |
| 1355 conflicting_extensions->push_back((*delta)->extension_id); | |
| 1356 request->net_log->AddEvent( | |
| 1357 net::NetLog::TYPE_CHROME_EXTENSION_IGNORED_DUE_TO_CONFLICT, | |
| 1358 make_scoped_refptr( | |
| 1359 new NetLogExtensionIdParameter((*delta)->extension_id))); | |
| 1360 } else { | |
| 1361 request->net_log->AddEvent( | |
| 1362 net::NetLog::TYPE_CHROME_EXTENSION_PROVIDE_AUTH_CREDENTIALS, | |
| 1363 make_scoped_refptr( | |
| 1364 new NetLogExtensionIdParameter((*delta)->extension_id))); | |
| 1365 *request->auth_credentials = *(*delta)->auth_credentials; | |
| 1366 credentials_set = true; | |
| 1367 } | |
| 1368 } | |
| 1369 return credentials_set; | |
| 1370 } | |
| 1371 | |
| 1317 void ExtensionWebRequestEventRouter::DecrementBlockCount( | 1372 void ExtensionWebRequestEventRouter::DecrementBlockCount( |
| 1318 void* profile, | 1373 void* profile, |
| 1319 const std::string& extension_id, | 1374 const std::string& extension_id, |
| 1320 const std::string& event_name, | 1375 const std::string& event_name, |
| 1321 uint64 request_id, | 1376 uint64 request_id, |
| 1322 EventResponse* response) { | 1377 EventResponse* response) { |
| 1323 scoped_ptr<EventResponse> response_scoped(response); | 1378 scoped_ptr<EventResponse> response_scoped(response); |
| 1324 | 1379 |
| 1325 // It's possible that this request was deleted, or cancelled by a previous | 1380 // It's possible that this request was deleted, or cancelled by a previous |
| 1326 // event handler. If so, ignore this response. | 1381 // event handler. If so, ignore this response. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1337 } | 1392 } |
| 1338 | 1393 |
| 1339 base::TimeDelta block_time = | 1394 base::TimeDelta block_time = |
| 1340 base::Time::Now() - blocked_request.blocking_time; | 1395 base::Time::Now() - blocked_request.blocking_time; |
| 1341 request_time_tracker_->IncrementExtensionBlockTime( | 1396 request_time_tracker_->IncrementExtensionBlockTime( |
| 1342 extension_id, request_id, block_time); | 1397 extension_id, request_id, block_time); |
| 1343 | 1398 |
| 1344 if (num_handlers_blocking == 0) { | 1399 if (num_handlers_blocking == 0) { |
| 1345 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); | 1400 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); |
| 1346 | 1401 |
| 1347 EventResponseDeltas::iterator i; | |
| 1348 EventResponseDeltas& deltas = blocked_request.response_deltas; | 1402 EventResponseDeltas& deltas = blocked_request.response_deltas; |
| 1349 | |
| 1350 bool canceled = false; | 1403 bool canceled = false; |
| 1351 for (i = deltas.begin(); i != deltas.end(); ++i) { | 1404 bool credentials_set = false; |
| 1405 for (EventResponseDeltas::const_iterator i = deltas.begin(); | |
| 1406 i != deltas.end(); ++i) { | |
| 1352 if ((*i)->cancel) { | 1407 if ((*i)->cancel) { |
| 1353 canceled = true; | 1408 canceled = true; |
| 1354 blocked_request.net_log->AddEvent( | 1409 blocked_request.net_log->AddEvent( |
| 1355 net::NetLog::TYPE_CHROME_EXTENSION_ABORTED_REQUEST, | 1410 net::NetLog::TYPE_CHROME_EXTENSION_ABORTED_REQUEST, |
| 1356 make_scoped_refptr( | 1411 make_scoped_refptr( |
| 1357 new NetLogExtensionIdParameter((*i)->extension_id))); | 1412 new NetLogExtensionIdParameter((*i)->extension_id))); |
| 1358 break; | 1413 break; |
| 1359 } | 1414 } |
| 1360 } | 1415 } |
| 1361 | 1416 |
| 1362 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1417 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1363 std::list<std::string> conflicting_extensions; | 1418 std::list<std::string> conflicting_extensions; |
| 1364 | 1419 |
| 1365 if (blocked_request.event == kOnBeforeRequest) { | 1420 if (blocked_request.event == kOnBeforeRequest) { |
| 1366 CHECK(blocked_request.callback); | 1421 CHECK(blocked_request.callback); |
| 1367 MergeOnBeforeRequestResponses(&blocked_request, &conflicting_extensions); | 1422 MergeOnBeforeRequestResponses(&blocked_request, |
| 1423 &conflicting_extensions); | |
| 1368 } else if (blocked_request.event == kOnBeforeSendHeaders) { | 1424 } else if (blocked_request.event == kOnBeforeSendHeaders) { |
| 1369 CHECK(blocked_request.callback); | 1425 CHECK(blocked_request.callback); |
| 1370 MergeOnBeforeSendHeadersResponses(&blocked_request, | 1426 MergeOnBeforeSendHeadersResponses(&blocked_request, |
| 1371 &conflicting_extensions); | 1427 &conflicting_extensions); |
| 1372 } else if (blocked_request.event == kOnHeadersReceived) { | 1428 } else if (blocked_request.event == kOnHeadersReceived) { |
| 1373 CHECK(blocked_request.callback); | 1429 CHECK(blocked_request.callback); |
| 1374 MergeOnHeadersReceivedResponses(&blocked_request, | 1430 MergeOnHeadersReceivedResponses(&blocked_request, |
| 1375 &conflicting_extensions); | 1431 &conflicting_extensions); |
| 1432 } else if (blocked_request.event == kOnAuthRequired) { | |
| 1433 CHECK(!blocked_request.callback); | |
| 1434 CHECK(!blocked_request.auth_callback.is_null()); | |
| 1435 credentials_set = MergeOnAuthRequiredResponses( | |
| 1436 &blocked_request, | |
| 1437 &conflicting_extensions); | |
| 1376 } else { | 1438 } else { |
| 1377 NOTREACHED(); | 1439 NOTREACHED(); |
| 1378 } | 1440 } |
| 1379 std::list<std::string>::iterator conflict_iter; | 1441 std::list<std::string>::iterator conflict_iter; |
| 1380 for (conflict_iter = conflicting_extensions.begin(); | 1442 for (conflict_iter = conflicting_extensions.begin(); |
| 1381 conflict_iter != conflicting_extensions.end(); | 1443 conflict_iter != conflicting_extensions.end(); |
| 1382 ++conflict_iter) { | 1444 ++conflict_iter) { |
| 1383 // TODO(mpcomplete): Do some fancy notification in the UI. | 1445 // TODO(mpcomplete): Do some fancy notification in the UI. |
| 1384 LOG(ERROR) << "Extension " << *conflict_iter << " was ignored in " | 1446 LOG(ERROR) << "Extension " << *conflict_iter << " was ignored in " |
| 1385 "webRequest API because of conflicting request " | 1447 "webRequest API because of conflicting request " |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1396 // This signals a failed request to subscribers of onErrorOccurred in case | 1458 // This signals a failed request to subscribers of onErrorOccurred in case |
| 1397 // a request is cancelled because net::ERR_EMPTY_RESPONSE cannot be | 1459 // a request is cancelled because net::ERR_EMPTY_RESPONSE cannot be |
| 1398 // distinguished from a regular failure. | 1460 // distinguished from a regular failure. |
| 1399 if (blocked_request.callback) { | 1461 if (blocked_request.callback) { |
| 1400 int rv = canceled ? net::ERR_EMPTY_RESPONSE : net::OK; | 1462 int rv = canceled ? net::ERR_EMPTY_RESPONSE : net::OK; |
| 1401 net::OldCompletionCallback* callback = blocked_request.callback; | 1463 net::OldCompletionCallback* callback = blocked_request.callback; |
| 1402 // Ensure that request is removed before callback because the callback | 1464 // Ensure that request is removed before callback because the callback |
| 1403 // might trigger the next event. | 1465 // might trigger the next event. |
| 1404 blocked_requests_.erase(request_id); | 1466 blocked_requests_.erase(request_id); |
| 1405 callback->Run(rv); | 1467 callback->Run(rv); |
| 1468 } else if (!blocked_request.auth_callback.is_null()) { | |
| 1469 net::NetworkDelegate::AuthRequiredResponse response = | |
| 1470 net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; | |
| 1471 if (canceled) { | |
|
battre
2011/10/10 13:47:03
This is a change the semantics of "cancel". The me
cbentzel
2011/10/10 13:59:54
This is actually the case as well here - it just d
battre
2011/10/10 14:32:13
SGTM
| |
| 1472 response = net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH; | |
| 1473 } else if (credentials_set) { | |
| 1474 response = net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH; | |
| 1475 } | |
| 1476 net::NetworkDelegate::AuthCallback callback = | |
| 1477 blocked_request.auth_callback; | |
| 1478 blocked_requests_.erase(request_id); | |
| 1479 callback.Run(response); | |
| 1406 } else { | 1480 } else { |
| 1407 blocked_requests_.erase(request_id); | 1481 blocked_requests_.erase(request_id); |
| 1408 } | 1482 } |
| 1409 } else { | 1483 } else { |
| 1410 // Update the URLRequest to indicate it is now blocked on a different | 1484 // Update the URLRequest to indicate it is now blocked on a different |
| 1411 // extension. | 1485 // extension. |
| 1412 std::set<EventListener>& listeners = listeners_[profile][event_name]; | 1486 std::set<EventListener>& listeners = listeners_[profile][event_name]; |
| 1413 | 1487 |
| 1414 for (std::set<EventListener>::iterator it = listeners.begin(); | 1488 for (std::set<EventListener>::iterator it = listeners.begin(); |
| 1415 it != listeners.end(); ++it) { | 1489 it != listeners.end(); ++it) { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1568 EXTENSION_FUNCTION_VALIDATE( | 1642 EXTENSION_FUNCTION_VALIDATE( |
| 1569 header_value->GetString(keys::kHeaderNameKey, &name)); | 1643 header_value->GetString(keys::kHeaderNameKey, &name)); |
| 1570 EXTENSION_FUNCTION_VALIDATE( | 1644 EXTENSION_FUNCTION_VALIDATE( |
| 1571 header_value->GetString(keys::kHeaderValueKey, &value)); | 1645 header_value->GetString(keys::kHeaderValueKey, &value)); |
| 1572 | 1646 |
| 1573 response_headers_string += name + ": " + value + '\n'; | 1647 response_headers_string += name + ": " + value + '\n'; |
| 1574 } | 1648 } |
| 1575 response_headers_string += '\n'; | 1649 response_headers_string += '\n'; |
| 1576 response->response_headers_string.swap(response_headers_string); | 1650 response->response_headers_string.swap(response_headers_string); |
| 1577 } | 1651 } |
| 1652 | |
| 1653 if (value->HasKey(keys::kAuthCredentialsKey)) { | |
| 1654 DictionaryValue* credentials_value = NULL; | |
| 1655 EXTENSION_FUNCTION_VALIDATE(value->GetDictionary( | |
| 1656 keys::kAuthCredentialsKey, | |
| 1657 &credentials_value)); | |
| 1658 response->auth_credentials.reset(new net::AuthCredentials()); | |
| 1659 EXTENSION_FUNCTION_VALIDATE( | |
| 1660 credentials_value->GetString(keys::kUsernameKey, | |
| 1661 &response->auth_credentials->username)); | |
| 1662 EXTENSION_FUNCTION_VALIDATE( | |
| 1663 credentials_value->GetString(keys::kPasswordKey, | |
| 1664 &response->auth_credentials->password)); | |
| 1665 } | |
| 1578 } | 1666 } |
| 1579 | 1667 |
| 1580 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 1668 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 1581 profile_id(), extension_id(), event_name, sub_event_name, request_id, | 1669 profile_id(), extension_id(), event_name, sub_event_name, request_id, |
| 1582 response.release()); | 1670 response.release()); |
| 1583 | 1671 |
| 1584 return true; | 1672 return true; |
| 1585 } | 1673 } |
| 1586 | 1674 |
| 1587 bool WebRequestHandlerBehaviorChanged::RunImpl() { | 1675 bool WebRequestHandlerBehaviorChanged::RunImpl() { |
| 1588 WebCacheManager::GetInstance()->ClearCacheOnNavigation(); | 1676 WebCacheManager::GetInstance()->ClearCacheOnNavigation(); |
| 1589 return true; | 1677 return true; |
| 1590 } | 1678 } |
| OLD | NEW |