background_shell_application_loader.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/synchronization/waitable_event.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/threading/simple_thread.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_loader.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace mojo { 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(tim): Eventually this should be Android-only to support services 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// that we need to bundle with the shell (such as NetworkService). Perhaps 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// we should move it to shell/ as well. 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class MOJO_APPLICATION_MANAGER_EXPORT BackgroundShellApplicationLoader 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : public ApplicationLoader, 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public base::DelegateSimpleThread::Delegate { 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) BackgroundShellApplicationLoader(scoped_ptr<ApplicationLoader> real_loader, 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& thread_name, 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::MessageLoop::Type message_loop_type); 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~BackgroundShellApplicationLoader(); 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // ApplicationLoader overrides: 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void Load(ApplicationManager* manager, 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url, 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<LoadCallbacks> callbacks) OVERRIDE; 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnServiceError(ApplicationManager* manager, 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url) OVERRIDE; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class BackgroundLoader; 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // |base::DelegateSimpleThread::Delegate| method: 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Run() OVERRIDE; 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // These functions are exected on the background thread. They call through 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to |background_loader_| to do the actual loading. 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO: having this code take a |manager| is fragile (as ApplicationManager 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // isn't thread safe). 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void LoadOnBackgroundThread(ApplicationManager* manager, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScopedMessagePipeHandle* shell_handle); 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void OnServiceErrorOnBackgroundThread(ApplicationManager* manager, 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool quit_on_shutdown_; 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ApplicationLoader> loader_; 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::MessageLoop::Type message_loop_type_; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string thread_name_; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Created on |thread_| during construction of |this|. Protected against 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // uninitialized use by |message_loop_created_|, and protected against 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // use-after-free by holding a reference to the thread-safe object. Note 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // that holding a reference won't hold |thread_| from exiting. 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::TaskRunner> task_runner_; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::WaitableEvent message_loop_created_; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Lives on |thread_|. 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Closure quit_closure_; 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<base::DelegateSimpleThread> thread_; 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Lives on |thread_|. Trivial interface that calls through to |loader_|. 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BackgroundLoader* background_loader_; 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BackgroundShellApplicationLoader); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace mojo 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 77