background_shell_application_loader.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/threading/simple_thread.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_loader.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace mojo {
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(tim): Eventually this should be Android-only to support services
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// that we need to bundle with the shell (such as NetworkService). Perhaps
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// we should move it to shell/ as well.
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class MOJO_APPLICATION_MANAGER_EXPORT BackgroundShellApplicationLoader
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : public ApplicationLoader,
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      public base::DelegateSimpleThread::Delegate {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BackgroundShellApplicationLoader(scoped_ptr<ApplicationLoader> real_loader,
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   const std::string& thread_name,
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   base::MessageLoop::Type message_loop_type);
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~BackgroundShellApplicationLoader();
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ApplicationLoader overrides:
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void Load(ApplicationManager* manager,
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    const GURL& url,
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    scoped_refptr<LoadCallbacks> callbacks) OVERRIDE;
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnServiceError(ApplicationManager* manager,
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              const GURL& url) OVERRIDE;
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  class BackgroundLoader;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |base::DelegateSimpleThread::Delegate| method:
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Run() OVERRIDE;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // These functions are exected on the background thread. They call through
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // to |background_loader_| to do the actual loading.
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO: having this code take a |manager| is fragile (as ApplicationManager
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // isn't thread safe).
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void LoadOnBackgroundThread(ApplicationManager* manager,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              const GURL& url,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              ScopedMessagePipeHandle* shell_handle);
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnServiceErrorOnBackgroundThread(ApplicationManager* manager,
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        const GURL& url);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool quit_on_shutdown_;
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<ApplicationLoader> loader_;
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const base::MessageLoop::Type message_loop_type_;
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string thread_name_;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Created on |thread_| during construction of |this|. Protected against
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // uninitialized use by |message_loop_created_|, and protected against
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // use-after-free by holding a reference to the thread-safe object. Note
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // that holding a reference won't hold |thread_| from exiting.
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<base::TaskRunner> task_runner_;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::WaitableEvent message_loop_created_;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Lives on |thread_|.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Closure quit_closure_;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::DelegateSimpleThread> thread_;
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Lives on |thread_|. Trivial interface that calls through to |loader_|.
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BackgroundLoader* background_loader_;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackgroundShellApplicationLoader);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace mojo
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // MOJO_APPLICATION_MANAGER_BACKGROUND_SHELL_APPLICATION_LOADER_H_
77