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