1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/basictypes.h"
7 #include "base/logging.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "mojo/public/cpp/application/application_connection.h"
11 #include "mojo/public/cpp/application/application_delegate.h"
12 #include "mojo/public/cpp/application/application_impl.h"
13 #include "mojo/public/cpp/application/interface_factory_impl.h"
14 #include "mojo/services/public/cpp/view_manager/view.h"
15 #include "mojo/services/public/cpp/view_manager/view_manager.h"
16 #include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h"
17 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
18 #include "mojo/services/public/cpp/view_manager/view_observer.h"
19 #include "mojo/services/public/interfaces/navigation/navigation.mojom.h"
20 #include "ui/events/event_constants.h"
22 #include "url/url_util.h"
28 class NavigatorImpl
: public InterfaceImpl
<Navigator
> {
30 explicit NavigatorImpl(EmbeddedApp
* app
) : app_(app
) {}
33 virtual void Navigate(
35 NavigationDetailsPtr navigation_details
,
36 ResponseDetailsPtr response_details
) OVERRIDE
;
39 DISALLOW_COPY_AND_ASSIGN(NavigatorImpl
);
43 : public ApplicationDelegate
,
44 public ViewManagerDelegate
,
48 : navigator_factory_(this),
50 view_manager_client_factory_(this) {
51 url::AddStandardScheme("mojo");
53 virtual ~EmbeddedApp() {}
55 void SetViewColor(uint32 view_id
, SkColor color
) {
56 pending_view_colors_
[view_id
] = color
;
57 ProcessPendingViewColor(view_id
);
62 // Overridden from ApplicationDelegate:
63 virtual void Initialize(ApplicationImpl
* app
) MOJO_OVERRIDE
{
64 // TODO(aa): Weird for embeddee to talk to embedder by URL. Seems like
65 // embedder should be able to specify the SP embeddee receives, then
66 // communication can be anonymous.
67 app
->ConnectToService("mojo:mojo_window_manager", &navigator_host_
);
70 virtual bool ConfigureIncomingConnection(ApplicationConnection
* connection
)
72 connection
->AddService(&view_manager_client_factory_
);
73 connection
->AddService(&navigator_factory_
);
77 // Overridden from ViewManagerDelegate:
78 virtual void OnEmbed(ViewManager
* view_manager
,
80 ServiceProviderImpl
* exported_services
,
81 scoped_ptr
<ServiceProvider
> imported_services
) OVERRIDE
{
82 root
->AddObserver(this);
83 roots_
[root
->id()] = root
;
84 ProcessPendingViewColor(root
->id());
86 virtual void OnViewManagerDisconnected(ViewManager
* view_manager
) OVERRIDE
{
87 base::MessageLoop::current()->Quit();
90 // Overridden from ViewObserver:
91 virtual void OnViewDestroyed(View
* view
) OVERRIDE
{
92 DCHECK(roots_
.find(view
->id()) != roots_
.end());
93 roots_
.erase(view
->id());
95 virtual void OnViewInputEvent(View
* view
, const EventPtr
& event
) OVERRIDE
{
96 if (event
->action
== EVENT_TYPE_MOUSE_RELEASED
) {
97 if (event
->flags
& EVENT_FLAGS_LEFT_MOUSE_BUTTON
) {
98 NavigationDetailsPtr
nav_details(NavigationDetails::New());
99 nav_details
->request
->url
=
100 "http://www.aaronboodman.com/z_dropbox/test.html";
101 navigator_host_
->RequestNavigate(view
->id(), TARGET_SOURCE_NODE
,
107 void ProcessPendingViewColor(uint32 view_id
) {
108 RootMap::iterator root
= roots_
.find(view_id
);
109 if (root
== roots_
.end())
112 PendingViewColors::iterator color
= pending_view_colors_
.find(view_id
);
113 if (color
== pending_view_colors_
.end())
116 root
->second
->SetColor(color
->second
);
117 pending_view_colors_
.erase(color
);
120 InterfaceFactoryImplWithContext
<NavigatorImpl
, EmbeddedApp
>
123 ViewManager
* view_manager_
;
124 NavigatorHostPtr navigator_host_
;
125 ViewManagerClientFactory view_manager_client_factory_
;
127 typedef std::map
<Id
, View
*> RootMap
;
130 // We can receive navigations for views we don't have yet.
131 typedef std::map
<uint32
, SkColor
> PendingViewColors
;
132 PendingViewColors pending_view_colors_
;
134 DISALLOW_COPY_AND_ASSIGN(EmbeddedApp
);
137 void NavigatorImpl::Navigate(uint32 view_id
,
138 NavigationDetailsPtr navigation_details
,
139 ResponseDetailsPtr response_details
) {
140 GURL
url(navigation_details
->request
->url
.To
<std::string
>());
141 if (!url
.is_valid()) {
142 LOG(ERROR
) << "URL is invalid.";
145 // TODO(aa): Verify new URL is same origin as current origin.
146 SkColor color
= 0x00;
147 if (!base::HexStringToUInt(url
.path().substr(1), &color
)) {
148 LOG(ERROR
) << "Invalid URL, path not convertible to integer";
151 app_
->SetViewColor(view_id
, color
);
154 } // namespace examples
157 ApplicationDelegate
* ApplicationDelegate::Create() {
158 return new examples::EmbeddedApp
;