Migrate PdfViewPluginBaseSubmitFormTest
Migrates PdfViewPluginBaseSubmitFormTest to work with PdfViewWebPlugin instead of PdfViewPluginBase. The InitializeWithEmptyUrl test replaces the EmptyDocumentUrl test, as it's not possible to initialize a PdfViewWebPlugin with an empty document URL. Bug: 1323307 Change-Id: If4f0e1ba31a0575867540b370b5ef5c212c26af3 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3647676 Commit-Queue: K. Moon <kmoon@chromium.org> Reviewed-by: Nigi <nigi@chromium.org> Cr-Commit-Position: refs/heads/main@{#1003538}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
dff38c7ffb
commit
9572046fe2
@ -351,6 +351,7 @@ void PdfViewPluginBase::SubmitForm(const std::string& url,
|
|||||||
const void* data,
|
const void* data,
|
||||||
int length) {
|
int length) {
|
||||||
// `url` might be a relative URL. Resolve it against the document's URL.
|
// `url` might be a relative URL. Resolve it against the document's URL.
|
||||||
|
// TODO(crbug.com/1322928): Probably redundant with `Client::CompleteURL()`.
|
||||||
GURL resolved_url = GURL(GetURL()).Resolve(url);
|
GURL resolved_url = GURL(GetURL()).Resolve(url);
|
||||||
if (!resolved_url.is_valid())
|
if (!resolved_url.is_valid())
|
||||||
return;
|
return;
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "base/memory/weak_ptr.h"
|
#include "base/memory/weak_ptr.h"
|
||||||
#include "base/strings/string_piece.h"
|
|
||||||
#include "base/test/icu_test_util.h"
|
#include "base/test/icu_test_util.h"
|
||||||
#include "base/test/values_test_util.h"
|
#include "base/test/values_test_util.h"
|
||||||
#include "base/time/time.h"
|
#include "base/time/time.h"
|
||||||
@ -52,7 +51,6 @@ using ::testing::IsTrue;
|
|||||||
using ::testing::NiceMock;
|
using ::testing::NiceMock;
|
||||||
using ::testing::Return;
|
using ::testing::Return;
|
||||||
using ::testing::SaveArg;
|
using ::testing::SaveArg;
|
||||||
using ::testing::StrEq;
|
|
||||||
|
|
||||||
// Keep it in-sync with the `kFinalFallbackName` returned by
|
// Keep it in-sync with the `kFinalFallbackName` returned by
|
||||||
// net::GetSuggestedFilename().
|
// net::GetSuggestedFilename().
|
||||||
@ -1278,74 +1276,4 @@ TEST_F(PdfViewPluginBaseWithEngineTest, GetAccessibilityDocInfo) {
|
|||||||
EXPECT_TRUE(doc_info.text_copyable);
|
EXPECT_TRUE(doc_info.text_copyable);
|
||||||
}
|
}
|
||||||
|
|
||||||
class PdfViewPluginBaseSubmitFormTest : public PdfViewPluginBaseTest {
|
|
||||||
public:
|
|
||||||
void SubmitForm(const std::string& url,
|
|
||||||
base::StringPiece form_data = "data") {
|
|
||||||
EXPECT_CALL(fake_plugin_, CreateUrlLoaderInternal).WillOnce([this]() {
|
|
||||||
auto mock_loader = std::make_unique<NiceMock<MockUrlLoader>>();
|
|
||||||
EXPECT_CALL(*mock_loader, Open).WillOnce(testing::SaveArg<0>(&request_));
|
|
||||||
return mock_loader;
|
|
||||||
});
|
|
||||||
|
|
||||||
fake_plugin_.SubmitForm(url, form_data.data(), form_data.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubmitFailingForm(const std::string& url) {
|
|
||||||
EXPECT_CALL(fake_plugin_, CreateUrlLoaderInternal).Times(0);
|
|
||||||
constexpr char kFormData[] = "form data";
|
|
||||||
fake_plugin_.SubmitForm(url, kFormData, std::size(kFormData));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
UrlRequest request_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, RequestMethodAndBody) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return("https://www.example.com/path/to/the.pdf"));
|
|
||||||
constexpr char kFormData[] = "form data";
|
|
||||||
SubmitForm(/*url=*/"", kFormData);
|
|
||||||
EXPECT_EQ(request_.method, "POST");
|
|
||||||
EXPECT_THAT(request_.body, StrEq(kFormData));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, RelativeUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return("https://www.example.com/path/to/the.pdf"));
|
|
||||||
SubmitForm("relative_endpoint");
|
|
||||||
EXPECT_EQ(request_.url, "https://www.example.com/path/to/relative_endpoint");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, NoRelativeUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return("https://www.example.com/path/to/the.pdf"));
|
|
||||||
SubmitForm("");
|
|
||||||
EXPECT_EQ(request_.url, "https://www.example.com/path/to/the.pdf");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, AbsoluteUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return("https://a.example.com/path/to/the.pdf"));
|
|
||||||
SubmitForm("https://b.example.com/relative_endpoint");
|
|
||||||
EXPECT_EQ(request_.url, "https://b.example.com/relative_endpoint");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, EmptyDocumentUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL).WillOnce(Return(std::string()));
|
|
||||||
SubmitFailingForm("relative_endpoint");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, RelativeUrlInvalidDocumentUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return(R"(https://www.%B%Ad.com/path/to/the.pdf)"));
|
|
||||||
SubmitFailingForm("relative_endpoint");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(PdfViewPluginBaseSubmitFormTest, AbsoluteUrlInvalidDocumentUrl) {
|
|
||||||
EXPECT_CALL(fake_plugin_, GetURL)
|
|
||||||
.WillOnce(Return(R"(https://www.%B%Ad.com/path/to/the.pdf)"));
|
|
||||||
SubmitFailingForm("https://wwww.example.com");
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace chrome_pdf
|
} // namespace chrome_pdf
|
||||||
|
@ -33,11 +33,14 @@
|
|||||||
#include "third_party/blink/public/common/input/web_keyboard_event.h"
|
#include "third_party/blink/public/common/input/web_keyboard_event.h"
|
||||||
#include "third_party/blink/public/common/input/web_mouse_event.h"
|
#include "third_party/blink/public/common/input/web_mouse_event.h"
|
||||||
#include "third_party/blink/public/common/input/web_pointer_properties.h"
|
#include "third_party/blink/public/common/input/web_pointer_properties.h"
|
||||||
|
#include "third_party/blink/public/common/loader/http_body_element_type.h"
|
||||||
|
#include "third_party/blink/public/platform/web_data.h"
|
||||||
|
#include "third_party/blink/public/platform/web_http_body.h"
|
||||||
#include "third_party/blink/public/platform/web_string.h"
|
#include "third_party/blink/public/platform/web_string.h"
|
||||||
#include "third_party/blink/public/platform/web_text_input_type.h"
|
#include "third_party/blink/public/platform/web_text_input_type.h"
|
||||||
#include "third_party/blink/public/platform/web_url.h"
|
#include "third_party/blink/public/platform/web_url.h"
|
||||||
|
#include "third_party/blink/public/platform/web_url_request.h"
|
||||||
#include "third_party/blink/public/platform/web_url_response.h"
|
#include "third_party/blink/public/platform/web_url_response.h"
|
||||||
#include "third_party/blink/public/platform/web_vector.h"
|
|
||||||
#include "third_party/blink/public/web/web_associated_url_loader.h"
|
#include "third_party/blink/public/web/web_associated_url_loader.h"
|
||||||
#include "third_party/blink/public/web/web_associated_url_loader_client.h"
|
#include "third_party/blink/public/web/web_associated_url_loader_client.h"
|
||||||
#include "third_party/blink/public/web/web_plugin_container.h"
|
#include "third_party/blink/public/web/web_plugin_container.h"
|
||||||
@ -60,11 +63,13 @@
|
|||||||
#include "ui/gfx/geometry/vector2d_f.h"
|
#include "ui/gfx/geometry/vector2d_f.h"
|
||||||
#include "ui/gfx/range/range.h"
|
#include "ui/gfx/range/range.h"
|
||||||
#include "ui/latency/latency_info.h"
|
#include "ui/latency/latency_info.h"
|
||||||
|
#include "url/gurl.h"
|
||||||
|
|
||||||
namespace chrome_pdf {
|
namespace chrome_pdf {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
using ::testing::ElementsAreArray;
|
||||||
using ::testing::Eq;
|
using ::testing::Eq;
|
||||||
using ::testing::InSequence;
|
using ::testing::InSequence;
|
||||||
using ::testing::Invoke;
|
using ::testing::Invoke;
|
||||||
@ -182,6 +187,10 @@ class FakePdfViewWebPluginClient : public PdfViewWebPlugin::Client {
|
|||||||
void SetPlugin(PdfViewWebPlugin* web_plugin) {
|
void SetPlugin(PdfViewWebPlugin* web_plugin) {
|
||||||
web_plugin_ = web_plugin;
|
web_plugin_ = web_plugin;
|
||||||
|
|
||||||
|
ON_CALL(*this, CompleteURL)
|
||||||
|
.WillByDefault([this](const blink::WebString& partial_url) {
|
||||||
|
return GURL(web_plugin_->GetURL()).Resolve(partial_url.Utf8());
|
||||||
|
});
|
||||||
ON_CALL(*this, CreateAssociatedURLLoader).WillByDefault([]() {
|
ON_CALL(*this, CreateAssociatedURLLoader).WillByDefault([]() {
|
||||||
return std::make_unique<NiceMock<MockWebAssociatedURLLoader>>();
|
return std::make_unique<NiceMock<MockWebAssociatedURLLoader>>();
|
||||||
});
|
});
|
||||||
@ -301,12 +310,6 @@ class FakePdfViewWebPluginClient : public PdfViewWebPlugin::Client {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
class PdfViewWebPluginWithoutInitializeTest : public testing::Test {
|
class PdfViewWebPluginWithoutInitializeTest : public testing::Test {
|
||||||
public:
|
|
||||||
PdfViewWebPluginWithoutInitializeTest(
|
|
||||||
const PdfViewWebPluginWithoutInitializeTest&) = delete;
|
|
||||||
PdfViewWebPluginWithoutInitializeTest& operator=(
|
|
||||||
const PdfViewWebPluginWithoutInitializeTest&) = delete;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Custom deleter for `plugin_`. PdfViewWebPlugin must be destroyed by
|
// Custom deleter for `plugin_`. PdfViewWebPlugin must be destroyed by
|
||||||
// PdfViewWebPlugin::Destroy() instead of its destructor.
|
// PdfViewWebPlugin::Destroy() instead of its destructor.
|
||||||
@ -314,15 +317,7 @@ class PdfViewWebPluginWithoutInitializeTest : public testing::Test {
|
|||||||
void operator()(PdfViewWebPlugin* ptr) { ptr->Destroy(); }
|
void operator()(PdfViewWebPlugin* ptr) { ptr->Destroy(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
PdfViewWebPluginWithoutInitializeTest() = default;
|
void SetUpPlugin(const blink::WebPluginParams& params) {
|
||||||
~PdfViewWebPluginWithoutInitializeTest() override = default;
|
|
||||||
|
|
||||||
void SetUp() override {
|
|
||||||
// Set a dummy URL for initializing the plugin.
|
|
||||||
blink::WebPluginParams params;
|
|
||||||
params.attribute_names.push_back(blink::WebString("src"));
|
|
||||||
params.attribute_values.push_back(blink::WebString("dummy.pdf"));
|
|
||||||
|
|
||||||
auto client = std::make_unique<NiceMock<FakePdfViewWebPluginClient>>();
|
auto client = std::make_unique<NiceMock<FakePdfViewWebPluginClient>>();
|
||||||
client_ptr_ = client.get();
|
client_ptr_ = client.get();
|
||||||
|
|
||||||
@ -334,6 +329,13 @@ class PdfViewWebPluginWithoutInitializeTest : public testing::Test {
|
|||||||
client_ptr_->SetPlugin(plugin_.get());
|
client_ptr_->SetPlugin(plugin_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetUpPluginWithUrl(const std::string& url) {
|
||||||
|
blink::WebPluginParams params;
|
||||||
|
params.attribute_names.push_back("src");
|
||||||
|
params.attribute_values.push_back(blink::WebString::FromUTF8(url));
|
||||||
|
SetUpPlugin(params);
|
||||||
|
}
|
||||||
|
|
||||||
void TearDown() override { plugin_.reset(); }
|
void TearDown() override { plugin_.reset(); }
|
||||||
|
|
||||||
raw_ptr<FakePdfViewWebPluginClient> client_ptr_;
|
raw_ptr<FakePdfViewWebPluginClient> client_ptr_;
|
||||||
@ -343,7 +345,7 @@ class PdfViewWebPluginWithoutInitializeTest : public testing::Test {
|
|||||||
class PdfViewWebPluginTest : public PdfViewWebPluginWithoutInitializeTest {
|
class PdfViewWebPluginTest : public PdfViewWebPluginWithoutInitializeTest {
|
||||||
protected:
|
protected:
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
PdfViewWebPluginWithoutInitializeTest::SetUp();
|
SetUpPluginWithUrl("dummy.pdf");
|
||||||
|
|
||||||
auto engine = CreateEngine();
|
auto engine = CreateEngine();
|
||||||
engine_ptr_ = engine.get();
|
engine_ptr_ = engine.get();
|
||||||
@ -455,12 +457,17 @@ class PdfViewWebPluginTest : public PdfViewWebPluginWithoutInitializeTest {
|
|||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(PdfViewWebPluginWithoutInitializeTest, Initialize) {
|
TEST_F(PdfViewWebPluginWithoutInitializeTest, Initialize) {
|
||||||
auto engine = std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get());
|
SetUpPluginWithUrl("dummy.pdf");
|
||||||
EXPECT_CALL(*client_ptr_,
|
|
||||||
RequestTouchEventType(
|
|
||||||
blink::WebPluginContainer::kTouchEventRequestTypeRaw));
|
|
||||||
|
|
||||||
EXPECT_TRUE(plugin_->InitializeForTesting(std::move(engine)));
|
EXPECT_TRUE(plugin_->InitializeForTesting(
|
||||||
|
std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get())));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginWithoutInitializeTest, InitializeWithEmptyUrl) {
|
||||||
|
SetUpPluginWithUrl("");
|
||||||
|
|
||||||
|
EXPECT_FALSE(plugin_->InitializeForTesting(
|
||||||
|
std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get())));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PdfViewWebPluginTest, UpdateGeometrySetsPluginRect) {
|
TEST_F(PdfViewWebPluginTest, UpdateGeometrySetsPluginRect) {
|
||||||
@ -1098,4 +1105,102 @@ TEST_F(PdfViewWebPluginWithDocInfoTest, DocumentLoadCompletePostMessages) {
|
|||||||
plugin_->DocumentLoadComplete();
|
plugin_->DocumentLoadComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PdfViewWebPluginSubmitFormTest
|
||||||
|
: public PdfViewWebPluginWithoutInitializeTest {
|
||||||
|
protected:
|
||||||
|
void SubmitForm(const std::string& url,
|
||||||
|
base::StringPiece form_data = "data") {
|
||||||
|
EXPECT_TRUE(plugin_->InitializeForTesting(
|
||||||
|
std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get())));
|
||||||
|
|
||||||
|
EXPECT_CALL(*client_ptr_, CreateAssociatedURLLoader).WillOnce([this]() {
|
||||||
|
auto associated_loader =
|
||||||
|
std::make_unique<NiceMock<MockWebAssociatedURLLoader>>();
|
||||||
|
EXPECT_CALL(*associated_loader, LoadAsynchronously)
|
||||||
|
.WillOnce([this](const blink::WebURLRequest& request,
|
||||||
|
blink::WebAssociatedURLLoaderClient* /*client*/) {
|
||||||
|
// TODO(crbug.com/1322928): The `UrlLoader` created by `LoadUrl()`
|
||||||
|
// and `SubmitForm()` shouldn't use different ownership semantics.
|
||||||
|
// The loader created by `SubmitForm()` is owned by the plugin, and
|
||||||
|
// cannot leak past the destruction of the plugin.
|
||||||
|
request_.CopyFrom(request);
|
||||||
|
});
|
||||||
|
return associated_loader;
|
||||||
|
});
|
||||||
|
|
||||||
|
plugin_->SubmitForm(url, form_data.data(), form_data.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitFailingForm(const std::string& url) {
|
||||||
|
EXPECT_TRUE(plugin_->InitializeForTesting(
|
||||||
|
std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get())));
|
||||||
|
|
||||||
|
EXPECT_CALL(*client_ptr_, CreateAssociatedURLLoader).Times(0);
|
||||||
|
|
||||||
|
constexpr base::StringPiece kFormData = "form data";
|
||||||
|
plugin_->SubmitForm(url, kFormData.data(), kFormData.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
blink::WebURLRequest request_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, RequestMethod) {
|
||||||
|
SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitForm(/*url=*/"");
|
||||||
|
|
||||||
|
EXPECT_EQ(request_.HttpMethod(), blink::WebString::FromASCII("POST"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, RequestBody) {
|
||||||
|
SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
constexpr base::StringPiece kFormData = "form data";
|
||||||
|
SubmitForm(/*url=*/"", kFormData);
|
||||||
|
|
||||||
|
blink::WebHTTPBody::Element element;
|
||||||
|
ASSERT_TRUE(request_.HttpBody().ElementAt(0, element));
|
||||||
|
ASSERT_EQ(element.type, blink::HTTPBodyElementType::kTypeData);
|
||||||
|
EXPECT_THAT(element.data.Copy(), testing::ElementsAreArray(kFormData));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, RelativeUrl) {
|
||||||
|
SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitForm("relative_endpoint");
|
||||||
|
|
||||||
|
EXPECT_EQ(request_.Url().GetString(),
|
||||||
|
"https://www.example.com/path/to/relative_endpoint");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, NoRelativeUrl) {
|
||||||
|
SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitForm("");
|
||||||
|
|
||||||
|
EXPECT_EQ(request_.Url().GetString(),
|
||||||
|
"https://www.example.com/path/to/the.pdf");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, AbsoluteUrl) {
|
||||||
|
SetUpPluginWithUrl("https://a.example.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitForm("https://b.example.com/relative_endpoint");
|
||||||
|
|
||||||
|
EXPECT_EQ(request_.Url().GetString(),
|
||||||
|
"https://b.example.com/relative_endpoint");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, RelativeUrlInvalidDocumentUrl) {
|
||||||
|
SetUpPluginWithUrl("https://www.%B%Ad.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitFailingForm("relative_endpoint");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PdfViewWebPluginSubmitFormTest, AbsoluteUrlInvalidDocumentUrl) {
|
||||||
|
SetUpPluginWithUrl("https://www.%B%Ad.com/path/to/the.pdf");
|
||||||
|
|
||||||
|
SubmitFailingForm("https://wwww.example.com");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace chrome_pdf
|
} // namespace chrome_pdf
|
||||||
|
Reference in New Issue
Block a user