blob: 21fd92c58bcbcafc7549cd376b46fa903f59fd6e [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/thunk/thunk.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRequest.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "webkit/glue/user_agent.h"
#include "webkit/glue/webkit_glue.h"
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
#include "webkit/plugins/ppapi/ppb_url_request_info_impl.h"
#include "webkit/plugins/ppapi/ppapi_unittest.h"
using WebKit::WebCString;
using WebKit::WebFrame;
using WebKit::WebFrameClient;
using WebKit::WebString;
using WebKit::WebView;
using WebKit::WebURL;
using WebKit::WebURLRequest;
namespace {
bool IsExpected(const WebCString& web_string, const char* expected) {
const char* result = web_string.data();
return strcmp(result, expected) == 0;
}
bool IsExpected(const WebString& web_string, const char* expected) {
return IsExpected(web_string.utf8(), expected);
}
bool IsNullOrEmpty(const WebString& web_string) {
return web_string.isNull() || web_string.isEmpty();
}
// The base class destructor is protected, so derive.
class TestWebFrameClient : public WebFrameClient {
};
} // namespace
namespace webkit {
namespace ppapi {
class URLRequestInfoTest : public PpapiUnittest {
public:
URLRequestInfoTest() {
}
virtual void SetUp() {
PpapiUnittest::SetUp();
// Must be after our base class's SetUp for the instance to be valid.
info_ = new PPB_URLRequestInfo_Impl(instance()->pp_instance(),
::ppapi::PPB_URLRequestInfo_Data());
}
static void SetUpTestCase() {
webkit_glue::SetUserAgent(webkit_glue::BuildUserAgentFromProduct(
"TestShell/0.0.0.0"), false);
web_view_ = WebView::create(NULL);
web_view_->initializeMainFrame(&web_frame_client_);
WebURL web_url(GURL(""));
WebURLRequest url_request;
url_request.initialize();
url_request.setURL(web_url);
frame_ = web_view_->mainFrame();
frame_->loadRequest(url_request);
}
static void TearDownTestCase() {
web_view_->close();
}
bool GetDownloadToFile() {
WebURLRequest web_request;
if (!info_->ToWebURLRequest(frame_, &web_request))
return false;
return web_request.downloadToFile();
}
WebCString GetURL() {
WebURLRequest web_request;
if (!info_->ToWebURLRequest(frame_, &web_request))
return WebCString();
return web_request.url().spec();
}
WebString GetMethod() {
WebURLRequest web_request;
if (!info_->ToWebURLRequest(frame_, &web_request))
return WebString();
return web_request.httpMethod();
}
WebString GetHeaderValue(const char* field) {
WebURLRequest web_request;
if (!info_->ToWebURLRequest(frame_, &web_request))
return WebString();
return web_request.httpHeaderField(WebString::fromUTF8(field));
}
bool SetBooleanProperty(PP_URLRequestProperty prop, bool b) {
return info_->SetBooleanProperty(prop, b);
}
bool SetStringProperty(PP_URLRequestProperty prop, const std::string& s) {
return info_->SetStringProperty(prop, s);
}
scoped_refptr<PPB_URLRequestInfo_Impl> info_;
static TestWebFrameClient web_frame_client_;
static WebView* web_view_;
static WebFrame* frame_;
};
TestWebFrameClient URLRequestInfoTest::web_frame_client_;
WebView* URLRequestInfoTest::web_view_;
WebFrame* URLRequestInfoTest::frame_;
TEST_F(URLRequestInfoTest, GetInterface) {
const PPB_URLRequestInfo* request_info =
::ppapi::thunk::GetPPB_URLRequestInfo_1_0_Thunk();
EXPECT_TRUE(request_info);
EXPECT_TRUE(request_info->Create);
EXPECT_TRUE(request_info->IsURLRequestInfo);
EXPECT_TRUE(request_info->SetProperty);
EXPECT_TRUE(request_info->AppendDataToBody);
EXPECT_TRUE(request_info->AppendFileToBody);
}
TEST_F(URLRequestInfoTest, AsURLRequestInfo) {
EXPECT_EQ(info_, info_->AsPPB_URLRequestInfo_API());
}
TEST_F(URLRequestInfoTest, StreamToFile) {
SetStringProperty(PP_URLREQUESTPROPERTY_URL, "http://www.google.com");
EXPECT_FALSE(GetDownloadToFile());
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_STREAMTOFILE, true));
EXPECT_TRUE(GetDownloadToFile());
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_STREAMTOFILE, false));
EXPECT_FALSE(GetDownloadToFile());
}
TEST_F(URLRequestInfoTest, FollowRedirects) {
EXPECT_TRUE(info_->GetData().follow_redirects);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, false));
EXPECT_FALSE(info_->GetData().follow_redirects);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, true));
EXPECT_TRUE(info_->GetData().follow_redirects);
}
TEST_F(URLRequestInfoTest, RecordDownloadProgress) {
EXPECT_FALSE(info_->GetData().record_download_progress);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, true));
EXPECT_TRUE(info_->GetData().record_download_progress);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, false));
EXPECT_FALSE(info_->GetData().record_download_progress);
}
TEST_F(URLRequestInfoTest, RecordUploadProgress) {
EXPECT_FALSE(info_->GetData().record_upload_progress);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, true));
EXPECT_TRUE(info_->GetData().record_upload_progress);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, false));
EXPECT_FALSE(info_->GetData().record_upload_progress);
}
TEST_F(URLRequestInfoTest, AllowCrossOriginRequests) {
EXPECT_FALSE(info_->GetData().allow_cross_origin_requests);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, true));
EXPECT_TRUE(info_->GetData().allow_cross_origin_requests);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, false));
EXPECT_FALSE(info_->GetData().allow_cross_origin_requests);
}
TEST_F(URLRequestInfoTest, AllowCredentials) {
EXPECT_FALSE(info_->GetData().allow_credentials);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, true));
EXPECT_TRUE(info_->GetData().allow_credentials);
EXPECT_TRUE(SetBooleanProperty(
PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, false));
EXPECT_FALSE(info_->GetData().allow_credentials);
}
TEST_F(URLRequestInfoTest, SetURL) {
// Test default URL is "about:blank".
EXPECT_TRUE(IsExpected(GetURL(), "about:blank"));
const char* url = "http://www.google.com/";
EXPECT_TRUE(SetStringProperty(
PP_URLREQUESTPROPERTY_URL, url));
EXPECT_TRUE(IsExpected(GetURL(), url));
}
TEST_F(URLRequestInfoTest, JavascriptURL) {
const char* url = "javascript:foo = bar";
EXPECT_FALSE(info_->RequiresUniversalAccess());
SetStringProperty(PP_URLREQUESTPROPERTY_URL, url);
EXPECT_TRUE(info_->RequiresUniversalAccess());
}
TEST_F(URLRequestInfoTest, SetMethod) {
// Test default method is "GET".
EXPECT_TRUE(IsExpected(GetMethod(), "GET"));
EXPECT_TRUE(SetStringProperty(
PP_URLREQUESTPROPERTY_METHOD, "POST"));
EXPECT_TRUE(IsExpected(GetMethod(), "POST"));
}
TEST_F(URLRequestInfoTest, SetHeaders) {
// Test default header field.
EXPECT_TRUE(IsExpected(
GetHeaderValue("foo"), ""));
// Test that we can set a header field.
EXPECT_TRUE(SetStringProperty(
PP_URLREQUESTPROPERTY_HEADERS, "foo: bar"));
EXPECT_TRUE(IsExpected(
GetHeaderValue("foo"), "bar"));
// Test that we can set multiple header fields using \n delimiter.
EXPECT_TRUE(SetStringProperty(
PP_URLREQUESTPROPERTY_HEADERS, "foo: bar\nbar: baz"));
EXPECT_TRUE(IsExpected(
GetHeaderValue("foo"), "bar"));
EXPECT_TRUE(IsExpected(
GetHeaderValue("bar"), "baz"));
}
// TODO(bbudge) Unit tests for AppendDataToBody, AppendFileToBody.
} // namespace ppapi
} // namespace webkit