| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ |
| #define MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ |
| |
| #include "base/macros.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/threading/simple_thread.h" |
| #include "mojo/application_manager/application_loader.h" |
| |
| namespace mojo { |
| |
| // TODO(tim): Eventually this should be Android-only to support services |
| // that we need to bundle with the shell (such as NetworkService). Perhaps |
| // we should move it to shell/ as well. |
| class MOJO_APPLICATION_MANAGER_EXPORT BackgroundShellApplicationLoader |
| : public ApplicationLoader, |
| public base::DelegateSimpleThread::Delegate { |
| public: |
| BackgroundShellApplicationLoader(scoped_ptr<ApplicationLoader> real_loader, |
| const std::string& thread_name, |
| base::MessageLoop::Type message_loop_type); |
| ~BackgroundShellApplicationLoader() override; |
| |
| // ApplicationLoader overrides: |
| void Load(ApplicationManager* manager, |
| const GURL& url, |
| scoped_refptr<LoadCallbacks> callbacks) override; |
| void OnApplicationError(ApplicationManager* manager, |
| const GURL& url) override; |
| |
| private: |
| class BackgroundLoader; |
| |
| // |base::DelegateSimpleThread::Delegate| method: |
| void Run() override; |
| |
| // These functions are exected on the background thread. They call through |
| // to |background_loader_| to do the actual loading. |
| // TODO: having this code take a |manager| is fragile (as ApplicationManager |
| // isn't thread safe). |
| void LoadOnBackgroundThread(ApplicationManager* manager, |
| const GURL& url, |
| ScopedMessagePipeHandle* shell_handle); |
| void OnApplicationErrorOnBackgroundThread(ApplicationManager* manager, |
| const GURL& url); |
| bool quit_on_shutdown_; |
| scoped_ptr<ApplicationLoader> loader_; |
| |
| const base::MessageLoop::Type message_loop_type_; |
| const std::string thread_name_; |
| |
| // Created on |thread_| during construction of |this|. Protected against |
| // uninitialized use by |message_loop_created_|, and protected against |
| // use-after-free by holding a reference to the thread-safe object. Note |
| // that holding a reference won't hold |thread_| from exiting. |
| scoped_refptr<base::TaskRunner> task_runner_; |
| base::WaitableEvent message_loop_created_; |
| |
| // Lives on |thread_|. |
| base::Closure quit_closure_; |
| |
| scoped_ptr<base::DelegateSimpleThread> thread_; |
| |
| // Lives on |thread_|. Trivial interface that calls through to |loader_|. |
| BackgroundLoader* background_loader_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BackgroundShellApplicationLoader); |
| }; |
| |
| } // namespace mojo |
| |
| #endif // MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_ |