blob: 23fbb99b24f59ede370e39efe8f98b3fc1988ffb [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 "base/files/file_enumerator.h"
#include "base/hash.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/pdf/pdf_browsertest_base.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
using content::NavigationController;
using content::WebContents;
// Note: All tests in here require the internal PDF plugin, so they're disabled
// in non-official builds. We still compile them though, to prevent bitrot.
namespace {
// 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.
// TODO(eustas): This is failing on CROS offical build. crbug.com/446347.
#if defined(GOOGLE_CHROME_BUILD) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
#define MAYBE_Basic Basic
#else
#define MAYBE_Basic DISABLED_Basic
#endif
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Basic) {
ASSERT_NO_FATAL_FAILURE(Load());
ASSERT_NO_FATAL_FAILURE(WaitForResponse());
// OS X uses CoreText, and FreeType renders slightly different on Linux and
// Win.
#if defined(OS_MACOSX)
// The bots render differently than locally, see http://crbug.com/142531.
ASSERT_TRUE(VerifySnapshot("pdf_browsertest_mac.png") ||
VerifySnapshot("pdf_browsertest_mac2.png"));
#elif defined(OS_LINUX)
ASSERT_TRUE(VerifySnapshot("pdf_browsertest_linux.png"));
#else
ASSERT_TRUE(VerifySnapshot("pdf_browsertest.png"));
#endif
}
#if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
#define MAYBE_Scroll Scroll
#else
// TODO(thestig): http://crbug.com/79837, http://crbug.com/332778
#define MAYBE_Scroll DISABLED_Scroll
#endif
// Tests that scrolling works.
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Scroll) {
ASSERT_NO_FATAL_FAILURE(Load());
// We use wheel mouse event since that's the only one we can easily push to
// the renderer. There's no way to push a cross-platform keyboard event at
// the moment.
blink::WebMouseWheelEvent wheel_event;
wheel_event.type = blink::WebInputEvent::MouseWheel;
wheel_event.deltaY = -200;
wheel_event.wheelTicksY = -2;
WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
web_contents->GetRenderViewHost()->ForwardWheelEvent(wheel_event);
ASSERT_NO_FATAL_FAILURE(WaitForResponse());
int y_offset = 0;
ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
browser()->tab_strip_model()->GetActiveWebContents(),
"window.domAutomationController.send(plugin.pageYOffset())",
&y_offset));
ASSERT_GT(y_offset, 0);
}
const int kLoadingNumberOfParts = 10;
// 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.
// If it flakes, reopen http://crbug.com/74548.
#if defined(GOOGLE_CHROME_BUILD)
#define MAYBE_Loading Loading
#else
#define MAYBE_Loading DISABLED_Loading
#endif
IN_PROC_BROWSER_TEST_P(PDFBrowserTest, MAYBE_Loading) {
ASSERT_TRUE(pdf_test_server()->InitializeAndWaitUntilReady());
NavigationController* controller =
&(browser()->tab_strip_model()->GetActiveWebContents()->GetController());
content::NotificationRegistrar registrar;
registrar.Add(this,
content::NOTIFICATION_LOAD_STOP,
content::Source<NavigationController>(controller));
std::string base_url = std::string("/");
base::FileEnumerator file_enumerator(
ui_test_utils::GetTestFilePath(
base::FilePath(FILE_PATH_LITERAL("pdf_private")), base::FilePath()),
false,
base::FileEnumerator::FILES,
FILE_PATH_LITERAL("*.pdf"));
for (base::FilePath file_path = file_enumerator.Next();
!file_path.empty();
file_path = file_enumerator.Next()) {
std::string filename = file_path.BaseName().MaybeAsASCII();
ASSERT_FALSE(filename.empty());
#if defined(OS_POSIX)
if (filename == "sample.pdf")
continue; // Crashes on Mac and Linux. http://crbug.com/63549
#endif
// Split the test into smaller sub-tests. Each one only loads
// every k-th file.
if (static_cast<int>(base::Hash(filename) % kLoadingNumberOfParts) !=
GetParam()) {
continue;
}
LOG(WARNING) << "PDFBrowserTest.Loading: " << filename;
GURL url = pdf_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 chrome::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(content::ExecuteScriptAndExtractBool(
browser()->tab_strip_model()->GetActiveWebContents(),
"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;
content::WaitForLoadStop(
browser()->tab_strip_model()->GetActiveWebContents());
}
}
}
INSTANTIATE_TEST_CASE_P(PDFTestFiles,
PDFBrowserTest,
testing::Range(0, kLoadingNumberOfParts));
#if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
#define MAYBE_Action Action
#else
// http://crbug.com/315160
#define MAYBE_Action DISABLED_Action
#endif
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Action) {
ASSERT_NO_FATAL_FAILURE(Load());
ASSERT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(),
"document.getElementsByName('plugin')[0].fitToHeight();"));
std::string zoom1, zoom2;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
browser()->tab_strip_model()->GetActiveWebContents(),
"window.domAutomationController.send("
" document.getElementsByName('plugin')[0].getZoomLevel().toString())",
&zoom1));
ASSERT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(),
"document.getElementsByName('plugin')[0].fitToWidth();"));
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
browser()->tab_strip_model()->GetActiveWebContents(),
"window.domAutomationController.send("
" document.getElementsByName('plugin')[0].getZoomLevel().toString())",
&zoom2));
ASSERT_NE(zoom1, zoom2);
}
#if defined(GOOGLE_CHROME_BUILD) && defined(OS_LINUX)
#define MAYBE_OnLoadAndReload OnLoadAndReload
#else
// Flaky as per http://crbug.com/74549.
#define MAYBE_OnLoadAndReload DISABLED_OnLoadAndReload
#endif
IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_OnLoadAndReload) {
ASSERT_TRUE(pdf_test_server()->InitializeAndWaitUntilReady());
GURL url = pdf_test_server()->GetURL("/onload_reload.html");
ui_test_utils::NavigateToURL(browser(), url);
WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
content::WindowedNotificationObserver observer(
content::NOTIFICATION_LOAD_STOP,
content::Source<NavigationController>(
&contents->GetController()));
ASSERT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(),
"reloadPDF();"));
observer.Wait();
ASSERT_EQ("success", contents->GetURL().query());
}
} // namespace