blob: 6d9cb6de315a612b2cace3079412d3044e05fa0d [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// 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
Benjamin Lerman5d429aa2015-05-07 16:21:00 +02005#ifndef SHELL_BACKGROUND_APPLICATION_LOADER_H_
6#define SHELL_BACKGROUND_APPLICATION_LOADER_H_
James Robinson646469d2014-10-03 15:33:28 -07007
8#include "base/macros.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/message_loop/message_loop.h"
11#include "base/synchronization/waitable_event.h"
12#include "base/threading/simple_thread.h"
Przemysław Pietrzkiewicz6384d092015-01-15 16:03:17 -080013#include "shell/application_manager/application_loader.h"
James Robinson646469d2014-10-03 15:33:28 -070014
Viet-Trung Luu36faa4d2015-03-04 18:08:18 -080015namespace shell {
James Robinson646469d2014-10-03 15:33:28 -070016
Viet-Trung Luu16492012015-03-03 15:18:32 -080017class BackgroundApplicationLoader
James Robinson646469d2014-10-03 15:33:28 -070018 : public ApplicationLoader,
19 public base::DelegateSimpleThread::Delegate {
20 public:
Scott Violetf0ef0822014-12-18 08:55:12 -080021 BackgroundApplicationLoader(scoped_ptr<ApplicationLoader> real_loader,
22 const std::string& thread_name,
23 base::MessageLoop::Type message_loop_type);
24 ~BackgroundApplicationLoader() override;
James Robinson646469d2014-10-03 15:33:28 -070025
26 // ApplicationLoader overrides:
Viet-Trung Luubd07e3a2015-04-09 12:43:29 -070027 void Load(
28 const GURL& url,
29 mojo::InterfaceRequest<mojo::Application> application_request) override;
James Robinson646469d2014-10-03 15:33:28 -070030
31 private:
James Robinson646469d2014-10-03 15:33:28 -070032 // |base::DelegateSimpleThread::Delegate| method:
James Robinsone1b30cf2014-10-21 12:25:40 -070033 void Run() override;
James Robinson646469d2014-10-03 15:33:28 -070034
35 // These functions are exected on the background thread. They call through
36 // to |background_loader_| to do the actual loading.
James Robinsone5ae9e42015-01-26 17:53:08 -080037 void LoadOnBackgroundThread(
James Robinsone5ae9e42015-01-26 17:53:08 -080038 const GURL& url,
Viet-Trung Luubd07e3a2015-04-09 12:43:29 -070039 mojo::InterfaceRequest<mojo::Application> application_request);
James Robinson646469d2014-10-03 15:33:28 -070040 bool quit_on_shutdown_;
41 scoped_ptr<ApplicationLoader> loader_;
42
43 const base::MessageLoop::Type message_loop_type_;
44 const std::string thread_name_;
45
46 // Created on |thread_| during construction of |this|. Protected against
47 // uninitialized use by |message_loop_created_|, and protected against
48 // use-after-free by holding a reference to the thread-safe object. Note
49 // that holding a reference won't hold |thread_| from exiting.
50 scoped_refptr<base::TaskRunner> task_runner_;
51 base::WaitableEvent message_loop_created_;
52
53 // Lives on |thread_|.
54 base::Closure quit_closure_;
55
56 scoped_ptr<base::DelegateSimpleThread> thread_;
57
Scott Violetf0ef0822014-12-18 08:55:12 -080058 DISALLOW_COPY_AND_ASSIGN(BackgroundApplicationLoader);
James Robinson646469d2014-10-03 15:33:28 -070059};
60
Viet-Trung Luu36faa4d2015-03-04 18:08:18 -080061} // namespace shell
James Robinson646469d2014-10-03 15:33:28 -070062
Benjamin Lerman5d429aa2015-05-07 16:21:00 +020063#endif // SHELL_BACKGROUND_APPLICATION_LOADER_H_