Commit b9741588 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

chromeos: fixs cursor lookup for WebContents

Only use the cursor at an embed point if the embedder isn't intercepting
events. I'm assuming that if the embedder is intercepting events, then it's
setting the cursor. This is the case for WebContents.

BUG=877099
TEST=covered by test

Change-Id: I04304a2ae8e668f5a7506378868c2a53eac7de0a
Reviewed-on: https://chromium-review.googlesource.com/1187409
Commit-Queue: Scott Violet <sky@chromium.org>
Reviewed-by: default avatarEvan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585659}
parent 8e3e6c83
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "services/ui/ws2/window_delegate_impl.h" #include "services/ui/ws2/window_delegate_impl.h"
#include "services/ui/ws2/embedding.h"
#include "services/ui/ws2/server_window.h" #include "services/ui/ws2/server_window.h"
#include "services/ui/ws2/window_properties.h" #include "services/ui/ws2/window_properties.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
...@@ -43,9 +44,13 @@ gfx::NativeCursor WindowDelegateImpl::GetCursor(const gfx::Point& point) { ...@@ -43,9 +44,13 @@ gfx::NativeCursor WindowDelegateImpl::GetCursor(const gfx::Point& point) {
return server_window->window()->delegate()->GetCursor(toplevel_point); return server_window->window()->delegate()->GetCursor(toplevel_point);
} }
if (server_window->HasEmbedding()) // Assume that if the embedder is intercepting events, it's also responsible
// for the cursor (which is the case with content embeddings).
if (server_window->HasEmbedding() &&
!server_window->embedding()->embedding_tree_intercepts_events()) {
return server_window->cursor(); return server_window->cursor();
} }
}
// TODO(sky): there should be a NOTREACHED() here, but we're hitting this on // TODO(sky): there should be a NOTREACHED() here, but we're hitting this on
// asan builder. Figure out. https://crbug.com/855767. // asan builder. Figure out. https://crbug.com/855767.
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "services/ui/ws2/window_delegate_impl.h" #include "services/ui/ws2/window_delegate_impl.h"
#include "services/ui/ws2/embedding.h"
#include "services/ui/ws2/test_window_service_delegate.h" #include "services/ui/ws2/test_window_service_delegate.h"
#include "services/ui/ws2/window_service_test_setup.h" #include "services/ui/ws2/window_service_test_setup.h"
#include "services/ui/ws2/window_tree_test_helper.h" #include "services/ui/ws2/window_tree_test_helper.h"
...@@ -34,5 +35,60 @@ TEST(WindowDeleteImplTest, GetCursorTopLevel) { ...@@ -34,5 +35,60 @@ TEST(WindowDeleteImplTest, GetCursorTopLevel) {
top_level->GetCursor(gfx::Point()).native_type()); top_level->GetCursor(gfx::Point()).native_type());
} }
TEST(WindowDeleteImplTest, GetCursorForEmbedding) {
WindowServiceTestSetup setup;
// WindowDelegateImpl deletes itself when the window is deleted.
WindowDelegateImpl* delegate = new WindowDelegateImpl();
setup.delegate()->set_delegate_for_next_top_level(delegate);
aura::Window* top_level =
setup.window_tree_test_helper()->NewTopLevelWindow();
delegate->set_window(top_level);
// Create an embedding.
aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
ASSERT_TRUE(embed_window);
top_level->AddChild(embed_window);
std::unique_ptr<EmbeddingHelper> embedding_helper =
setup.CreateEmbedding(embed_window);
// Set a cursor on the embedded window from the embedded client and ensure we
// get it back.
const ui::CursorData help_cursor(ui::CursorType::kHelp);
embedding_helper->window_tree_test_helper->SetCursor(embed_window,
help_cursor);
EXPECT_EQ(help_cursor.cursor_type(),
embed_window->GetCursor(gfx::Point()).native_type());
}
TEST(WindowDeleteImplTest, GetCursorForEmbeddingInterceptsEvents) {
WindowServiceTestSetup setup;
// WindowDelegateImpl deletes itself when the window is deleted.
WindowDelegateImpl* delegate = new WindowDelegateImpl();
setup.delegate()->set_delegate_for_next_top_level(delegate);
aura::Window* top_level =
setup.window_tree_test_helper()->NewTopLevelWindow();
delegate->set_window(top_level);
// Set a cursor on |top_level|.
const ui::CursorData help_cursor(ui::CursorType::kHelp);
setup.window_tree_test_helper()->SetCursor(top_level, help_cursor);
// Create an embedding.
aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
ASSERT_TRUE(embed_window);
top_level->AddChild(embed_window);
std::unique_ptr<EmbeddingHelper> embedding_helper = setup.CreateEmbedding(
embed_window, ui::mojom::kEmbedFlagEmbedderInterceptsEvents);
// Set a cursor on the embedding. Because the embedding was created with
// kEmbedFlagEmbedderInterceptsEvents the cursor should come from the parent
// (|top_level|).
const ui::CursorData ibeam_cursor(ui::CursorType::kIBeam);
embedding_helper->window_tree_test_helper->SetCursor(embed_window,
ibeam_cursor);
EXPECT_EQ(help_cursor.cursor_type(),
embed_window->GetCursor(gfx::Point()).native_type());
}
} // namespace ws2 } // namespace ws2
} // namespace ui } // namespace ui
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment