background_shell_application_loader.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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. 4 5#ifndef MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 6#define MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 7 8#include "base/memory/scoped_ptr.h" 9#include "base/message_loop/message_loop.h" 10#include "base/synchronization/waitable_event.h" 11#include "base/threading/simple_thread.h" 12#include "mojo/application_manager/application_loader.h" 13 14namespace mojo { 15 16// TODO(tim): Eventually this should be Android-only to support services 17// that we need to bundle with the shell (such as NetworkService). Perhaps 18// we should move it to shell/ as well. 19class MOJO_APPLICATION_MANAGER_EXPORT BackgroundShellApplicationLoader 20 : public ApplicationLoader, 21 public base::DelegateSimpleThread::Delegate { 22 public: 23 BackgroundShellApplicationLoader(scoped_ptr<ApplicationLoader> real_loader, 24 const std::string& thread_name, 25 base::MessageLoop::Type message_loop_type); 26 virtual ~BackgroundShellApplicationLoader(); 27 28 // ApplicationLoader overrides: 29 virtual void Load(ApplicationManager* manager, 30 const GURL& url, 31 scoped_refptr<LoadCallbacks> callbacks) OVERRIDE; 32 virtual void OnApplicationError(ApplicationManager* manager, 33 const GURL& url) OVERRIDE; 34 35 private: 36 class BackgroundLoader; 37 38 // |base::DelegateSimpleThread::Delegate| method: 39 virtual void Run() OVERRIDE; 40 41 // These functions are exected on the background thread. They call through 42 // to |background_loader_| to do the actual loading. 43 // TODO: having this code take a |manager| is fragile (as ApplicationManager 44 // isn't thread safe). 45 void LoadOnBackgroundThread(ApplicationManager* manager, 46 const GURL& url, 47 ScopedMessagePipeHandle* shell_handle); 48 void OnApplicationErrorOnBackgroundThread(ApplicationManager* manager, 49 const GURL& url); 50 bool quit_on_shutdown_; 51 scoped_ptr<ApplicationLoader> loader_; 52 53 const base::MessageLoop::Type message_loop_type_; 54 const std::string thread_name_; 55 56 // Created on |thread_| during construction of |this|. Protected against 57 // uninitialized use by |message_loop_created_|, and protected against 58 // use-after-free by holding a reference to the thread-safe object. Note 59 // that holding a reference won't hold |thread_| from exiting. 60 scoped_refptr<base::TaskRunner> task_runner_; 61 base::WaitableEvent message_loop_created_; 62 63 // Lives on |thread_|. 64 base::Closure quit_closure_; 65 66 scoped_ptr<base::DelegateSimpleThread> thread_; 67 68 // Lives on |thread_|. Trivial interface that calls through to |loader_|. 69 BackgroundLoader* background_loader_; 70 71 DISALLOW_COPY_AND_ASSIGN(BackgroundShellApplicationLoader); 72}; 73 74} // namespace mojo 75 76#endif // MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ 77