// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "mojo/shell/ui_application_loader_android.h" #include "base/bind.h" #include "mojo/application_manager/application_manager.h" #include "mojo/shell/context.h" namespace mojo { class UIApplicationLoader::UILoader { public: explicit UILoader(ApplicationLoader* loader) : loader_(loader) {} ~UILoader() {} void Load(ApplicationManager* manager, const GURL& url, ScopedMessagePipeHandle shell_handle) { scoped_refptr callbacks( new ApplicationLoader::SimpleLoadCallbacks(shell_handle.Pass())); loader_->Load(manager, url, callbacks); } void OnApplicationError(ApplicationManager* manager, const GURL& url) { loader_->OnApplicationError(manager, url); } private: ApplicationLoader* loader_; // Owned by UIApplicationLoader DISALLOW_COPY_AND_ASSIGN(UILoader); }; UIApplicationLoader::UIApplicationLoader( scoped_ptr real_loader, shell::Context* context) : loader_(real_loader.Pass()), context_(context) { } UIApplicationLoader::~UIApplicationLoader() { context_->ui_loop()->PostTask( FROM_HERE, base::Bind(&UIApplicationLoader::ShutdownOnUIThread, base::Unretained(this))); } void UIApplicationLoader::Load(ApplicationManager* manager, const GURL& url, scoped_refptr callbacks) { ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication(); if (!shell_handle.is_valid()) return; context_->ui_loop()->PostTask( FROM_HERE, base::Bind( &UIApplicationLoader::LoadOnUIThread, base::Unretained(this), manager, url, base::Owned(new ScopedMessagePipeHandle(shell_handle.Pass())))); } void UIApplicationLoader::OnApplicationError(ApplicationManager* manager, const GURL& url) { context_->ui_loop()->PostTask( FROM_HERE, base::Bind(&UIApplicationLoader::OnApplicationErrorOnUIThread, base::Unretained(this), manager, url)); } void UIApplicationLoader::LoadOnUIThread( ApplicationManager* manager, const GURL& url, ScopedMessagePipeHandle* shell_handle) { if (!ui_loader_) ui_loader_ = new UILoader(loader_.get()); ui_loader_->Load(manager, url, shell_handle->Pass()); } void UIApplicationLoader::OnApplicationErrorOnUIThread( ApplicationManager* manager, const GURL& url) { if (!ui_loader_) ui_loader_ = new UILoader(loader_.get()); ui_loader_->OnApplicationError(manager, url); } void UIApplicationLoader::ShutdownOnUIThread() { delete ui_loader_; // Destroy |loader_| on the thread it's actually used on. loader_.reset(); } } // namespace mojo