15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/app_current_window_internal/app_current_window_internal_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "apps/native_app_window.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/shell_window.h"
94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "apps/shell_window_registry.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/app_current_window_internal.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/app_window.h"
134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/common/extensions/features/feature_channel.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "extensions/common/switches.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing apps::ShellWindow;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace SetBounds = extensions::api::app_current_window_internal::SetBounds;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::api::app_current_window_internal::Bounds;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace SetIcon = extensions::api::app_current_window_internal::SetIcon;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNoAssociatedShellWindow[] =
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "The context from which the function was called did not have an "
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "associated shell window.";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kDevChannelOnly[] =
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    "This function is currently only available in the Dev channel.";
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalExtensionFunction::RunImpl() {
354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  apps::ShellWindowRegistry* registry =
364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      apps::ShellWindowRegistry::Get(profile());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(registry);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh = render_view_host();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No need to set an error, since we won't return to the caller anyway if
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // there's no RVH.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellWindow* window = registry->GetShellWindowForRenderViewHost(rvh);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_ = kNoAssociatedShellWindow;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunWithWindow(window);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalFocusFunction::RunWithWindow(ShellWindow* window) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->GetBaseWindow()->Activate();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AppCurrentWindowInternalFullscreenFunction::RunWithWindow(
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShellWindow* window) {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window->Fullscreen();
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalMaximizeFunction::RunWithWindow(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window->Maximize();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalMinimizeFunction::RunWithWindow(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window->Minimize();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalRestoreFunction::RunWithWindow(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window->Restore();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalDrawAttentionFunction::RunWithWindow(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->GetBaseWindow()->FlashFrame(true);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalClearAttentionFunction::RunWithWindow(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->GetBaseWindow()->FlashFrame(false);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalShowFunction::RunWithWindow(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->GetBaseWindow()->Show();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCurrentWindowInternalHideFunction::RunWithWindow(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->GetBaseWindow()->Hide();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppCurrentWindowInternalSetBoundsFunction::RunWithWindow(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellWindow* window) {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start with the current bounds, and change any values that are specified in
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the incoming parameters.
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect bounds = window->GetClientBounds();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SetBounds::Params> params(SetBounds::Params::Create(*args_));
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(params.get());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->bounds.left)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.set_x(*(params->bounds.left));
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->bounds.top)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.set_y(*(params->bounds.top));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->bounds.width)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.set_width(*(params->bounds.width));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->bounds.height)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.set_height(*(params->bounds.height));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bounds.Inset(-window->GetBaseWindow()->GetFrameInsets());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->GetBaseWindow()->SetBounds(bounds);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppCurrentWindowInternalSetIconFunction::RunWithWindow(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellWindow* window) {
1274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (GetCurrentChannel() > chrome::VersionInfo::CHANNEL_DEV &&
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      GetExtension()->location() != extensions::Manifest::COMPONENT) {
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    error_ = kDevChannelOnly;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SetIcon::Params> params(SetIcon::Params::Create(*args_));
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(params.get());
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The |icon_url| parameter may be a blob url (e.g. an image fetched with an
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // XMLHttpRequest) or a resource url.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(params->icon_url);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!url.is_valid())
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    url = GetExtension()->GetResourceURL(params->icon_url);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->SetAppIconUrl(url);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
146