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

Unified Diff: mojo/services/window_manager/window_manager_api_unittest.cc

Issue 405523002: Add ability APIs for opening a window with a url embedded, focusing and activating a window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 5 months 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 | « mojo/services/window_manager/DEPS ('k') | mojo/services/window_manager/window_manager_app.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/services/window_manager/window_manager_api_unittest.cc
diff --git a/mojo/services/window_manager/window_manager_api_unittest.cc b/mojo/services/window_manager/window_manager_api_unittest.cc
index b58d994994cefc59d1dba17d2d194d1873c27f9c..387b8af5e509786cbfe2d42bd18fa7208b36f85e 100644
--- a/mojo/services/window_manager/window_manager_api_unittest.cc
+++ b/mojo/services/window_manager/window_manager_api_unittest.cc
@@ -3,8 +3,14 @@
// found in the LICENSE file.
#include "base/bind.h"
+#include "base/memory/scoped_vector.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/service_manager/service_manager.h"
+#include "mojo/services/public/cpp/view_manager/node.h"
#include "mojo/services/public/cpp/view_manager/types.h"
+#include "mojo/services/public/cpp/view_manager/view_manager.h"
+#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
#include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h"
#include "mojo/shell/shell_test_helper.h"
@@ -13,6 +19,10 @@
namespace mojo {
namespace {
+const char kTestServiceURL[] = "mojo:test_url";
+
+void EmptyResultCallback(bool result) {}
+
// Callback from EmbedRoot(). |result| is the result of the
// Embed() call and |run_loop| the nested RunLoop.
void ResultCallback(bool* result_cache, base::RunLoop* run_loop, bool result) {
@@ -48,12 +58,33 @@ view_manager::Id OpenWindow(WindowManagerService* window_manager) {
return id;
}
+view_manager::Id OpenWindowWithURL(WindowManagerService* window_manager,
+ const std::string& url) {
+ base::RunLoop run_loop;
+ view_manager::Id id;
+ window_manager->OpenWindowWithURL(
+ url,
+ base::Bind(&OpenWindowCallback, &id, &run_loop));
+ run_loop.Run();
+ return id;
+}
+
class TestWindowManagerClient : public WindowManagerClient {
public:
+ typedef base::Callback<void(view_manager::Id, view_manager::Id)>
+ TwoNodeCallback;
+
explicit TestWindowManagerClient(base::RunLoop* run_loop)
: run_loop_(run_loop) {}
virtual ~TestWindowManagerClient() {}
+ void set_focus_changed_callback(const TwoNodeCallback& callback) {
+ focus_changed_callback_ = callback;
+ }
+ void set_active_window_changed_callback(const TwoNodeCallback& callback) {
+ active_window_changed_callback_ = callback;
+ }
+
private:
// Overridden from WindowManagerClient:
virtual void OnWindowManagerReady() MOJO_OVERRIDE {
@@ -61,13 +92,74 @@ class TestWindowManagerClient : public WindowManagerClient {
}
virtual void OnCaptureChanged(
view_manager::Id old_capture_node_id,
- view_manager::Id new_capture_node_id) MOJO_OVERRIDE {}
+ view_manager::Id new_capture_node_id) MOJO_OVERRIDE {
+ }
+ virtual void OnFocusChanged(
+ view_manager::Id old_focused_node_id,
+ view_manager::Id new_focused_node_id) MOJO_OVERRIDE {
+ if (!focus_changed_callback_.is_null())
+ focus_changed_callback_.Run(old_focused_node_id, new_focused_node_id);
+ }
+ virtual void OnActiveWindowChanged(
+ view_manager::Id old_active_window,
+ view_manager::Id new_active_window) MOJO_OVERRIDE {
+ if (!active_window_changed_callback_.is_null())
+ active_window_changed_callback_.Run(old_active_window, new_active_window);
+ }
base::RunLoop* run_loop_;
+ TwoNodeCallback focus_changed_callback_;
+ TwoNodeCallback active_window_changed_callback_;
DISALLOW_COPY_AND_ASSIGN(TestWindowManagerClient);
};
+class TestServiceLoader : public ServiceLoader,
+ public ApplicationDelegate,
+ public view_manager::ViewManagerDelegate {
+ public:
+ typedef base::Callback<void(view_manager::Node*)> RootAddedCallback;
+
+ explicit TestServiceLoader(const RootAddedCallback& root_added_callback)
+ : root_added_callback_(root_added_callback) {}
+ virtual ~TestServiceLoader() {}
+
+ private:
+ // Overridden from ServiceLoader:
+ virtual void LoadService(ServiceManager* service_manager,
+ const GURL& url,
+ ScopedMessagePipeHandle shell_handle) MOJO_OVERRIDE {
+ scoped_ptr<ApplicationImpl> app(
+ new ApplicationImpl(this, shell_handle.Pass()));
+ apps_.push_back(app.release());
+ }
+ virtual void OnServiceError(ServiceManager* service_manager,
+ const GURL& url) MOJO_OVERRIDE {
+ }
+
+ // Overridden from ApplicationDelegate:
+ virtual bool ConfigureIncomingConnection(
+ ApplicationConnection* connection) MOJO_OVERRIDE {
+ view_manager::ViewManager::ConfigureIncomingConnection(connection, this);
+ return true;
+ }
+
+ // Overridden from ViewManagerDelegate:
+ virtual void OnRootAdded(view_manager::ViewManager* view_manager,
+ view_manager::Node* root) MOJO_OVERRIDE {
+ root_added_callback_.Run(root);
+ }
+ virtual void OnViewManagerDisconnected(
+ view_manager::ViewManager* view_manager) MOJO_OVERRIDE {
+ }
+
+ RootAddedCallback root_added_callback_;
+
+ ScopedVector<ApplicationImpl> apps_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestServiceLoader);
+};
+
} // namespace
class WindowManagerApiTest : public testing::Test {
@@ -76,12 +168,52 @@ class WindowManagerApiTest : public testing::Test {
virtual ~WindowManagerApiTest() {}
protected:
+ typedef std::pair<view_manager::Id, view_manager::Id> TwoIds;
+
+ view_manager::Id WaitForEmbed() {
+ view_manager::Id id;
+ base::RunLoop run_loop;
+ root_added_callback_ = base::Bind(&WindowManagerApiTest::OnEmbed,
+ base::Unretained(this), &id, &run_loop);
+ run_loop.Run();
+ return id;
+ }
+
+ TwoIds WaitForFocusChange() {
+ TwoIds old_and_new;
+ base::RunLoop run_loop;
+ window_manager_client()->set_focus_changed_callback(
+ base::Bind(&WindowManagerApiTest::OnFocusChanged,
+ base::Unretained(this), &old_and_new, &run_loop));
+ run_loop.Run();
+ return old_and_new;
+ }
+
+ TwoIds WaitForActiveWindowChange() {
+ TwoIds old_and_new;
+ base::RunLoop run_loop;
+ window_manager_client()->set_active_window_changed_callback(
+ base::Bind(&WindowManagerApiTest::OnActiveWindowChanged,
+ base::Unretained(this), &old_and_new, &run_loop));
+ run_loop.Run();
+ return old_and_new;
+ }
+
+ TestWindowManagerClient* window_manager_client() {
+ return window_manager_client_.get();
+ }
+
WindowManagerServicePtr window_manager_;
private:
// Overridden from testing::Test:
virtual void SetUp() MOJO_OVERRIDE {
test_helper_.Init();
+ test_helper_.SetLoaderForURL(
+ scoped_ptr<ServiceLoader>(new TestServiceLoader(
+ base::Bind(&WindowManagerApiTest::OnRootAdded,
+ base::Unretained(this)))),
+ GURL(kTestServiceURL));
test_helper_.service_manager()->ConnectToService(
GURL("mojo:mojo_view_manager"),
&view_manager_init_);
@@ -96,21 +228,74 @@ class WindowManagerApiTest : public testing::Test {
GURL("mojo:mojo_core_window_manager"),
&window_manager_);
base::RunLoop connect_loop;
- window_manager_client_ = new TestWindowManagerClient(&connect_loop);
- window_manager_.set_client(window_manager_client_);
+ window_manager_client_.reset(new TestWindowManagerClient(&connect_loop));
+ window_manager_.set_client(window_manager_client());
connect_loop.Run();
}
+ void OnRootAdded(view_manager::Node* root) {
+ if (!root_added_callback_.is_null())
+ root_added_callback_.Run(root);
+ }
+
+ void OnEmbed(view_manager::Id* root_id,
+ base::RunLoop* loop,
+ view_manager::Node* root) {
+ *root_id = root->id();
+ loop->Quit();
+ }
+
+ void OnFocusChanged(TwoIds* old_and_new,
+ base::RunLoop* run_loop,
+ view_manager::Id old_focused_node_id,
+ view_manager::Id new_focused_node_id) {
+ DCHECK(old_and_new);
+ old_and_new->first = old_focused_node_id;
+ old_and_new->second = new_focused_node_id;
+ run_loop->Quit();
+ }
+
+ void OnActiveWindowChanged(TwoIds* old_and_new,
+ base::RunLoop* run_loop,
+ view_manager::Id old_focused_node_id,
+ view_manager::Id new_focused_node_id) {
+ DCHECK(old_and_new);
+ old_and_new->first = old_focused_node_id;
+ old_and_new->second = new_focused_node_id;
+ run_loop->Quit();
+ }
+
base::MessageLoop loop_;
shell::ShellTestHelper test_helper_;
view_manager::ViewManagerInitServicePtr view_manager_init_;
- TestWindowManagerClient* window_manager_client_;
+ scoped_ptr<TestWindowManagerClient> window_manager_client_;
+ TestServiceLoader::RootAddedCallback root_added_callback_;
DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest);
};
TEST_F(WindowManagerApiTest, OpenWindow) {
OpenWindow(window_manager_.get());
+ view_manager::Id created_node =
+ OpenWindowWithURL(window_manager_.get(), kTestServiceURL);
+ view_manager::Id embed_node = WaitForEmbed();
+ EXPECT_EQ(created_node, embed_node);
+}
+
+TEST_F(WindowManagerApiTest, FocusAndActivateWindow) {
+ view_manager::Id first_window = OpenWindow(window_manager_.get());
+ window_manager_->FocusWindow(first_window,
+ base::Bind(&EmptyResultCallback));
+ TwoIds ids = WaitForFocusChange();
+ EXPECT_TRUE(ids.first == 0);
+ EXPECT_EQ(ids.second, first_window);
+
+ view_manager::Id second_window = OpenWindow(window_manager_.get());
+ window_manager_->ActivateWindow(second_window,
+ base::Bind(&EmptyResultCallback));
+ ids = WaitForActiveWindowChange();
+ EXPECT_EQ(ids.first, first_window);
+ EXPECT_EQ(ids.second, second_window);
}
} // namespace mojo
« no previous file with comments | « mojo/services/window_manager/DEPS ('k') | mojo/services/window_manager/window_manager_app.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698