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

Side by Side Diff: chrome/browser/extensions/extension_webrequest_api.cc

Issue 8015004: webRequest.onAuthRequired listeners can provide authentication credentials. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_webrequest_api.h ('k') | chrome/browser/extensions/extension_webrequest_api_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698