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 3 // found in the LICENSE file. 4 5 #include "base/compiler_specific.h" 6 #include "content/public/common/user_agent.h" 7 #include "content/public/test/render_view_test.h" 8 #include "content/renderer/pepper/url_request_info_util.h" 9 #include "ppapi/proxy/connection.h" 10 #include "ppapi/proxy/url_request_info_resource.h" 11 #include "ppapi/shared_impl/proxy_lock.h" 12 #include "ppapi/shared_impl/test_globals.h" 13 #include "ppapi/shared_impl/url_request_info_data.h" 14 #include "ppapi/thunk/thunk.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "third_party/WebKit/public/platform/WebURLRequest.h" 17 #include "third_party/WebKit/public/web/WebFrameClient.h" 18 #include "third_party/WebKit/public/web/WebLocalFrame.h" 19 #include "third_party/WebKit/public/web/WebView.h" 20 21 // This test is a end-to-end test from the resource to the WebKit request 22 // object. The actual resource implementation is so simple, it makes sense to 23 // test it by making sure the conversion routines actually work at the same 24 // time. 25 26 using blink::WebCString; 27 using blink::WebFrameClient; 28 using blink::WebString; 29 using blink::WebView; 30 using blink::WebURL; 31 using blink::WebURLRequest; 32 33 namespace { 34 35 bool IsExpected(const WebCString& web_string, const char* expected) { 36 const char* result = web_string.data(); 37 return strcmp(result, expected) == 0; 38 } 39 40 bool IsExpected(const WebString& web_string, const char* expected) { 41 return IsExpected(web_string.utf8(), expected); 42 } 43 44 // The base class destructor is protected, so derive. 45 class TestWebFrameClient : public WebFrameClient {}; 46 47 } // namespace 48 49 using ppapi::proxy::URLRequestInfoResource; 50 using ppapi::URLRequestInfoData; 51 52 namespace content { 53 54 class URLRequestInfoTest : public RenderViewTest { 55 public: 56 URLRequestInfoTest() : pp_instance_(1234) {} 57 58 virtual void SetUp() OVERRIDE { 59 RenderViewTest::SetUp(); 60 ppapi::ProxyLock::DisableLockingOnThreadForTest(); 61 62 test_globals_.GetResourceTracker()->DidCreateInstance(pp_instance_); 63 64 // This resource doesn't do IPC, so a null connection is fine. 65 info_ = new URLRequestInfoResource( 66 ppapi::proxy::Connection(), pp_instance_, URLRequestInfoData()); 67 } 68 69 virtual void TearDown() OVERRIDE { 70 test_globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_); 71 RenderViewTest::TearDown(); 72 } 73 74 bool GetDownloadToFile() { 75 WebURLRequest web_request; 76 URLRequestInfoData data = info_->GetData(); 77 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 78 return false; 79 return web_request.downloadToFile(); 80 } 81 82 WebCString GetURL() { 83 WebURLRequest web_request; 84 URLRequestInfoData data = info_->GetData(); 85 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 86 return WebCString(); 87 return web_request.url().spec(); 88 } 89 90 WebString GetMethod() { 91 WebURLRequest web_request; 92 URLRequestInfoData data = info_->GetData(); 93 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 94 return WebString(); 95 return web_request.httpMethod(); 96 } 97 98 WebString GetHeaderValue(const char* field) { 99 WebURLRequest web_request; 100 URLRequestInfoData data = info_->GetData(); 101 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 102 return WebString(); 103 return web_request.httpHeaderField(WebString::fromUTF8(field)); 104 } 105 106 bool SetBooleanProperty(PP_URLRequestProperty prop, bool b) { 107 return info_->SetBooleanProperty(prop, b); 108 } 109 bool SetStringProperty(PP_URLRequestProperty prop, const std::string& s) { 110 return info_->SetStringProperty(prop, s); 111 } 112 113 PP_Instance pp_instance_; 114 115 // Needs to be alive for resource tracking to work. 116 ppapi::TestGlobals test_globals_; 117 118 scoped_refptr<URLRequestInfoResource> info_; 119 }; 120 121 TEST_F(URLRequestInfoTest, GetInterface) { 122 const PPB_URLRequestInfo* request_info = 123 ppapi::thunk::GetPPB_URLRequestInfo_1_0_Thunk(); 124 EXPECT_TRUE(request_info); 125 EXPECT_TRUE(request_info->Create); 126 EXPECT_TRUE(request_info->IsURLRequestInfo); 127 EXPECT_TRUE(request_info->SetProperty); 128 EXPECT_TRUE(request_info->AppendDataToBody); 129 EXPECT_TRUE(request_info->AppendFileToBody); 130 } 131 132 TEST_F(URLRequestInfoTest, AsURLRequestInfo) { 133 EXPECT_EQ(info_, info_->AsPPB_URLRequestInfo_API()); 134 } 135 136 TEST_F(URLRequestInfoTest, StreamToFile) { 137 SetStringProperty(PP_URLREQUESTPROPERTY_URL, "http://www.google.com"); 138 139 EXPECT_FALSE(GetDownloadToFile()); 140 141 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, true)); 142 EXPECT_TRUE(GetDownloadToFile()); 143 144 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, false)); 145 EXPECT_FALSE(GetDownloadToFile()); 146 } 147 148 TEST_F(URLRequestInfoTest, FollowRedirects) { 149 EXPECT_TRUE(info_->GetData().follow_redirects); 150 151 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, false)); 152 EXPECT_FALSE(info_->GetData().follow_redirects); 153 154 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, true)); 155 EXPECT_TRUE(info_->GetData().follow_redirects); 156 } 157 158 TEST_F(URLRequestInfoTest, RecordDownloadProgress) { 159 EXPECT_FALSE(info_->GetData().record_download_progress); 160 161 EXPECT_TRUE( 162 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, true)); 163 EXPECT_TRUE(info_->GetData().record_download_progress); 164 165 EXPECT_TRUE( 166 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, false)); 167 EXPECT_FALSE(info_->GetData().record_download_progress); 168 } 169 170 TEST_F(URLRequestInfoTest, RecordUploadProgress) { 171 EXPECT_FALSE(info_->GetData().record_upload_progress); 172 173 EXPECT_TRUE( 174 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, true)); 175 EXPECT_TRUE(info_->GetData().record_upload_progress); 176 177 EXPECT_TRUE( 178 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, false)); 179 EXPECT_FALSE(info_->GetData().record_upload_progress); 180 } 181 182 TEST_F(URLRequestInfoTest, AllowCrossOriginRequests) { 183 EXPECT_FALSE(info_->GetData().allow_cross_origin_requests); 184 185 EXPECT_TRUE( 186 SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, true)); 187 EXPECT_TRUE(info_->GetData().allow_cross_origin_requests); 188 189 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, 190 false)); 191 EXPECT_FALSE(info_->GetData().allow_cross_origin_requests); 192 } 193 194 TEST_F(URLRequestInfoTest, AllowCredentials) { 195 EXPECT_FALSE(info_->GetData().allow_credentials); 196 197 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, true)); 198 EXPECT_TRUE(info_->GetData().allow_credentials); 199 200 EXPECT_TRUE( 201 SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, false)); 202 EXPECT_FALSE(info_->GetData().allow_credentials); 203 } 204 205 TEST_F(URLRequestInfoTest, SetURL) { 206 const char* url = "http://www.google.com/"; 207 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_URL, url)); 208 EXPECT_TRUE(IsExpected(GetURL(), url)); 209 } 210 211 TEST_F(URLRequestInfoTest, JavascriptURL) { 212 const char* url = "javascript:foo = bar"; 213 EXPECT_FALSE(URLRequestRequiresUniversalAccess(info_->GetData())); 214 SetStringProperty(PP_URLREQUESTPROPERTY_URL, url); 215 EXPECT_TRUE(URLRequestRequiresUniversalAccess(info_->GetData())); 216 } 217 218 TEST_F(URLRequestInfoTest, SetMethod) { 219 // Test default method is "GET". 220 EXPECT_TRUE(IsExpected(GetMethod(), "GET")); 221 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_METHOD, "POST")); 222 EXPECT_TRUE(IsExpected(GetMethod(), "POST")); 223 } 224 225 TEST_F(URLRequestInfoTest, SetHeaders) { 226 // Test default header field. 227 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "")); 228 // Test that we can set a header field. 229 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar")); 230 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "bar")); 231 // Test that we can set multiple header fields using \n delimiter. 232 EXPECT_TRUE( 233 SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar\nbar: baz")); 234 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "bar")); 235 EXPECT_TRUE(IsExpected(GetHeaderValue("bar"), "baz")); 236 } 237 238 // TODO(bbudge) Unit tests for AppendDataToBody, AppendFileToBody. 239 240 } // namespace content 241