146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/basictypes.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/bind.h"
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/logging.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/application/application_runner_chromium.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/c/system/main.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_delegate.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/connect.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/interface_factory_impl.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_observer.h"
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "mojo/services/public/interfaces/navigation/navigation.mojom.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/events/event_constants.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "url/gurl.h"
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "url/url_util.h"
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace mojo {
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace examples {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkColor kColors[] = {SK_ColorYELLOW, SK_ColorRED, SK_ColorGREEN,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           SK_ColorMAGENTA};
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct Window {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Window(View* root, scoped_ptr<ServiceProvider> embedder_service_provider)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : root(root),
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        embedder_service_provider(embedder_service_provider.Pass()) {}
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  View* root;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ServiceProvider> embedder_service_provider;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class EmbeddedApp
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public ApplicationDelegate,
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      public ViewManagerDelegate,
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      public ViewObserver {
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EmbeddedApp() { url::AddStandardScheme("mojo"); }
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~EmbeddedApp() {}
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from ApplicationDelegate:
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_manager_client_factory_.reset(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ViewManagerClientFactory(app->shell(), this));
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      MOJO_OVERRIDE {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection->AddService(view_manager_client_factory_.get());
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from ViewManagerDelegate:
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnEmbed(ViewManager* view_manager,
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       View* root,
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       ServiceProviderImpl* exported_services,
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       scoped_ptr<ServiceProvider> imported_services) OVERRIDE {
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    root->AddObserver(this);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    windows_[root->id()] = new Window(root, imported_services.Pass());
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    root->SetColor(kColors[next_color_++ % arraysize(kColors)]);
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnViewManagerDisconnected(ViewManager* view_manager) OVERRIDE {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoop::current()->Quit();
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Overridden from ViewObserver:
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewDestroyed(View* view) OVERRIDE {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(windows_.find(view->id()) != windows_.end());
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    windows_.erase(view->id());
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnViewInputEvent(View* view, const EventPtr& event) OVERRIDE {
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (event->action == EVENT_TYPE_MOUSE_RELEASED) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (event->flags & EVENT_FLAGS_LEFT_MOUSE_BUTTON) {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        URLRequestPtr request(URLRequest::New());
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        request->url = "http://www.aaronboodman.com/z_dropbox/test.html";
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NavigatorHostPtr navigator_host;
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ConnectToService(windows_[view->id()]->embedder_service_provider.get(),
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         &navigator_host);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        navigator_host->RequestNavigate(TARGET_SOURCE_NODE, request.Pass());
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef std::map<Id, Window*> WindowMap;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowMap windows_;
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int next_color_;
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EmbeddedApp);
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace examples
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace mojo
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)MojoResult MojoMain(MojoHandle shell_handle) {
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mojo::ApplicationRunnerChromium runner(new mojo::examples::EmbeddedApp);
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return runner.Run(shell_handle);
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
111