16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/shell/ui_application_loader_android.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/bind.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_manager.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/shell/context.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace mojo {
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class UIApplicationLoader::UILoader {
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  explicit UILoader(ApplicationLoader* loader) : loader_(loader) {}
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ~UILoader() {}
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Load(ApplicationManager* manager,
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            const GURL& url,
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            ScopedMessagePipeHandle shell_handle) {
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<LoadCallbacks> callbacks(
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new ApplicationLoader::SimpleLoadCallbacks(shell_handle.Pass()));
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    loader_->Load(manager, url, callbacks);
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnApplicationError(ApplicationManager* manager, const GURL& url) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    loader_->OnApplicationError(manager, url);
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ApplicationLoader* loader_;  // Owned by UIApplicationLoader
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UILoader);
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)UIApplicationLoader::UIApplicationLoader(
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_ptr<ApplicationLoader> real_loader,
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    shell::Context* context)
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : loader_(real_loader.Pass()), context_(context) {
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)UIApplicationLoader::~UIApplicationLoader() {
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->ui_loop()->PostTask(
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&UIApplicationLoader::ShutdownOnUIThread,
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 base::Unretained(this)));
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void UIApplicationLoader::Load(ApplicationManager* manager,
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               const GURL& url,
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               scoped_refptr<LoadCallbacks> callbacks) {
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication();
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!shell_handle.is_valid())
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->ui_loop()->PostTask(
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          &UIApplicationLoader::LoadOnUIThread,
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          base::Unretained(this),
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          manager,
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          url,
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          base::Owned(new ScopedMessagePipeHandle(shell_handle.Pass()))));
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UIApplicationLoader::OnApplicationError(ApplicationManager* manager,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             const GURL& url) {
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->ui_loop()->PostTask(
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&UIApplicationLoader::OnApplicationErrorOnUIThread,
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 base::Unretained(this),
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 manager,
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 url));
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void UIApplicationLoader::LoadOnUIThread(
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ApplicationManager* manager,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const GURL& url,
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ScopedMessagePipeHandle* shell_handle) {
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!ui_loader_)
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui_loader_ = new UILoader(loader_.get());
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_loader_->Load(manager, url, shell_handle->Pass());
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UIApplicationLoader::OnApplicationErrorOnUIThread(
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ApplicationManager* manager,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& url) {
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!ui_loader_)
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui_loader_ = new UILoader(loader_.get());
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui_loader_->OnApplicationError(manager, url);
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void UIApplicationLoader::ShutdownOnUIThread() {
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delete ui_loader_;
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Destroy |loader_| on the thread it's actually used on.
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  loader_.reset();
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace mojo
99