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

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc

Issue 10694055: Add read-only access to POST data for webRequest's onBeforeRequest (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Windows, what's your problem with scoped_ptr? Created 8 years, 4 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
OLDNEW
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 <queue> 5 #include <queue>
6 #include <map> 6 #include <map>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/json/json_reader.h"
11 #include "base/json/json_string_value_serializer.h" 12 #include "base/json/json_string_value_serializer.h"
12 #include "base/memory/weak_ptr.h" 13 #include "base/memory/weak_ptr.h"
13 #include "base/message_loop.h" 14 #include "base/message_loop.h"
14 #include "base/path_service.h" 15 #include "base/path_service.h"
15 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/string_piece.h"
16 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
17 #include "chrome/browser/content_settings/cookie_settings.h" 19 #include "chrome/browser/content_settings/cookie_settings.h"
18 #include "chrome/browser/extensions/api/web_request/web_request_api.h" 20 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
19 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" 21 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h"
20 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 22 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
21 #include "chrome/browser/extensions/event_router_forwarder.h" 23 #include "chrome/browser/extensions/event_router_forwarder.h"
22 #include "chrome/browser/net/chrome_network_delegate.h" 24 #include "chrome/browser/net/chrome_network_delegate.h"
23 #include "chrome/browser/prefs/pref_member.h" 25 #include "chrome/browser/prefs/pref_member.h"
24 #include "chrome/common/extensions/extension_messages.h" 26 #include "chrome/common/extensions/extension_messages.h"
25 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
26 #include "chrome/test/base/testing_browser_process.h" 28 #include "chrome/test/base/testing_browser_process.h"
27 #include "chrome/test/base/testing_pref_service.h" 29 #include "chrome/test/base/testing_pref_service.h"
28 #include "chrome/test/base/testing_profile.h" 30 #include "chrome/test/base/testing_profile.h"
29 #include "content/public/test/test_browser_thread.h" 31 #include "content/public/test/test_browser_thread.h"
30 #include "net/base/auth.h" 32 #include "net/base/auth.h"
31 #include "net/base/capturing_net_log.h" 33 #include "net/base/capturing_net_log.h"
32 #include "net/base/mock_host_resolver.h" 34 #include "net/base/mock_host_resolver.h"
33 #include "net/base/net_util.h" 35 #include "net/base/net_util.h"
34 #include "net/url_request/url_request_test_util.h" 36 #include "net/url_request/url_request_test_util.h"
35 #include "testing/gtest/include/gtest/gtest.h" 37 #include "testing/gtest/include/gtest/gtest.h"
36 38
37 namespace helpers = extension_web_request_api_helpers; 39 namespace helpers = extension_web_request_api_helpers;
38 namespace keys = extension_web_request_api_constants; 40 namespace keys = extension_web_request_api_constants;
39 41
42 using chrome::VersionInfo;
40 using helpers::CalculateOnAuthRequiredDelta; 43 using helpers::CalculateOnAuthRequiredDelta;
41 using helpers::CalculateOnBeforeRequestDelta; 44 using helpers::CalculateOnBeforeRequestDelta;
42 using helpers::CalculateOnBeforeSendHeadersDelta; 45 using helpers::CalculateOnBeforeSendHeadersDelta;
43 using helpers::CalculateOnHeadersReceivedDelta; 46 using helpers::CalculateOnHeadersReceivedDelta;
44 using helpers::CharListToString; 47 using helpers::CharListToString;
45 using helpers::EventResponseDelta; 48 using helpers::EventResponseDelta;
46 using helpers::EventResponseDeltas; 49 using helpers::EventResponseDeltas;
47 using helpers::EventResponseDeltas; 50 using helpers::EventResponseDeltas;
48 using helpers::InDecreasingExtensionInstallationTimeOrder; 51 using helpers::InDecreasingExtensionInstallationTimeOrder;
49 using helpers::MergeCancelOfResponses; 52 using helpers::MergeCancelOfResponses;
(...skipping 16 matching lines...) Expand all
66 } 69 }
67 70
68 // Searches |key| in |collection| by iterating over its elements and returns 71 // Searches |key| in |collection| by iterating over its elements and returns
69 // true if found. 72 // true if found.
70 template <typename Collection, typename Key> 73 template <typename Collection, typename Key>
71 bool Contains(const Collection& collection, const Key& key) { 74 bool Contains(const Collection& collection, const Key& key) {
72 return std::find(collection.begin(), collection.end(), key) != 75 return std::find(collection.begin(), collection.end(), key) !=
73 collection.end(); 76 collection.end();
74 } 77 }
75 78
79 // Parses |json_string| as a Value. Returns NULL on failure. The caller owns
80 // the returned object.
81 const Value* GetValueFromJson(const base::StringPiece& json_string) {
82 const Value* parsed = base::JSONReader::Read(json_string);
83 return parsed;
84 }
85
86 // Parses |json_string| as a DictionaryValue. Returns NULL on failure.
87 scoped_ptr<const DictionaryValue> GetDictionaryFromJson(
88 const base::StringPiece& json_string) {
89 const Value* value = GetValueFromJson(json_string);
90 if (value == NULL)
91 return scoped_ptr<const DictionaryValue>();
92 // Now we own the object pointed to by |value|.
93 const DictionaryValue* dictionary_raw = NULL;
94 const bool success = value->GetAsDictionary(&dictionary_raw);
95 scoped_ptr<const DictionaryValue> dictionary(dictionary_raw);
96 if (success)
97 return dictionary.Pass();
98 else
99 return scoped_ptr<const DictionaryValue>();
100 }
101
102 // Parses the JSON data attached to the |message| and tries to return it.
103 // Returns NULL on failure.
104 scoped_ptr<const DictionaryValue> GetPartOfMessageArguments(
105 IPC::Message* message) {
106 bool success = true;
107 EXPECT_TRUE(success = (message->type() == ExtensionMsg_MessageInvoke::ID));
108 if (!success)
109 return scoped_ptr<const DictionaryValue>();
Matt Perry 2012/08/02 10:11:03 Sadly this makes the code a bit hard to read. What
vabr (Chromium) 2012/08/05 18:54:46 Good idea. I actually changed the signature of Get
110 ExtensionMsg_MessageInvoke::Param param;
111 Value* temp_value = NULL;
112 EXPECT_TRUE(success = (ExtensionMsg_MessageInvoke::Read(message, &param)));
113 if (!success)
114 return scoped_ptr<const DictionaryValue>();
115 EXPECT_TRUE(success = (param.c.GetSize() >= 2));
116 if (!success)
117 return scoped_ptr<const DictionaryValue>();
118 EXPECT_TRUE(success = (param.c.Get(1, &temp_value)));
119 if (!success)
120 return scoped_ptr<const DictionaryValue>();
121 std::string args;
122 EXPECT_TRUE(success = (temp_value->GetAsString(&args)));
123 if (!success)
124 return scoped_ptr<const DictionaryValue>();
125 const Value* value = GetValueFromJson(args);
126 EXPECT_TRUE(success = (value != NULL));
127 if (!success)
128 return scoped_ptr<const DictionaryValue>();
129 const ListValue* list = NULL;
130 EXPECT_TRUE(success = (value->GetAsList(&list)));
131 if (!success)
132 return scoped_ptr<const DictionaryValue>();
133 scoped_ptr<const ListValue> list_scoped(list);
134 EXPECT_TRUE(success = (list->GetSize() == 1));
135 if (!success)
136 return scoped_ptr<const DictionaryValue>();
137 // TODO(vabr): Add const once ListValue getters get corrected.
138 DictionaryValue* dictionary = NULL;
139 EXPECT_TRUE(success = (list->GetDictionary(0, &dictionary)));
140 if (!success)
141 return scoped_ptr<const DictionaryValue>();
142 return scoped_ptr<const DictionaryValue>(dictionary->DeepCopy());
143 }
144
76 } // namespace 145 } // namespace
77 146
78 // A mock event router that responds to events with a pre-arranged queue of 147 // A mock event router that responds to events with a pre-arranged queue of
79 // Tasks. 148 // Tasks.
80 class TestIPCSender : public IPC::Sender { 149 class TestIPCSender : public IPC::Sender {
81 public: 150 public:
82 typedef std::list<linked_ptr<IPC::Message> > SentMessages; 151 typedef std::list<linked_ptr<IPC::Message> > SentMessages;
83 152
84 // Adds a Task to the queue. We will fire these in order as events are 153 // Adds a Task to the queue. We will fire these in order as events are
85 // dispatched. 154 // dispatched.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); 196 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL);
128 network_delegate_.reset(new ChromeNetworkDelegate( 197 network_delegate_.reset(new ChromeNetworkDelegate(
129 event_router_.get(), NULL, NULL, &profile_, 198 event_router_.get(), NULL, NULL, &profile_,
130 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, 199 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_,
131 NULL)); 200 NULL));
132 context_.reset(new TestURLRequestContext(true)); 201 context_.reset(new TestURLRequestContext(true));
133 context_->set_network_delegate(network_delegate_.get()); 202 context_->set_network_delegate(network_delegate_.get());
134 context_->Init(); 203 context_->Init();
135 } 204 }
136 205
206 // Fires a URLRequest with the specified |content_type|. Method will be "POST"
207 // and the data will be |bytes|.
208 void FireURLRequestWithPostData(const char* content_type,
209 const char* bytes, size_t bytes_length);
210
137 MessageLoopForIO message_loop_; 211 MessageLoopForIO message_loop_;
138 content::TestBrowserThread ui_thread_; 212 content::TestBrowserThread ui_thread_;
139 content::TestBrowserThread io_thread_; 213 content::TestBrowserThread io_thread_;
140 TestingProfile profile_; 214 TestingProfile profile_;
141 TestDelegate delegate_; 215 TestDelegate delegate_;
142 BooleanPrefMember enable_referrers_; 216 BooleanPrefMember enable_referrers_;
143 TestIPCSender ipc_sender_; 217 TestIPCSender ipc_sender_;
144 scoped_refptr<extensions::EventRouterForwarder> event_router_; 218 scoped_refptr<extensions::EventRouterForwarder> event_router_;
145 scoped_refptr<ExtensionInfoMap> extension_info_map_; 219 scoped_refptr<ExtensionInfoMap> extension_info_map_;
146 scoped_ptr<ChromeNetworkDelegate> network_delegate_; 220 scoped_ptr<ChromeNetworkDelegate> network_delegate_;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 EXPECT_TRUE(!request.is_pending()); 466 EXPECT_TRUE(!request.is_pending());
393 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); 467 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status());
394 EXPECT_EQ(net::ERR_ABORTED, request.status().error()); 468 EXPECT_EQ(net::ERR_ABORTED, request.status().error());
395 EXPECT_EQ(request_url, request.url()); 469 EXPECT_EQ(request_url, request.url());
396 EXPECT_EQ(1U, request.url_chain().size()); 470 EXPECT_EQ(1U, request.url_chain().size());
397 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 471 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
398 472
399 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 473 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
400 &profile_, extension_id, kEventName + "/1"); 474 &profile_, extension_id, kEventName + "/1");
401 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 475 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
402 &profile_, extension_id, kEventName2 + "/1"); 476 &profile_, extension_id, kEventName2 + "/1");
477 }
478
479 namespace {
480
481 // Based on the string with extraInfoSpec |values|, create the numerical
482 // representation. Returns true on success, otherwise false.
483 bool GenerateInfoSpec(const std::string& values, int* result) {
484 // Create a ListValue of strings.
485 std::vector<std::string> split_values;
486 scoped_ptr<base::ListValue> list_value(new base::ListValue());
487 size_t num_values = Tokenize(values, ",", &split_values);
488 for (size_t i = 0; i < num_values ; ++i)
489 list_value->Append(new base::StringValue(split_values[i]));
490 return ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue(
491 *list_value, result);
492 }
493
494 } // namespace
495
496 void ExtensionWebRequestTest::FireURLRequestWithPostData(
497 const char* content_type,
498 const char* bytes, size_t bytes_length) {
499 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme.
500 GURL request_url("http://www.example.com");
501 net::URLRequest request(request_url, &delegate_, context_.get());
502 request.set_method("POST");
503 request.SetExtraRequestHeaderByName(
504 net::HttpRequestHeaders::kContentType, content_type, true);
505 request.AppendBytesToUpload(bytes, bytes_length);
506 ipc_sender_.PushTask(base::Bind(&base::DoNothing));
507 request.Start();
508 }
509
510 TEST_F(ExtensionWebRequestTest, AccessPostData) {
511 // We verify that POST data are accessible to OnBeforeRequest listeners.
512 // Three testing steps are repeated twice:
513 // 1. Register an extension requesting ExtraInfoSpec::POST_DATA and file a
514 // URLRequest with a multipart-encoded form. See it getting parsed.
515 // 2. Do the same, but without requesting ExtraInfoSpec::POST_DATA. Nothing
516 // should be parsed.
517 // 3. With ExtraInfoSpec::POST_DATA, fire a URLRequest with a chunked
518 // upload. Get the error message.
519 // Each of these steps is done once as if the channel was DEV or CANARY,
520 // and once as if it was BETA or STABLE. It is checked that POST data access
521 // is not available on BETA/STABLE, but that it works on DEV/CANARY.
522 #define kBoundary "THIS_IS_A_BOUNDARY"
523 #define kBlock "--" kBoundary "\r\n" \
524 "Content-Disposition: form-data; name=\"text\"\r\n" \
525 "\r\n" \
526 "test text\r\n" \
527 "--" kBoundary "--"
528 // POST data input.
529 const char kMultipartBytes[] = kBlock;
530 // Expected POST data output.
531 const std::string kPostDataPath(keys::kPostDataKey);
532 const std::string kFormDataPath(kPostDataPath + "." + keys::kPostDataFormKey);
533 const std::string kErrorPath(kPostDataPath + "." + keys::kPostDataErrorKey);
534 const std::string* kPath[] = {&kFormDataPath, &kPostDataPath, &kErrorPath};
535 // form
536 const char kFormDataString[] = "{\"text\":[\"test text\"]}";
537 scoped_ptr<const DictionaryValue> form_data(
538 GetDictionaryFromJson(kFormDataString));
539 ASSERT_TRUE(form_data.get() != NULL);
540 // error
541 const StringValue error("chunked_encoding");
542 // Summary.
543 const Value* kExpected[] = {form_data.get(), NULL, &error, NULL, NULL, NULL};
544 // Header.
545 const char kMultipart[] = "multipart/form-data; boundary=" kBoundary;
546 #undef kBlock
547 #undef kBoundary
548
549 // Set up a dummy extension name.
550 ExtensionWebRequestEventRouter::RequestFilter filter;
551 std::string extension_id("1");
552 const std::string string_spec_post("blocking,postData");
553 const std::string string_spec_no_post("blocking");
554 int extra_info_spec_no_post = 0;
555 int extra_info_spec_post = 0;
556
557 for (int pass = 0; pass < 2; ++pass) {
558 SetChannelForTestingWebRequest(
559 pass > 0 ? VersionInfo::CHANNEL_BETA : VersionInfo::CHANNEL_CANARY);
560
561 // Part 1.
562 // Subscribe to OnBeforeRequest with POST data requirement.
563 ASSERT_TRUE(GenerateInfoSpec(string_spec_post, &extra_info_spec_post));
564 const std::string kEventName(keys::kOnBeforeRequest);
565 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
566 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
567 &profile_, extension_id, extension_id, kEventName, kEventName + "/1",
568 filter, extra_info_spec_post, ipc_sender_factory.GetWeakPtr());
569
570 FireURLRequestWithPostData(
571 kMultipart, kMultipartBytes, strlen(kMultipartBytes));
572
573 MessageLoop::current()->RunAllPending();
574
575 SetChannelForTestingWebRequest(
576 pass > 0 ? VersionInfo::CHANNEL_STABLE : VersionInfo::CHANNEL_DEV);
577
578 // Part 2.
579 // Now remove the requirement of POST data.
580 ASSERT_TRUE(
581 GenerateInfoSpec(string_spec_no_post, &extra_info_spec_no_post));
582 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
583 &profile_, extension_id, kEventName + "/1");
584 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
585 &profile_, extension_id, extension_id, kEventName, kEventName + "/1",
586 filter, extra_info_spec_no_post, ipc_sender_factory.GetWeakPtr());
587
588 FireURLRequestWithPostData(
589 kMultipart, kMultipartBytes, strlen(kMultipartBytes));
590
591 // Part 3.
592 // Get back the requirement of POST data.
593 ASSERT_TRUE(GenerateInfoSpec(string_spec_post, &extra_info_spec_post));
594 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
595 &profile_, extension_id, kEventName + "/1");
596 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
597 &profile_, extension_id, extension_id, kEventName, kEventName + "/1",
598 filter, extra_info_spec_post, ipc_sender_factory.GetWeakPtr());
599 {
600 GURL request_url("http://www.example.com");
601 net::URLRequest request(request_url, &delegate_, context_.get());
602 request.set_method("POST");
603 request.EnableChunkedUpload();
604 const char kDummyBytes[] = "dummy";
605 request.AppendChunkToUpload(kDummyBytes, strlen(kDummyBytes), true);
606 net::HttpRequestHeaders headers(request.extra_request_headers());
607 headers.SetHeader(net::HttpRequestHeaders::kTransferEncoding, "chunked");
608 request.SetExtraRequestHeaders(headers);
609 ipc_sender_.PushTask(base::Bind(&base::DoNothing));
610 request.Start();
611 }
612
613 MessageLoop::current()->RunAllPending();
614
615 // Clean-up.
616 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
617 &profile_, extension_id, kEventName + "/1");
618 }
619
620 ResetChannelForTestingWebRequest();
621
622 IPC::Message* message = NULL;
623 TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin();
624 for (size_t test = 0; test < arraysize(kExpected); ++test) {
625 EXPECT_NE(i, ipc_sender_.sent_end());
626 message = (i++)->get();
627 scoped_ptr<const DictionaryValue>
628 details(GetPartOfMessageArguments(message).Pass());
629 ASSERT_TRUE(details.get() != NULL);
630 const Value* result = NULL;
631 EXPECT_EQ(
632 kExpected[test] != NULL, details->Get(*(kPath[test % 3]), &result));
633 if (kExpected[test] != NULL) {
634 EXPECT_TRUE(kExpected[test]->Equals(result));
635 }
636 }
637
638 EXPECT_EQ(i, ipc_sender_.sent_end());
403 } 639 }
404 640
405 struct HeaderModificationTest_Header { 641 struct HeaderModificationTest_Header {
406 const char* name; 642 const char* name;
407 const char* value; 643 const char* value;
408 }; 644 };
409 645
410 struct HeaderModificationTest_Modification { 646 struct HeaderModificationTest_Modification {
411 enum Type { 647 enum Type {
412 SET, 648 SET,
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 858 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
623 &profile_, extension2_id, kEventName + "/2"); 859 &profile_, extension2_id, kEventName + "/2");
624 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 860 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
625 &profile_, extension3_id, std::string(keys::kOnSendHeaders) + "/3"); 861 &profile_, extension3_id, std::string(keys::kOnSendHeaders) + "/3");
626 }; 862 };
627 863
628 namespace { 864 namespace {
629 865
630 void TestInitFromValue(const std::string& values, bool expected_return_code, 866 void TestInitFromValue(const std::string& values, bool expected_return_code,
631 int expected_extra_info_spec) { 867 int expected_extra_info_spec) {
632 // Create a ListValue of strings.
633 std::vector<std::string> split_values;
634 scoped_ptr<base::ListValue> list_value(new base::ListValue());
635 size_t num_values = Tokenize(values, ",", &split_values);
636 for (size_t i = 0; i < num_values ; ++i)
637 list_value->Append(new base::StringValue(split_values[i]));
638 int actual_info_spec; 868 int actual_info_spec;
639 bool actual_return_code = 869 bool actual_return_code = GenerateInfoSpec(values, &actual_info_spec);
640 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue(
641 *list_value, &actual_info_spec);
642 EXPECT_EQ(expected_return_code, actual_return_code); 870 EXPECT_EQ(expected_return_code, actual_return_code);
643 if (expected_return_code) 871 if (expected_return_code)
644 EXPECT_EQ(expected_extra_info_spec, actual_info_spec); 872 EXPECT_EQ(expected_extra_info_spec, actual_info_spec);
645 } 873 }
646 874
647 } 875 }
648 TEST_F(ExtensionWebRequestTest, InitFromValue) { 876 TEST_F(ExtensionWebRequestTest, InitFromValue) {
649 TestInitFromValue("", true, 0); 877 TestInitFromValue("", true, 0);
650 878
651 // Single valid values. 879 // Single valid values.
652 TestInitFromValue( 880 TestInitFromValue(
653 "requestHeaders", 881 "requestHeaders",
654 true, 882 true,
655 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS); 883 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS);
656 TestInitFromValue( 884 TestInitFromValue(
657 "responseHeaders", 885 "responseHeaders",
658 true, 886 true,
659 ExtensionWebRequestEventRouter::ExtraInfoSpec::RESPONSE_HEADERS); 887 ExtensionWebRequestEventRouter::ExtraInfoSpec::RESPONSE_HEADERS);
660 TestInitFromValue( 888 TestInitFromValue(
661 "blocking", 889 "blocking",
662 true, 890 true,
663 ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING); 891 ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING);
664 TestInitFromValue( 892 TestInitFromValue(
665 "asyncBlocking", 893 "asyncBlocking",
666 true, 894 true,
667 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING); 895 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING);
896 SetChannelForTestingWebRequest(VersionInfo::CHANNEL_BETA);
897 TestInitFromValue(
898 "postData",
899 true,
900 0);
901 SetChannelForTestingWebRequest(VersionInfo::CHANNEL_DEV);
902 TestInitFromValue(
903 "postData",
904 true,
905 ExtensionWebRequestEventRouter::ExtraInfoSpec::POST_DATA);
906 ResetChannelForTestingWebRequest();
668 907
669 // Multiple valid values are bitwise-or'ed. 908 // Multiple valid values are bitwise-or'ed.
670 TestInitFromValue( 909 TestInitFromValue(
671 "requestHeaders,blocking", 910 "requestHeaders,blocking",
672 true, 911 true,
673 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS | 912 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS |
674 ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING); 913 ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING);
675 914
676 // Any invalid values lead to a bad parse. 915 // Any invalid values lead to a bad parse.
677 TestInitFromValue("invalidValue", false, 0); 916 TestInitFromValue("invalidValue", false, 0);
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 credentials_set = MergeOnAuthRequiredResponses( 1720 credentials_set = MergeOnAuthRequiredResponses(
1482 deltas, &auth3, &conflicting_extensions, &net_log); 1721 deltas, &auth3, &conflicting_extensions, &net_log);
1483 EXPECT_TRUE(credentials_set); 1722 EXPECT_TRUE(credentials_set);
1484 EXPECT_FALSE(auth3.Empty()); 1723 EXPECT_FALSE(auth3.Empty());
1485 EXPECT_EQ(username, auth1.username()); 1724 EXPECT_EQ(username, auth1.username());
1486 EXPECT_EQ(password, auth1.password()); 1725 EXPECT_EQ(password, auth1.password());
1487 EXPECT_EQ(1u, conflicting_extensions.size()); 1726 EXPECT_EQ(1u, conflicting_extensions.size());
1488 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); 1727 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1489 EXPECT_EQ(3u, capturing_net_log.GetSize()); 1728 EXPECT_EQ(3u, capturing_net_log.GetSize());
1490 } 1729 }
1491
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698