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) { |
| 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 |