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