Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / mojo / application_manager / background_shell_application_loader.h
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
14 namespace 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.
19 class 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 OnServiceError(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 OnServiceErrorOnBackgroundThread(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_