blob: b1434ed9dc6fe6756d831d54a9dbfe7a47dbf022 [file] [log] [blame]
// 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 "services/kiosk_wm/kiosk_wm_controller.h"
#include "services/kiosk_wm/merged_service_provider.h"
#include "services/window_manager/basic_focus_rules.h"
#include "services/window_manager/window_manager_root.h"
namespace kiosk_wm {
KioskWMController::KioskWMController(window_manager::WindowManagerRoot* wm_root)
: window_manager_root_(wm_root),
root_(nullptr),
content_(nullptr),
navigator_host_(this),
weak_factory_(this) {
exposed_services_impl_.AddService(this);
}
KioskWMController::~KioskWMController() {}
base::WeakPtr<KioskWMController> KioskWMController::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void KioskWMController::OnEmbed(
mojo::View* root,
mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exposed_services) {
// KioskWMController does not support being embedded more than once.
CHECK(!root_);
root_ = root;
root_->AddObserver(this);
// Resize to match the Nexus 5 aspect ratio:
window_manager_root_->SetViewportSize(gfx::Size(320, 640));
content_ = root->view_manager()->CreateView();
content_->SetBounds(root_->bounds());
root_->AddChild(content_);
content_->SetVisible(true);
window_manager_root_->InitFocus(
make_scoped_ptr(new window_manager::BasicFocusRules(root_)));
window_manager_root_->accelerator_manager()->Register(
ui::Accelerator(ui::VKEY_BROWSER_BACK, 0),
ui::AcceleratorManager::kNormalPriority, this);
}
void KioskWMController::Embed(
const mojo::String& url,
mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exposed_services) {
// KioskWMController is embedded in a WindowManagerRoot. WindowManagerRoot
// queues pending embed requests while we connect to the ViewManager. This
// method should only be called once ::OnEmbed has been called.
CHECK(content_);
merged_service_provider_.reset(
new MergedServiceProvider(exposed_services.Pass(), this));
content_->Embed(url, services.Pass(),
merged_service_provider_->GetServiceProviderPtr().Pass());
navigator_host_.RecordNavigation(url);
}
void KioskWMController::Create(
mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mojo::NavigatorHost> request) {
navigator_host_.Bind(request.Pass());
}
void KioskWMController::OnViewManagerDisconnected(
mojo::ViewManager* view_manager) {
root_ = nullptr;
delete this;
}
void KioskWMController::OnViewDestroyed(mojo::View* view) {
view->RemoveObserver(this);
}
void KioskWMController::OnViewBoundsChanged(mojo::View* view,
const mojo::Rect& old_bounds,
const mojo::Rect& new_bounds) {
content_->SetBounds(new_bounds);
}
// Convenience method:
void KioskWMController::ReplaceContentWithURL(const mojo::String& url) {
Embed(url, nullptr, nullptr);
}
bool KioskWMController::AcceleratorPressed(const ui::Accelerator& accelerator,
mojo::View* target) {
if (accelerator.key_code() != ui::VKEY_BROWSER_BACK)
return false;
navigator_host_.RequestNavigateHistory(-1);
return true;
}
bool KioskWMController::CanHandleAccelerators() const {
return true;
}
} // namespace kiosk_wm