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