| Index: wm/foreign_window.cc
|
| diff --git a/wm/foreign_window.cc b/wm/foreign_window.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2d1476c5db489f28d3771090a73d0fc8ec073001
|
| --- /dev/null
|
| +++ b/wm/foreign_window.cc
|
| @@ -0,0 +1,169 @@
|
| +// Copyright (c) 2013 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 "wm/foreign_window.h"
|
| +
|
| +#include "ui/aura/window.h"
|
| +#include "ui/aura/window_property.h"
|
| +#include "ui/views/widget/widget.h"
|
| +#include "wm/foreign_window_client_view.h"
|
| +#include "wm/host/foreign_window_host.h"
|
| +
|
| +namespace wm {
|
| +
|
| +namespace {
|
| +
|
| +DECLARE_WINDOW_PROPERTY_TYPE(ForeignWindow*)
|
| +DEFINE_LOCAL_WINDOW_PROPERTY_KEY(ForeignWindow*, kForeignWindowKey, NULL);
|
| +
|
| +ForeignWindowHost* CreateHost(ForeignWindow* foreign_window,
|
| + gfx::PluginWindowHandle window_handle) {
|
| + ForeignWindowHost* host = ForeignWindowHost::Create(window_handle);
|
| + host->SetDelegate(foreign_window);
|
| + return host;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +ForeignWindow::CreateParams::CreateParams(
|
| + gfx::PluginWindowHandle a_window_handle,
|
| + gfx::Size a_preferred_size)
|
| + : window_handle(a_window_handle),
|
| + preferred_size(a_preferred_size) {
|
| +}
|
| +
|
| +ForeignWindow::ForeignWindow(const CreateParams& params)
|
| + : ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + host_(CreateHost(this, params.window_handle))),
|
| + preferred_size_(params.preferred_size),
|
| + display_state_(DISPLAY_WITHDRAWN),
|
| + destroyed_(false) {
|
| +}
|
| +
|
| +ForeignWindow::~ForeignWindow() {
|
| + if (!client_view_)
|
| + return;
|
| +
|
| + client_view_->GetNativeView()->ClearProperty(kForeignWindowKey);
|
| +}
|
| +
|
| +void ForeignWindow::OnWindowContentsChanged() {
|
| + if (!client_view_)
|
| + return;
|
| +
|
| + client_view_->OnWindowContentsChanged();
|
| +}
|
| +
|
| +views::WidgetDelegate* ForeignWindow::CreateWidgetDelegate() {
|
| + AddRef(); // Balanced in DeleteDelegate();
|
| + return this;
|
| +}
|
| +
|
| +views::ClientView* ForeignWindow::CreateClientView(views::Widget* widget) {
|
| + DCHECK(!client_view_);
|
| + ForeignWindowClientView* client_view = new ForeignWindowClientView(
|
| + host_->GetWindowHandle(), preferred_size_);
|
| + client_view->GetNativeView()->SetProperty(kForeignWindowKey, this);
|
| + client_view->GetNativeView()->Show();
|
| + widget->GetNativeView()->AddChild(client_view->GetNativeView());
|
| +
|
| + // Keep a weak reference to the client view.
|
| + client_view_ = client_view->AsWeakPtr();
|
| +
|
| + return client_view;
|
| +}
|
| +
|
| +views::Widget* ForeignWindow::GetWidget() {
|
| + if (!client_view_)
|
| + return NULL;
|
| +
|
| + return client_view_->GetWidget();
|
| +}
|
| +
|
| +const views::Widget* ForeignWindow::GetWidget() const {
|
| + if (!client_view_)
|
| + return NULL;
|
| +
|
| + return client_view_->GetWidget();
|
| +}
|
| +
|
| +void ForeignWindow::DeleteDelegate() {
|
| + // The window has finished closing. Allow ourself to be deleted.
|
| + Release();
|
| +}
|
| +
|
| +bool ForeignWindow::CanResize() const {
|
| + return false;
|
| +}
|
| +
|
| +bool ForeignWindow::CanMaximize() const {
|
| + return false;
|
| +}
|
| +
|
| +bool ForeignWindow::CanActivate() const {
|
| + return true;
|
| +}
|
| +
|
| +void ForeignWindow::Close() {
|
| + host_->Close();
|
| +}
|
| +
|
| +gfx::PluginWindowHandle ForeignWindow::GetWindowHandle() const {
|
| + return host_->GetWindowHandle();
|
| +}
|
| +
|
| +gfx::NativeView ForeignWindow::GetNativeView() const {
|
| + if (!client_view_)
|
| + return NULL;
|
| +
|
| + return client_view_->GetNativeView();
|
| +}
|
| +
|
| +void ForeignWindow::SetDisplayState(ForeignWindow::DisplayState state) {
|
| + display_state_ = state;
|
| +}
|
| +
|
| +ForeignWindow::DisplayState ForeignWindow::GetDisplayState() const {
|
| + return display_state_;
|
| +}
|
| +
|
| +bool ForeignWindow::IsManaged() const {
|
| + return true;
|
| +}
|
| +
|
| +bool ForeignWindow::HasBeenDestroyed() const {
|
| + return destroyed_;
|
| +}
|
| +
|
| +void ForeignWindow::OnWindowSizeChanged(const gfx::Size& size) {
|
| + if (!client_view_)
|
| + return;
|
| +
|
| + client_view_->OnWindowSizeChanged(size);
|
| +}
|
| +
|
| +void ForeignWindow::OnWindowVisibilityChanged(bool visible) {
|
| + if (!client_view_)
|
| + return;
|
| +
|
| + client_view_->OnWindowVisibilityChanged(visible);
|
| +}
|
| +
|
| +void ForeignWindow::OnWindowDestroyed() {
|
| + DCHECK(!destroyed_);
|
| + destroyed_ = true;
|
| +
|
| + if (!client_view_)
|
| + return;
|
| +
|
| + client_view_->OnWindowDestroyed();
|
| +}
|
| +
|
| +// static
|
| +ForeignWindow* ForeignWindow::GetForeignWindowForNativeView(
|
| + gfx::NativeView native_view) {
|
| + return native_view->GetProperty(kForeignWindowKey);
|
| +}
|
| +
|
| +} // namespace wm
|
|
|