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