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

Unified Diff: chrome/test/plugin/pdf_browsertest.cc

Issue 5141001: Add a PDF test to load all the pdfs in a test directory, using the test serve... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix race condition Created 10 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/out_of_proc_test_runner.cc ('k') | net/tools/testserver/testserver.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/plugin/pdf_browsertest.cc
===================================================================
--- chrome/test/plugin/pdf_browsertest.cc (revision 66374)
+++ chrome/test/plugin/pdf_browsertest.cc (working copy)
@@ -7,6 +7,7 @@
#include "base/file_util.h"
#include "base/path_service.h"
#include "base/string_number_conversions.h"
+#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/renderer_host/render_view_host.h"
@@ -16,39 +17,62 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/notification_observer.h"
+#include "chrome/common/notification_type.h"
#include "chrome/test/in_process_browser_test.h"
#include "chrome/test/ui_test_utils.h"
#include "gfx/codec/png_codec.h"
+extern base::hash_map<std::string, int> g_test_timeout_overrides;
+
namespace {
// Include things like browser frame and scrollbar and make sure we're bigger
// than the test pdf document.
static const int kBrowserWidth = 1000;
static const int kBrowserHeight = 600;
+static const int kLoadingTestTimeoutMs = 60000;
+// The loading test is really a collection of tests, each one being a different
+// PDF file. But it would be busy work to add a different test for each file.
+// Since we run them all in one test, we want a bigger timeout.
+class IncreaseLoadingTimeout {
+ public:
+ IncreaseLoadingTimeout() {
+ g_test_timeout_overrides["PDFBrowserTest.Loading"] = kLoadingTestTimeoutMs;
+ }
+};
+
+IncreaseLoadingTimeout g_increase_loading_timeout;
+
class PDFBrowserTest : public InProcessBrowserTest,
public NotificationObserver {
public:
PDFBrowserTest()
- : have_plugin_(false),
- snapshot_different_(true),
- next_dummy_search_value_(0) {
+ : snapshot_different_(true),
+ next_dummy_search_value_(0),
+ load_stop_notification_count_(0) {
+ EnableDOMAutomation();
}
protected:
- bool have_plugin() const { return have_plugin_; }
+ int load_stop_notification_count() const {
+ return load_stop_notification_count_;
+ }
virtual void SetUp() {
FilePath pdf_path;
PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path);
- have_plugin_ = file_util::PathExists(pdf_path);
InProcessBrowserTest::SetUp();
}
+ FilePath GetPDFTestDir() {
+ return FilePath(FilePath::kCurrentDirectory).AppendASCII("plugin").
+ AppendASCII("pdf");
+ }
+
void Load() {
GURL url(ui_test_utils::GetTestUrl(
- FilePath(FilePath::kCurrentDirectory),
+ GetPDFTestDir(),
FilePath(FILE_PATH_LITERAL("pdf_browsertest.pdf"))));
ui_test_utils::NavigateToURL(browser(), url);
gfx::Rect bounds(gfx::Rect(0, 0, kBrowserWidth, kBrowserHeight));
@@ -105,7 +129,7 @@
if (type == NotificationType::TAB_SNAPSHOT_TAKEN) {
MessageLoopForUI::current()->Quit();
FilePath reference = ui_test_utils::GetTestFilePath(
- FilePath(FilePath::kCurrentDirectory),
+ GetPDFTestDir(),
FilePath().AppendASCII(expected_filename_));
base::PlatformFileInfo info;
ASSERT_TRUE(file_util::GetFileInfo(reference, &info));
@@ -165,13 +189,11 @@
reinterpret_cast<char*>(&png_data[0]), png_data.size());
}
}
+ } else if (type == NotificationType::LOAD_STOP) {
+ load_stop_notification_count_++;
}
}
- // True if we found the pdf plugin. Needed since only official builders have
- // the pdf plugin, so for the rest, and for other devs, we don't want the test
- // to fail.
- bool have_plugin_;
// True if the snapshot differed from the expected value.
bool snapshot_different_;
// Internal variable used to synchronize to the renderer.
@@ -180,6 +202,8 @@
std::string expected_filename_;
// If the snapshot is different, holds the location where it's saved.
FilePath snapshot_filename_;
+ // How many times we've seen NotificationType::LOAD_STOP.
+ int load_stop_notification_count_;
};
#if defined(OS_MACOSX)
@@ -192,8 +216,6 @@
// Tests basic PDF rendering. This can be broken depending on bad merges with
// the vendor, so it's important that we have basic sanity checking.
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Basic) {
- if (!have_plugin())
- return;
ASSERT_NO_FATAL_FAILURE(Load());
ASSERT_NO_FATAL_FAILURE(WaitForResponse());
@@ -209,9 +231,6 @@
// Tests that scrolling works.
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Scroll) {
- if (!have_plugin())
- return;
-
ASSERT_NO_FATAL_FAILURE(Load());
// We use wheel mouse event since that's the only one we can easily push to
@@ -235,9 +254,6 @@
#endif
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_FindAndCopy) {
- if (!have_plugin())
- return;
-
ASSERT_NO_FATAL_FAILURE(Load());
// Verifies that find in page works.
ASSERT_EQ(3, ui_test_utils::FindInPage(
@@ -261,4 +277,56 @@
ASSERT_EQ("adipiscing", text);
}
+// Tests that loading async pdfs works correctly (i.e. document fully loads).
+// This also loads all documents that used to crash, to ensure we don't have
+// regressions.
+IN_PROC_BROWSER_TEST_F(PDFBrowserTest, Loading) {
+ ASSERT_TRUE(test_server()->Start());
+
+ NavigationController* controller =
+ &(browser()->GetSelectedTabContents()->controller());
+ NotificationRegistrar registrar;
+ registrar.Add(this,
+ NotificationType::LOAD_STOP,
+ Source<NavigationController>(controller));
+ std::string base_url = std::string("files/plugin/pdf/");
+
+ file_util::FileEnumerator file_enumerator(
+ ui_test_utils::GetTestFilePath(GetPDFTestDir(), FilePath()),
+ false,
+ file_util::FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.pdf"));
+ for (FilePath file_path = file_enumerator.Next();
+ !file_path.empty();
+ file_path = file_enumerator.Next()) {
+ std::string filename = WideToASCII(file_path.BaseName().ToWStringHack());
+ LOG(WARNING) << "PDFBrowserTest.Loading: " << filename;
+
+ GURL url = test_server()->GetURL(base_url + filename);
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ while (true) {
+ int last_count = load_stop_notification_count();
+ // We might get extraneous NotificationType::LOAD_STOP notifications when
+ // doing async loading. This happens when the first loader is cancelled
+ // and before creating a byte-range request loader.
+
+ bool complete = false;
+ ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ browser()->GetSelectedTabContents()->render_view_host(),
+ std::wstring(),
+ L"window.domAutomationController.send(plugin.documentLoadComplete())",
+ &complete));
+ if (complete)
+ break;
+
+ // Check if the LOAD_STOP notification could have come while we run a
+ // nested message loop for the JS call.
+ if (last_count != load_stop_notification_count())
+ continue;
+ ui_test_utils::WaitForLoadStop(controller);
+ }
+ }
+}
+
} // namespace
« no previous file with comments | « chrome/test/out_of_proc_test_runner.cc ('k') | net/tools/testserver/testserver.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698