Index: mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc b/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
similarity index 89% |
rename from mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
rename to mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
index e70ec2bda312cb1a0fd95ce49870f8c182e0d473..fd618b87d3c77790f5f8c9bd93426a51f8f5df44 100644 |
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
+++ b/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
@@ -2,7 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" |
+#include "mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.h" |
#include "base/bind.h" |
#include "base/message_loop/message_loop.h" |
@@ -12,10 +12,10 @@ |
#include "mojo/public/cpp/application/service_provider_impl.h" |
#include "mojo/public/interfaces/application/service_provider.mojom.h" |
#include "mojo/public/interfaces/application/shell.mojom.h" |
-#include "mojo/services/public/cpp/view_manager/lib/view_private.h" |
-#include "mojo/services/public/cpp/view_manager/util.h" |
-#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" |
-#include "mojo/services/public/cpp/view_manager/view_observer.h" |
+#include "mojo/services/view_manager/public/cpp/lib/view_private.h" |
+#include "mojo/services/view_manager/public/cpp/util.h" |
+#include "mojo/services/view_manager/public/cpp/view_manager_delegate.h" |
+#include "mojo/services/view_manager/public/cpp/view_observer.h" |
namespace mojo { |
@@ -81,7 +81,7 @@ class RootObserver : public ViewObserver { |
void OnViewDestroyed(View* view) override { |
DCHECK_EQ(view, root_); |
static_cast<ViewManagerClientImpl*>( |
- ViewPrivate(root_).view_manager())->RemoveRoot(root_); |
+ ViewPrivate(root_).view_manager())->RootDestroyed(root_); |
view->RemoveObserver(this); |
delete this; |
} |
@@ -99,6 +99,8 @@ ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate, |
connection_id_(0), |
next_id_(1), |
delegate_(delegate), |
+ root_(nullptr), |
+ focused_view_(nullptr), |
binding_(this, handle.Pass()), |
service_(binding_.client()), |
delete_on_error_(delete_on_error) { |
@@ -230,8 +232,8 @@ const std::string& ViewManagerClientImpl::GetEmbedderURL() const { |
return creator_url_; |
} |
-const std::vector<View*>& ViewManagerClientImpl::GetRoots() const { |
- return roots_; |
+View* ViewManagerClientImpl::GetRoot() { |
+ return root_; |
} |
View* ViewManagerClientImpl::GetViewById(Id id) { |
@@ -239,6 +241,10 @@ View* ViewManagerClientImpl::GetViewById(Id id) { |
return it != views_.end() ? it->second : NULL; |
} |
+View* ViewManagerClientImpl::GetFocusedView() { |
+ return focused_view_; |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// ViewManagerClientImpl, ViewManagerClient implementation: |
@@ -248,20 +254,14 @@ void ViewManagerClientImpl::OnEmbed( |
ViewDataPtr root_data, |
InterfaceRequest<ServiceProvider> parent_services, |
ScopedMessagePipeHandle window_manager_pipe) { |
- if (!connected_) { |
- connected_ = true; |
- connection_id_ = connection_id; |
- creator_url_ = String::From(creator_url); |
- } else { |
- DCHECK_EQ(connection_id_, connection_id); |
- DCHECK_EQ(creator_url_, creator_url); |
- } |
+ DCHECK(!connected_); |
+ connected_ = true; |
+ connection_id_ = connection_id; |
+ creator_url_ = String::From(creator_url); |
- // A new root must not already exist as a root or be contained by an existing |
- // hierarchy visible to this view manager. |
- View* root = AddViewToViewManager(this, NULL, root_data); |
- roots_.push_back(root); |
- root->AddObserver(new RootObserver(root)); |
+ DCHECK(!root_); |
+ root_ = AddViewToViewManager(this, nullptr, root_data); |
+ root_->AddObserver(new RootObserver(root_)); |
ServiceProviderImpl* exported_services = nullptr; |
scoped_ptr<ServiceProvider> remote; |
@@ -274,7 +274,12 @@ void ViewManagerClientImpl::OnEmbed( |
} |
window_manager_.Bind(window_manager_pipe.Pass()); |
window_manager_.set_client(this); |
- delegate_->OnEmbed(this, root, exported_services, remote.Pass()); |
+ // base::Unretained() is safe here as |window_manager_| is bound to our |
+ // lifetime. |
+ window_manager_->GetFocusedAndActiveViews( |
+ base::Bind(&ViewManagerClientImpl::OnGotFocusedAndActiveViews, |
+ base::Unretained(this))); |
+ delegate_->OnEmbed(this, root_, exported_services, remote.Pass()); |
} |
void ViewManagerClientImpl::OnEmbeddedAppDisconnected(Id view_id) { |
@@ -386,6 +391,7 @@ void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, |
*ViewPrivate(blurred).observers(), |
OnViewFocusChanged(focused, blurred)); |
} |
+ focused_view_ = focused; |
if (focused) { |
FOR_EACH_OBSERVER(ViewObserver, |
*ViewPrivate(focused).observers(), |
@@ -406,11 +412,9 @@ void ViewManagerClientImpl::OnConnectionError() { |
//////////////////////////////////////////////////////////////////////////////// |
// ViewManagerClientImpl, private: |
-void ViewManagerClientImpl::RemoveRoot(View* root) { |
- std::vector<View*>::iterator it = |
- std::find(roots_.begin(), roots_.end(), root); |
- if (it != roots_.end()) |
- roots_.erase(it); |
+void ViewManagerClientImpl::RootDestroyed(View* root) { |
+ DCHECK_EQ(root, root_); |
+ root_ = nullptr; |
} |
void ViewManagerClientImpl::OnActionCompleted(bool success) { |
@@ -433,4 +437,10 @@ base::Callback<void(ErrorCode)> |
base::Unretained(this)); |
} |
+void ViewManagerClientImpl::OnGotFocusedAndActiveViews(uint32 focused_view_id, |
+ uint32 active_view_id) { |
+ if (GetViewById(focused_view_id) != focused_view_) |
+ OnFocusChanged(focused_view_ ? focused_view_->id() : 0, focused_view_id); |
+} |
+ |
} // namespace mojo |