Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/values.h" | |
| 6 #include "chrome/browser/extensions/api/tabs/app_window_controller.h" | |
| 7 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" | |
| 8 #include "chrome/browser/extensions/extension_tab_util.h" | |
| 9 #include "chrome/browser/extensions/window_controller.h" | |
| 10 #include "chrome/browser/extensions/window_controller_list.h" | |
| 11 #include "chrome/browser/profiles/profile.h" | |
| 12 #include "chrome/browser/sessions/session_tab_helper.h" | |
| 13 #include "extensions/browser/app_window/app_window.h" | |
| 14 #include "extensions/browser/app_window/native_app_window.h" | |
| 15 #include "extensions/browser/app_window/size_constraints.h" | |
| 16 #include "extensions/common/extension.h" | |
| 17 #include "extensions/common/permissions/permissions_data.h" | |
| 18 | |
| 19 namespace extensions { | |
| 20 | |
| 21 AppBaseWindow::AppBaseWindow(AppWindow* app_window) : app_window_(app_window) { | |
| 22 } | |
| 23 | |
| 24 AppBaseWindow::~AppBaseWindow() { | |
| 25 } | |
| 26 | |
| 27 bool AppBaseWindow::IsActive() const { | |
| 28 return GetBaseWindow()->IsActive(); | |
| 29 } | |
| 30 | |
| 31 bool AppBaseWindow::IsMaximized() const { | |
| 32 return GetBaseWindow()->IsMaximized(); | |
| 33 } | |
| 34 | |
| 35 bool AppBaseWindow::IsMinimized() const { | |
| 36 return GetBaseWindow()->IsMinimized(); | |
| 37 } | |
| 38 | |
| 39 bool AppBaseWindow::IsFullscreen() const { | |
| 40 return GetBaseWindow()->IsFullscreen(); | |
| 41 } | |
| 42 | |
| 43 gfx::NativeWindow AppBaseWindow::GetNativeWindow() const { | |
| 44 return GetBaseWindow()->GetNativeWindow(); | |
| 45 } | |
| 46 | |
| 47 gfx::Rect AppBaseWindow::GetRestoredBounds() const { | |
| 48 return GetBaseWindow()->GetRestoredBounds(); | |
| 49 } | |
| 50 | |
| 51 ui::WindowShowState AppBaseWindow::GetRestoredState() const { | |
| 52 return GetBaseWindow()->GetRestoredState(); | |
| 53 } | |
| 54 | |
| 55 gfx::Rect AppBaseWindow::GetBounds() const { | |
| 56 return GetBaseWindow()->GetBounds(); | |
| 57 } | |
| 58 | |
| 59 void AppBaseWindow::Show() { | |
| 60 GetBaseWindow()->Show(); | |
| 61 } | |
| 62 | |
| 63 void AppBaseWindow::Hide() { | |
| 64 GetBaseWindow()->Hide(); | |
| 65 } | |
| 66 | |
| 67 void AppBaseWindow::ShowInactive() { | |
| 68 GetBaseWindow()->ShowInactive(); | |
| 69 } | |
| 70 | |
| 71 void AppBaseWindow::Close() { | |
| 72 GetBaseWindow()->Close(); | |
| 73 } | |
| 74 | |
| 75 void AppBaseWindow::Activate() { | |
| 76 GetBaseWindow()->Activate(); | |
| 77 } | |
| 78 | |
| 79 void AppBaseWindow::Deactivate() { | |
| 80 GetBaseWindow()->Deactivate(); | |
| 81 } | |
| 82 | |
| 83 void AppBaseWindow::Maximize() { | |
| 84 GetBaseWindow()->Maximize(); | |
| 85 } | |
| 86 | |
| 87 void AppBaseWindow::Minimize() { | |
| 88 GetBaseWindow()->Minimize(); | |
| 89 } | |
| 90 | |
| 91 void AppBaseWindow::Restore() { | |
| 92 GetBaseWindow()->Restore(); | |
| 93 } | |
| 94 | |
| 95 void AppBaseWindow::SetBounds(const gfx::Rect& bounds) { | |
| 96 // We constraint the given size to the min/max sizes of the | |
| 97 // application window. | |
| 98 gfx::Rect original_window_bounds = GetBaseWindow()->GetBounds(); | |
| 99 gfx::Insets frame_insets = GetBaseWindow()->GetFrameInsets(); | |
| 100 SizeConstraints constraints( | |
| 101 SizeConstraints::AddFrameToConstraints( | |
| 102 GetBaseWindow()->GetContentMinimumSize(), frame_insets), | |
| 103 SizeConstraints::AddFrameToConstraints( | |
| 104 GetBaseWindow()->GetContentMaximumSize(), frame_insets)); | |
| 105 | |
| 106 gfx::Rect new_bounds = bounds; | |
| 107 new_bounds.set_size(constraints.ClampSize(bounds.size())); | |
| 108 | |
| 109 GetBaseWindow()->SetBounds(new_bounds); | |
| 110 } | |
| 111 | |
| 112 void AppBaseWindow::FlashFrame(bool flash) { | |
| 113 GetBaseWindow()->FlashFrame(flash); | |
| 114 } | |
| 115 | |
| 116 bool AppBaseWindow::IsAlwaysOnTop() const { | |
| 117 return GetBaseWindow()->IsAlwaysOnTop(); | |
| 118 } | |
| 119 | |
| 120 void AppBaseWindow::SetAlwaysOnTop(bool always_on_top) { | |
| 121 GetBaseWindow()->SetAlwaysOnTop(always_on_top); | |
| 122 } | |
| 123 | |
| 124 NativeAppWindow* AppBaseWindow::GetBaseWindow() const { | |
| 125 return app_window_->GetBaseWindow(); | |
| 126 } | |
| 127 | |
| 128 AppWindowController::AppWindowController(AppWindow* app_window, | |
| 129 scoped_ptr<AppBaseWindow> base_window, | |
| 130 Profile* profile) | |
| 131 : WindowController(base_window.get(), profile), | |
| 132 app_window_(app_window), | |
| 133 base_window_(base_window.Pass()) { | |
| 134 WindowControllerList::GetInstance()->AddExtensionWindow(this); | |
| 135 } | |
| 136 | |
| 137 AppWindowController::~AppWindowController() { | |
| 138 WindowControllerList::GetInstance()->RemoveExtensionWindow(this); | |
| 139 } | |
| 140 | |
| 141 int AppWindowController::GetWindowId() const { | |
| 142 return static_cast<int>(app_window_->session_id().id()); | |
| 143 } | |
| 144 | |
| 145 std::string AppWindowController::GetWindowTypeText() const { | |
| 146 if (app_window_->window_type_is_panel()) | |
| 147 return tabs_constants::kWindowTypeValuePanel; | |
| 148 return tabs_constants::kWindowTypeValueApp; | |
| 149 } | |
| 150 | |
| 151 base::DictionaryValue* AppWindowController::CreateWindowValueWithTabs( | |
| 152 const Extension* extension) const { | |
| 153 base::DictionaryValue* result = CreateWindowValue(); | |
| 154 | |
| 155 DCHECK(IsVisibleToExtension(extension)); | |
| 156 base::DictionaryValue* tab_value = CreateTabValue(extension, 0); | |
| 157 if (!tab_value) | |
| 158 return result; | |
| 159 | |
| 160 base::ListValue* tab_list = new base::ListValue(); | |
| 161 tab_list->Append(tab_value); | |
| 162 result->Set(tabs_constants::kTabsKey, tab_list); | |
| 163 | |
| 164 return result; | |
| 165 } | |
| 166 | |
| 167 base::DictionaryValue* AppWindowController::CreateTabValue( | |
|
dcheng
2015/06/29 18:15:49
Please use scoped_ptr here and elsewhere.
llandwerlin-old
2015/06/30 10:20:47
These methods are overridden from extension::Windo
| |
| 168 const Extension* extension, | |
| 169 int tab_index) const { | |
| 170 if (tab_index > 0) | |
| 171 return nullptr; | |
| 172 | |
| 173 content::WebContents* web_contents = app_window_->web_contents(); | |
| 174 if (!web_contents) | |
| 175 return nullptr; | |
| 176 | |
| 177 base::DictionaryValue* tab_value = new base::DictionaryValue(); | |
| 178 tab_value->SetInteger(tabs_constants::kIdKey, | |
| 179 SessionTabHelper::IdForTab(web_contents)); | |
| 180 tab_value->SetInteger(tabs_constants::kIndexKey, 0); | |
| 181 tab_value->SetInteger( | |
| 182 tabs_constants::kWindowIdKey, | |
| 183 SessionTabHelper::IdForWindowContainingTab(web_contents)); | |
| 184 tab_value->SetString(tabs_constants::kUrlKey, web_contents->GetURL().spec()); | |
| 185 tab_value->SetString( | |
| 186 tabs_constants::kStatusKey, | |
| 187 ExtensionTabUtil::GetTabStatusText(web_contents->IsLoading())); | |
| 188 tab_value->SetBoolean(tabs_constants::kActiveKey, | |
| 189 app_window_->GetBaseWindow()->IsActive()); | |
| 190 tab_value->SetBoolean(tabs_constants::kSelectedKey, true); | |
| 191 tab_value->SetBoolean(tabs_constants::kHighlightedKey, true); | |
| 192 tab_value->SetBoolean(tabs_constants::kPinnedKey, false); | |
| 193 tab_value->SetString(tabs_constants::kTitleKey, web_contents->GetTitle()); | |
| 194 tab_value->SetBoolean(tabs_constants::kIncognitoKey, | |
| 195 app_window_->GetBaseWindow()->IsActive()); | |
| 196 | |
| 197 gfx::Rect bounds = app_window_->GetBaseWindow()->GetBounds(); | |
| 198 tab_value->SetInteger(tabs_constants::kWidthKey, bounds.width()); | |
| 199 tab_value->SetInteger(tabs_constants::kHeightKey, bounds.height()); | |
| 200 | |
| 201 std::string icon_str("chrome://favicon/"); | |
| 202 icon_str.append(app_window_->GetExtension()->url().spec()); | |
| 203 tab_value->SetString(tabs_constants::kFaviconUrlKey, icon_str); | |
| 204 | |
| 205 return tab_value; | |
| 206 } | |
| 207 | |
| 208 bool AppWindowController::CanClose(Reason* reason) const { | |
| 209 return true; | |
| 210 } | |
| 211 | |
| 212 void AppWindowController::SetFullscreenMode(bool is_fullscreen, | |
| 213 const GURL& extension_url) const { | |
| 214 // TODO(llandwerlin): should we prevent changes in fullscreen mode | |
| 215 // when the fullscreen state is FULLSCREEN_TYPE_FORCED? | |
| 216 app_window_->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, | |
| 217 is_fullscreen); | |
| 218 } | |
| 219 | |
| 220 Browser* AppWindowController::GetBrowser() const { | |
| 221 return nullptr; | |
| 222 } | |
| 223 | |
| 224 bool AppWindowController::IsVisibleToExtension( | |
| 225 const Extension* extension) const { | |
| 226 if (extension->permissions_data()->HasAPIPermission( | |
| 227 APIPermission::kWindowsGlobal)) | |
| 228 return true; | |
| 229 return extension->id() == app_window_->extension_id(); | |
| 230 } | |
| 231 | |
| 232 } // namespace extensions | |
| OLD | NEW |