mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-03 04:27:43 +01:00
Fix incorrect OSR browser display during navigation (issue #2209)
This commit is contained in:
parent
75acd20e9a
commit
c080187908
@ -409,7 +409,6 @@
|
|||||||
'tests/cefsimple/simple_handler_linux.cc',
|
'tests/cefsimple/simple_handler_linux.cc',
|
||||||
],
|
],
|
||||||
'ceftests_sources_common': [
|
'ceftests_sources_common': [
|
||||||
'tests/ceftests/accessibility_unittest.cc',
|
|
||||||
'tests/ceftests/browser_info_map_unittest.cc',
|
'tests/ceftests/browser_info_map_unittest.cc',
|
||||||
'tests/ceftests/command_line_unittest.cc',
|
'tests/ceftests/command_line_unittest.cc',
|
||||||
'tests/ceftests/cookie_unittest.cc',
|
'tests/ceftests/cookie_unittest.cc',
|
||||||
@ -431,6 +430,8 @@
|
|||||||
'tests/ceftests/message_router_unittest.cc',
|
'tests/ceftests/message_router_unittest.cc',
|
||||||
'tests/ceftests/navigation_unittest.cc',
|
'tests/ceftests/navigation_unittest.cc',
|
||||||
'tests/ceftests/os_rendering_unittest.cc',
|
'tests/ceftests/os_rendering_unittest.cc',
|
||||||
|
'tests/ceftests/osr_accessibility_unittest.cc',
|
||||||
|
'tests/ceftests/osr_display_unittest.cc',
|
||||||
'tests/ceftests/parser_unittest.cc',
|
'tests/ceftests/parser_unittest.cc',
|
||||||
'tests/ceftests/plugin_unittest.cc',
|
'tests/ceftests/plugin_unittest.cc',
|
||||||
'tests/ceftests/preference_unittest.cc',
|
'tests/ceftests/preference_unittest.cc',
|
||||||
|
@ -198,6 +198,16 @@ void CefBrowserPlatformDelegateOsr::WasHidden(bool hidden) {
|
|||||||
else
|
else
|
||||||
view->Show();
|
view->Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Also notify the WebContentsImpl for consistency.
|
||||||
|
content::WebContentsImpl* web_contents =
|
||||||
|
static_cast<content::WebContentsImpl*>(browser_->web_contents());
|
||||||
|
if (web_contents) {
|
||||||
|
if (hidden)
|
||||||
|
web_contents->WasHidden();
|
||||||
|
else
|
||||||
|
web_contents->WasShown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserPlatformDelegateOsr::NotifyScreenInfoChanged() {
|
void CefBrowserPlatformDelegateOsr::NotifyScreenInfoChanged() {
|
||||||
|
@ -16,17 +16,17 @@ namespace {
|
|||||||
const char kTestUrl[] = "https://tests/AccessibilityTestHandler";
|
const char kTestUrl[] = "https://tests/AccessibilityTestHandler";
|
||||||
const char kTipText[] = "Also known as User ID";
|
const char kTipText[] = "Also known as User ID";
|
||||||
|
|
||||||
// default osr widget size
|
// Default OSR widget size.
|
||||||
const int kOsrWidth = 600;
|
const int kOsrWidth = 600;
|
||||||
const int kOsrHeight = 400;
|
const int kOsrHeight = 400;
|
||||||
|
|
||||||
// test type
|
// Test type.
|
||||||
enum AccessibilityTestType {
|
enum AccessibilityTestType {
|
||||||
// Enabling Accessibility should trigger the AccessibilityHandler callback
|
// Enabling Accessibility should trigger the AccessibilityHandler callback
|
||||||
// with Accessibility tree details
|
// with Accessibility tree details
|
||||||
TEST_ENABLE_ACCESSIBILITY,
|
TEST_ENABLE,
|
||||||
// Disabling Accessibility should disable accessibility notification changes
|
// Disabling Accessibility should disable accessibility notification changes
|
||||||
TEST_DISABLE_ACCESSIBILITY,
|
TEST_DISABLE,
|
||||||
// Focus change on element should trigger Accessibility focus event
|
// Focus change on element should trigger Accessibility focus event
|
||||||
TEST_FOCUS_CHANGE,
|
TEST_FOCUS_CHANGE,
|
||||||
// Hide/Show etc should trigger Location Change callbacks
|
// Hide/Show etc should trigger Location Change callbacks
|
||||||
@ -44,10 +44,10 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
CefRefPtr<CefRenderHandler> GetRenderHandler() OVERRIDE { return this; }
|
CefRefPtr<CefRenderHandler> GetRenderHandler() override { return this; }
|
||||||
|
|
||||||
// Cef Renderer Handler Methods
|
// Cef Renderer Handler Methods
|
||||||
bool GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) OVERRIDE {
|
bool GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override {
|
||||||
rect = CefRect(0, 0, kOsrWidth, kOsrHeight);
|
rect = CefRect(0, 0, kOsrWidth, kOsrHeight);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -64,27 +64,10 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
const CefRenderHandler::RectList& dirtyRects,
|
const CefRenderHandler::RectList& dirtyRects,
|
||||||
const void* buffer,
|
const void* buffer,
|
||||||
int width,
|
int width,
|
||||||
int height) OVERRIDE {
|
int height) override {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
// OSRTestHandler functions
|
|
||||||
void CreateOSRBrowser(const CefString& url) {
|
|
||||||
CefWindowInfo windowInfo;
|
|
||||||
CefBrowserSettings settings;
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
windowInfo.SetAsWindowless(GetDesktopWindow());
|
|
||||||
#elif defined(OS_MACOSX)
|
|
||||||
windowInfo.SetAsWindowless(kNullWindowHandle);
|
|
||||||
#elif defined(OS_LINUX)
|
|
||||||
windowInfo.SetAsWindowless(kNullWindowHandle);
|
|
||||||
#else
|
|
||||||
#error "Unsupported platform"
|
|
||||||
#endif
|
|
||||||
CefBrowserHost::CreateBrowser(windowInfo, this, url, settings, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RunTest() override {
|
void RunTest() override {
|
||||||
std::string html =
|
std::string html =
|
||||||
"<html><head><title>AccessibilityTest</title></head>"
|
"<html><head><title>AccessibilityTest</title></head>"
|
||||||
@ -111,11 +94,11 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
// Enable Accessibility
|
// Enable Accessibility
|
||||||
browser->GetHost()->SetAccessibilityState(STATE_ENABLED);
|
browser->GetHost()->SetAccessibilityState(STATE_ENABLED);
|
||||||
switch (test_type_) {
|
switch (test_type_) {
|
||||||
case TEST_ENABLE_ACCESSIBILITY: {
|
case TEST_ENABLE: {
|
||||||
// This should trigger OnAccessibilityTreeChange
|
// This should trigger OnAccessibilityTreeChange
|
||||||
// And update will be validated
|
// And update will be validated
|
||||||
} break;
|
} break;
|
||||||
case TEST_DISABLE_ACCESSIBILITY: {
|
case TEST_DISABLE: {
|
||||||
// Post a delayed task to disable Accessibility
|
// Post a delayed task to disable Accessibility
|
||||||
CefPostDelayedTask(
|
CefPostDelayedTask(
|
||||||
TID_UI,
|
TID_UI,
|
||||||
@ -131,12 +114,12 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnAccessibilityTreeChange(CefRefPtr<CefValue> value) OVERRIDE {
|
void OnAccessibilityTreeChange(CefRefPtr<CefValue> value) override {
|
||||||
switch (test_type_) {
|
switch (test_type_) {
|
||||||
case TEST_ENABLE_ACCESSIBILITY: {
|
case TEST_ENABLE: {
|
||||||
TestEnableAccessibilityUpdate(value);
|
TestEnableAccessibilityUpdate(value);
|
||||||
} break;
|
} break;
|
||||||
case TEST_DISABLE_ACCESSIBILITY: {
|
case TEST_DISABLE: {
|
||||||
// Once Accessibility is disabled in the delayed Task
|
// Once Accessibility is disabled in the delayed Task
|
||||||
// We should not reach here
|
// We should not reach here
|
||||||
EXPECT_FALSE(accessibility_disabled_);
|
EXPECT_FALSE(accessibility_disabled_);
|
||||||
@ -217,7 +200,7 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnAccessibilityLocationChange(CefRefPtr<CefValue> value) OVERRIDE {
|
void OnAccessibilityLocationChange(CefRefPtr<CefValue> value) override {
|
||||||
if (test_type_ == TEST_LOCATION_CHANGE) {
|
if (test_type_ == TEST_LOCATION_CHANGE) {
|
||||||
EXPECT_TRUE(edit_box_id_ != -1);
|
EXPECT_TRUE(edit_box_id_ != -1);
|
||||||
EXPECT_TRUE(value.get());
|
EXPECT_TRUE(value.get());
|
||||||
@ -259,6 +242,22 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void CreateOSRBrowser(const CefString& url) {
|
||||||
|
CefWindowInfo windowInfo;
|
||||||
|
CefBrowserSettings settings;
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
windowInfo.SetAsWindowless(GetDesktopWindow());
|
||||||
|
#elif defined(OS_MACOSX)
|
||||||
|
windowInfo.SetAsWindowless(kNullWindowHandle);
|
||||||
|
#elif defined(OS_LINUX)
|
||||||
|
windowInfo.SetAsWindowless(kNullWindowHandle);
|
||||||
|
#else
|
||||||
|
#error "Unsupported platform"
|
||||||
|
#endif
|
||||||
|
CefBrowserHost::CreateBrowser(windowInfo, this, url, settings, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void HideEditBox(CefRefPtr<CefBrowser> browser) {
|
void HideEditBox(CefRefPtr<CefBrowser> browser) {
|
||||||
// Set focus on edit box
|
// Set focus on edit box
|
||||||
// This should trigger Location update if enabled
|
// This should trigger Location update if enabled
|
||||||
@ -426,34 +425,30 @@ class AccessibilityTestHandler : public TestHandler,
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST(AccessibilityTest, EnableAccessibility) {
|
TEST(OSRTest, AccessibilityEnable) {
|
||||||
CefRefPtr<AccessibilityTestHandler> handler =
|
CefRefPtr<AccessibilityTestHandler> handler =
|
||||||
new AccessibilityTestHandler(TEST_ENABLE_ACCESSIBILITY);
|
new AccessibilityTestHandler(TEST_ENABLE);
|
||||||
handler->ExecuteTest();
|
handler->ExecuteTest();
|
||||||
EXPECT_TRUE(true);
|
|
||||||
ReleaseAndWaitForDestructor(handler);
|
ReleaseAndWaitForDestructor(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AccessibilityTest, DisableAccessibility) {
|
TEST(OSRTest, AccessibilityDisable) {
|
||||||
CefRefPtr<AccessibilityTestHandler> handler =
|
CefRefPtr<AccessibilityTestHandler> handler =
|
||||||
new AccessibilityTestHandler(TEST_DISABLE_ACCESSIBILITY);
|
new AccessibilityTestHandler(TEST_DISABLE);
|
||||||
handler->ExecuteTest();
|
handler->ExecuteTest();
|
||||||
EXPECT_TRUE(true);
|
|
||||||
ReleaseAndWaitForDestructor(handler);
|
ReleaseAndWaitForDestructor(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AccessibilityTest, FocusChange) {
|
TEST(OSRTest, AccessibilityFocusChange) {
|
||||||
CefRefPtr<AccessibilityTestHandler> handler =
|
CefRefPtr<AccessibilityTestHandler> handler =
|
||||||
new AccessibilityTestHandler(TEST_FOCUS_CHANGE);
|
new AccessibilityTestHandler(TEST_FOCUS_CHANGE);
|
||||||
handler->ExecuteTest();
|
handler->ExecuteTest();
|
||||||
EXPECT_TRUE(true);
|
|
||||||
ReleaseAndWaitForDestructor(handler);
|
ReleaseAndWaitForDestructor(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AccessibilityTest, LocationChange) {
|
TEST(OSRTest, AccessibilityLocationChange) {
|
||||||
CefRefPtr<AccessibilityTestHandler> handler =
|
CefRefPtr<AccessibilityTestHandler> handler =
|
||||||
new AccessibilityTestHandler(TEST_LOCATION_CHANGE);
|
new AccessibilityTestHandler(TEST_LOCATION_CHANGE);
|
||||||
handler->ExecuteTest();
|
handler->ExecuteTest();
|
||||||
EXPECT_TRUE(true);
|
|
||||||
ReleaseAndWaitForDestructor(handler);
|
ReleaseAndWaitForDestructor(handler);
|
||||||
}
|
}
|
174
tests/ceftests/osr_display_unittest.cc
Normal file
174
tests/ceftests/osr_display_unittest.cc
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
// Copyright (c) 2017 The Chromium Embedded Framework 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 "include/base/cef_bind.h"
|
||||||
|
#include "include/wrapper/cef_closure_task.h"
|
||||||
|
|
||||||
|
#include "tests/ceftests/routing_test_handler.h"
|
||||||
|
#include "tests/gtest/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const char kTestUrl1[] = "https://tests/DisplayTestHandler.START";
|
||||||
|
const char kTestUrl2[] = "https://tests/DisplayTestHandler.NAVIGATE";
|
||||||
|
const char kTestMsg[] = "DisplayTestHandler.Status";
|
||||||
|
|
||||||
|
// Default OSR widget size.
|
||||||
|
const int kOsrWidth = 600;
|
||||||
|
const int kOsrHeight = 400;
|
||||||
|
|
||||||
|
class DisplayTestHandler : public RoutingTestHandler, public CefRenderHandler {
|
||||||
|
public:
|
||||||
|
DisplayTestHandler() : status_(START) {}
|
||||||
|
|
||||||
|
CefRefPtr<CefRenderHandler> GetRenderHandler() override { return this; }
|
||||||
|
|
||||||
|
bool GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override {
|
||||||
|
rect = CefRect(0, 0, kOsrWidth, kOsrHeight);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetScreenInfo(CefRefPtr<CefBrowser> browser,
|
||||||
|
CefScreenInfo& screen_info) override {
|
||||||
|
screen_info.rect = CefRect(0, 0, kOsrWidth, kOsrHeight);
|
||||||
|
screen_info.available_rect = screen_info.rect;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnPaint(CefRefPtr<CefBrowser> browser,
|
||||||
|
CefRenderHandler::PaintElementType type,
|
||||||
|
const CefRenderHandler::RectList& dirtyRects,
|
||||||
|
const void* buffer,
|
||||||
|
int width,
|
||||||
|
int height) override {
|
||||||
|
if (!got_paint_[status_]) {
|
||||||
|
got_paint_[status_].yes();
|
||||||
|
|
||||||
|
if (status_ == START)
|
||||||
|
OnStartIfDone();
|
||||||
|
else if (status_ == SHOW)
|
||||||
|
CefPostTask(TID_UI, base::Bind(&DisplayTestHandler::DestroyTest, this));
|
||||||
|
else
|
||||||
|
EXPECT_FALSE(true); // Not reached.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunTest() override {
|
||||||
|
// Add the resources that we will navigate to/from.
|
||||||
|
AddResource(kTestUrl1, GetPageContents("Page1", "START"), "text/html");
|
||||||
|
AddResource(kTestUrl2, GetPageContents("Page2", "NAVIGATE"), "text/html");
|
||||||
|
|
||||||
|
// Create the browser.
|
||||||
|
CreateOSRBrowser(kTestUrl1);
|
||||||
|
|
||||||
|
// Time out the test after a reasonable period of time.
|
||||||
|
SetTestTimeout(5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OnQuery(CefRefPtr<CefBrowser> browser,
|
||||||
|
CefRefPtr<CefFrame> frame,
|
||||||
|
int64 query_id,
|
||||||
|
const CefString& request,
|
||||||
|
bool persistent,
|
||||||
|
CefRefPtr<Callback> callback) override {
|
||||||
|
const std::string& request_str = request.ToString();
|
||||||
|
if (request_str.find(kTestMsg) == 0) {
|
||||||
|
const std::string& status = request_str.substr(sizeof(kTestMsg));
|
||||||
|
if (status == "START") {
|
||||||
|
got_start_msg_.yes();
|
||||||
|
OnStartIfDone();
|
||||||
|
} else if (status == "NAVIGATE") {
|
||||||
|
got_navigate_msg_.yes();
|
||||||
|
// Wait a bit to verify no OnPaint callback.
|
||||||
|
CefPostDelayedTask(
|
||||||
|
TID_UI, base::Bind(&DisplayTestHandler::OnNavigate, this), 250);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
callback->Success("");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyTest() override {
|
||||||
|
EXPECT_TRUE(got_paint_[START]);
|
||||||
|
EXPECT_FALSE(got_paint_[NAVIGATE]);
|
||||||
|
EXPECT_TRUE(got_paint_[SHOW]);
|
||||||
|
|
||||||
|
EXPECT_TRUE(got_start_msg_);
|
||||||
|
EXPECT_TRUE(got_navigate_msg_);
|
||||||
|
|
||||||
|
EXPECT_EQ(status_, SHOW);
|
||||||
|
|
||||||
|
RoutingTestHandler::DestroyTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CreateOSRBrowser(const CefString& url) {
|
||||||
|
CefWindowInfo windowInfo;
|
||||||
|
CefBrowserSettings settings;
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
windowInfo.SetAsWindowless(GetDesktopWindow());
|
||||||
|
#else
|
||||||
|
windowInfo.SetAsWindowless(kNullWindowHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CefBrowserHost::CreateBrowser(windowInfo, this, url, settings, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetPageContents(const std::string& name,
|
||||||
|
const std::string& status) {
|
||||||
|
return "<html><body>Page1<script>window.testQuery({request:'" +
|
||||||
|
std::string(kTestMsg) + ":" + status + "'});</script></body></html>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnStartIfDone() {
|
||||||
|
if (got_start_msg_ && got_paint_[START])
|
||||||
|
CefPostTask(TID_UI, base::Bind(&DisplayTestHandler::OnStart, this));
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnStart() {
|
||||||
|
EXPECT_EQ(status_, START);
|
||||||
|
|
||||||
|
// Hide the browser. OnPaint should not be called again until
|
||||||
|
// WasHidden(false) is explicitly called.
|
||||||
|
GetBrowser()->GetHost()->WasHidden(true);
|
||||||
|
status_ = NAVIGATE;
|
||||||
|
|
||||||
|
GetBrowser()->GetMainFrame()->LoadURL(kTestUrl2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnNavigate() {
|
||||||
|
EXPECT_EQ(status_, NAVIGATE);
|
||||||
|
|
||||||
|
// Show the browser.
|
||||||
|
status_ = SHOW;
|
||||||
|
GetBrowser()->GetHost()->WasHidden(false);
|
||||||
|
|
||||||
|
// Force a call to OnPaint.
|
||||||
|
GetBrowser()->GetHost()->Invalidate(PET_VIEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Status {
|
||||||
|
START,
|
||||||
|
NAVIGATE,
|
||||||
|
SHOW,
|
||||||
|
STATUS_COUNT,
|
||||||
|
};
|
||||||
|
Status status_;
|
||||||
|
|
||||||
|
TrackCallback got_paint_[STATUS_COUNT];
|
||||||
|
TrackCallback got_start_msg_;
|
||||||
|
TrackCallback got_navigate_msg_;
|
||||||
|
|
||||||
|
IMPLEMENT_REFCOUNTING(DisplayTestHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
// Test that browser visibility is not changed due to navigation.
|
||||||
|
TEST(OSRTest, NavigateWhileHidden) {
|
||||||
|
CefRefPtr<DisplayTestHandler> handler = new DisplayTestHandler();
|
||||||
|
handler->ExecuteTest();
|
||||||
|
ReleaseAndWaitForDestructor(handler);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user