| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/tabs/tabs_api.h" | 5 #include "chrome/browser/extensions/api/tabs/tabs_api.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 namespace extensions { | 109 namespace extensions { |
| 110 | 110 |
| 111 namespace windows = api::windows; | 111 namespace windows = api::windows; |
| 112 namespace keys = tabs_constants; | 112 namespace keys = tabs_constants; |
| 113 namespace tabs = api::tabs; | 113 namespace tabs = api::tabs; |
| 114 | 114 |
| 115 using api::extension_types::InjectDetails; | 115 using api::extension_types::InjectDetails; |
| 116 | 116 |
| 117 namespace { | 117 namespace { |
| 118 | 118 |
| 119 template <typename T> |
| 120 class ApiParameterExtractor { |
| 121 public: |
| 122 explicit ApiParameterExtractor(T* params) : params_(params) {} |
| 123 ~ApiParameterExtractor() {} |
| 124 |
| 125 bool populate_tabs() { |
| 126 if (params_->get_info.get() && params_->get_info->populate.get()) |
| 127 return *params_->get_info->populate; |
| 128 return false; |
| 129 } |
| 130 |
| 131 WindowTypeFilter type_filters() { |
| 132 if (params_->get_info.get() && params_->get_info->window_types.get()) |
| 133 return windows_util::WindowTypeFilterFromWindowTypes( |
| 134 *params_->get_info->window_types.get()); |
| 135 return WindowController::GetDefaultWindowFilter(); |
| 136 } |
| 137 |
| 138 private: |
| 139 T* params_; |
| 140 }; |
| 141 |
| 119 bool GetBrowserFromWindowID(ChromeUIThreadExtensionFunction* function, | 142 bool GetBrowserFromWindowID(ChromeUIThreadExtensionFunction* function, |
| 120 int window_id, | 143 int window_id, |
| 121 Browser** browser) { | 144 Browser** browser) { |
| 122 std::string error; | 145 std::string error; |
| 123 Browser* result; | 146 Browser* result; |
| 124 result = | 147 result = |
| 125 ExtensionTabUtil::GetBrowserFromWindowID(function, window_id, &error); | 148 ExtensionTabUtil::GetBrowserFromWindowID(function, window_id, &error); |
| 126 if (!result) { | 149 if (!result) { |
| 127 function->SetError(error); | 150 function->SetError(error); |
| 128 return false; | 151 return false; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 break; | 281 break; |
| 259 } | 282 } |
| 260 } | 283 } |
| 261 | 284 |
| 262 // Windows --------------------------------------------------------------------- | 285 // Windows --------------------------------------------------------------------- |
| 263 | 286 |
| 264 bool WindowsGetFunction::RunSync() { | 287 bool WindowsGetFunction::RunSync() { |
| 265 scoped_ptr<windows::Get::Params> params(windows::Get::Params::Create(*args_)); | 288 scoped_ptr<windows::Get::Params> params(windows::Get::Params::Create(*args_)); |
| 266 EXTENSION_FUNCTION_VALIDATE(params.get()); | 289 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 267 | 290 |
| 268 bool populate_tabs = false; | 291 ApiParameterExtractor<windows::Get::Params> extractor(params.get()); |
| 269 if (params->get_info.get() && params->get_info->populate.get()) | |
| 270 populate_tabs = *params->get_info->populate; | |
| 271 | |
| 272 WindowController* controller; | 292 WindowController* controller; |
| 273 if (!windows_util::GetWindowFromWindowID(this, | 293 if (!windows_util::GetWindowFromWindowID( |
| 274 params->window_id, | 294 this, params->window_id, extractor.type_filters(), &controller)) { |
| 275 &controller)) { | |
| 276 return false; | 295 return false; |
| 277 } | 296 } |
| 278 | 297 |
| 279 if (populate_tabs) | 298 if (extractor.populate_tabs()) |
| 280 SetResult(controller->CreateWindowValueWithTabs(extension())); | 299 SetResult(controller->CreateWindowValueWithTabs(extension())); |
| 281 else | 300 else |
| 282 SetResult(controller->CreateWindowValue()); | 301 SetResult(controller->CreateWindowValue()); |
| 283 return true; | 302 return true; |
| 284 } | 303 } |
| 285 | 304 |
| 286 bool WindowsGetCurrentFunction::RunSync() { | 305 bool WindowsGetCurrentFunction::RunSync() { |
| 287 scoped_ptr<windows::GetCurrent::Params> params( | 306 scoped_ptr<windows::GetCurrent::Params> params( |
| 288 windows::GetCurrent::Params::Create(*args_)); | 307 windows::GetCurrent::Params::Create(*args_)); |
| 289 EXTENSION_FUNCTION_VALIDATE(params.get()); | 308 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 290 | 309 |
| 291 bool populate_tabs = false; | 310 ApiParameterExtractor<windows::GetCurrent::Params> extractor(params.get()); |
| 292 if (params->get_info.get() && params->get_info->populate.get()) | |
| 293 populate_tabs = *params->get_info->populate; | |
| 294 | |
| 295 WindowController* controller; | 311 WindowController* controller; |
| 296 if (!windows_util::GetWindowFromWindowID(this, | 312 if (!windows_util::GetWindowFromWindowID( |
| 297 extension_misc::kCurrentWindowId, | 313 this, extension_misc::kCurrentWindowId, extractor.type_filters(), |
| 298 &controller)) { | 314 &controller)) { |
| 299 return false; | 315 return false; |
| 300 } | 316 } |
| 301 if (populate_tabs) | 317 if (extractor.populate_tabs()) |
| 302 SetResult(controller->CreateWindowValueWithTabs(extension())); | 318 SetResult(controller->CreateWindowValueWithTabs(extension())); |
| 303 else | 319 else |
| 304 SetResult(controller->CreateWindowValue()); | 320 SetResult(controller->CreateWindowValue()); |
| 305 return true; | 321 return true; |
| 306 } | 322 } |
| 307 | 323 |
| 308 bool WindowsGetLastFocusedFunction::RunSync() { | 324 bool WindowsGetLastFocusedFunction::RunSync() { |
| 309 scoped_ptr<windows::GetLastFocused::Params> params( | 325 scoped_ptr<windows::GetLastFocused::Params> params( |
| 310 windows::GetLastFocused::Params::Create(*args_)); | 326 windows::GetLastFocused::Params::Create(*args_)); |
| 311 EXTENSION_FUNCTION_VALIDATE(params.get()); | 327 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 312 | 328 |
| 313 bool populate_tabs = false; | 329 ApiParameterExtractor<windows::GetLastFocused::Params> extractor( |
| 314 if (params->get_info.get() && params->get_info->populate.get()) | 330 params.get()); |
| 315 populate_tabs = *params->get_info->populate; | 331 // The WindowControllerList should contain a list of application, |
| 316 | 332 // browser and devtools windows. |
| 317 // Note: currently this returns the last active browser. If we decide to | 333 WindowController* controller = nullptr; |
| 318 // include other window types (e.g. panels), we will need to add logic to | 334 for (auto iter : WindowControllerList::GetInstance()->windows()) { |
| 319 // WindowControllerList that mirrors the active behavior of BrowserList. | 335 if (windows_util::CanOperateOnWindow(this, iter, |
| 320 Browser* browser = chrome::FindAnyBrowser( | 336 extractor.type_filters())) { |
| 321 GetProfile(), include_incognito(), chrome::GetActiveDesktop()); | 337 controller = iter; |
| 322 if (!browser || !browser->window()) { | 338 if (controller->window()->IsActive()) |
| 339 break; // Use focused window. |
| 340 } |
| 341 } |
| 342 if (!controller) { |
| 323 error_ = keys::kNoLastFocusedWindowError; | 343 error_ = keys::kNoLastFocusedWindowError; |
| 324 return false; | 344 return false; |
| 325 } | 345 } |
| 326 WindowController* controller = | 346 if (extractor.populate_tabs()) |
| 327 browser->extension_window_controller(); | |
| 328 if (populate_tabs) | |
| 329 SetResult(controller->CreateWindowValueWithTabs(extension())); | 347 SetResult(controller->CreateWindowValueWithTabs(extension())); |
| 330 else | 348 else |
| 331 SetResult(controller->CreateWindowValue()); | 349 SetResult(controller->CreateWindowValue()); |
| 332 return true; | 350 return true; |
| 333 } | 351 } |
| 334 | 352 |
| 335 bool WindowsGetAllFunction::RunSync() { | 353 bool WindowsGetAllFunction::RunSync() { |
| 336 scoped_ptr<windows::GetAll::Params> params( | 354 scoped_ptr<windows::GetAll::Params> params( |
| 337 windows::GetAll::Params::Create(*args_)); | 355 windows::GetAll::Params::Create(*args_)); |
| 338 EXTENSION_FUNCTION_VALIDATE(params.get()); | 356 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 339 | 357 |
| 340 bool populate_tabs = false; | 358 ApiParameterExtractor<windows::GetAll::Params> extractor(params.get()); |
| 341 if (params->get_info.get() && params->get_info->populate.get()) | |
| 342 populate_tabs = *params->get_info->populate; | |
| 343 | |
| 344 base::ListValue* window_list = new base::ListValue(); | 359 base::ListValue* window_list = new base::ListValue(); |
| 345 const WindowControllerList::ControllerList& windows = | 360 const WindowControllerList::ControllerList& windows = |
| 346 WindowControllerList::GetInstance()->windows(); | 361 WindowControllerList::GetInstance()->windows(); |
| 347 for (WindowControllerList::ControllerList::const_iterator iter = | 362 for (WindowControllerList::ControllerList::const_iterator iter = |
| 348 windows.begin(); | 363 windows.begin(); |
| 349 iter != windows.end(); ++iter) { | 364 iter != windows.end(); ++iter) { |
| 350 if (!windows_util::CanOperateOnWindow(this, *iter)) | 365 if (!windows_util::CanOperateOnWindow(this, *iter, |
| 366 extractor.type_filters())) |
| 351 continue; | 367 continue; |
| 352 if (populate_tabs) | 368 if (extractor.populate_tabs()) |
| 353 window_list->Append((*iter)->CreateWindowValueWithTabs(extension())); | 369 window_list->Append((*iter)->CreateWindowValueWithTabs(extension())); |
| 354 else | 370 else |
| 355 window_list->Append((*iter)->CreateWindowValue()); | 371 window_list->Append((*iter)->CreateWindowValue()); |
| 356 } | 372 } |
| 357 SetResult(window_list); | 373 SetResult(window_list); |
| 358 return true; | 374 return true; |
| 359 } | 375 } |
| 360 | 376 |
| 361 bool WindowsCreateFunction::ShouldOpenIncognitoWindow( | 377 bool WindowsCreateFunction::ShouldOpenIncognitoWindow( |
| 362 const windows::Create::Params::CreateData* create_data, | 378 const windows::Create::Params::CreateData* create_data, |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 | 702 |
| 687 return true; | 703 return true; |
| 688 } | 704 } |
| 689 | 705 |
| 690 bool WindowsUpdateFunction::RunSync() { | 706 bool WindowsUpdateFunction::RunSync() { |
| 691 scoped_ptr<windows::Update::Params> params( | 707 scoped_ptr<windows::Update::Params> params( |
| 692 windows::Update::Params::Create(*args_)); | 708 windows::Update::Params::Create(*args_)); |
| 693 EXTENSION_FUNCTION_VALIDATE(params); | 709 EXTENSION_FUNCTION_VALIDATE(params); |
| 694 | 710 |
| 695 WindowController* controller; | 711 WindowController* controller; |
| 696 if (!windows_util::GetWindowFromWindowID(this, params->window_id, | 712 if (!windows_util::GetWindowFromWindowID( |
| 697 &controller)) | 713 this, params->window_id, WindowController::GetAllWindowFilter(), |
| 714 &controller)) { |
| 698 return false; | 715 return false; |
| 716 } |
| 699 | 717 |
| 700 ui::WindowShowState show_state = | 718 ui::WindowShowState show_state = |
| 701 ConvertToWindowShowState(params->update_info.state); | 719 ConvertToWindowShowState(params->update_info.state); |
| 702 | 720 |
| 703 if (show_state != ui::SHOW_STATE_FULLSCREEN && | 721 if (show_state != ui::SHOW_STATE_FULLSCREEN && |
| 704 show_state != ui::SHOW_STATE_DEFAULT) | 722 show_state != ui::SHOW_STATE_DEFAULT) |
| 705 controller->SetFullscreenMode(false, extension()->url()); | 723 controller->SetFullscreenMode(false, extension()->url()); |
| 706 | 724 |
| 707 switch (show_state) { | 725 switch (show_state) { |
| 708 case ui::SHOW_STATE_MINIMIZED: | 726 case ui::SHOW_STATE_MINIMIZED: |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 | 806 |
| 789 return true; | 807 return true; |
| 790 } | 808 } |
| 791 | 809 |
| 792 bool WindowsRemoveFunction::RunSync() { | 810 bool WindowsRemoveFunction::RunSync() { |
| 793 scoped_ptr<windows::Remove::Params> params( | 811 scoped_ptr<windows::Remove::Params> params( |
| 794 windows::Remove::Params::Create(*args_)); | 812 windows::Remove::Params::Create(*args_)); |
| 795 EXTENSION_FUNCTION_VALIDATE(params); | 813 EXTENSION_FUNCTION_VALIDATE(params); |
| 796 | 814 |
| 797 WindowController* controller; | 815 WindowController* controller; |
| 798 if (!windows_util::GetWindowFromWindowID(this, params->window_id, | 816 if (!windows_util::GetWindowFromWindowID( |
| 799 &controller)) | 817 this, params->window_id, WindowController::GetDefaultWindowFilter(), |
| 818 &controller)) |
| 800 return false; | 819 return false; |
| 801 | 820 |
| 802 WindowController::Reason reason; | 821 WindowController::Reason reason; |
| 803 if (!controller->CanClose(&reason)) { | 822 if (!controller->CanClose(&reason)) { |
| 804 if (reason == WindowController::REASON_NOT_EDITABLE) | 823 if (reason == WindowController::REASON_NOT_EDITABLE) |
| 805 error_ = keys::kTabStripNotEditableError; | 824 error_ = keys::kTabStripNotEditableError; |
| 806 return false; | 825 return false; |
| 807 } | 826 } |
| 808 controller->window()->Close(); | 827 controller->window()->Close(); |
| 809 return true; | 828 return true; |
| (...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 ZoomModeToZoomSettings(zoom_mode, &zoom_settings); | 2047 ZoomModeToZoomSettings(zoom_mode, &zoom_settings); |
| 2029 zoom_settings.default_zoom_factor.reset(new double( | 2048 zoom_settings.default_zoom_factor.reset(new double( |
| 2030 content::ZoomLevelToZoomFactor(zoom_controller->GetDefaultZoomLevel()))); | 2049 content::ZoomLevelToZoomFactor(zoom_controller->GetDefaultZoomLevel()))); |
| 2031 | 2050 |
| 2032 results_ = api::tabs::GetZoomSettings::Results::Create(zoom_settings); | 2051 results_ = api::tabs::GetZoomSettings::Results::Create(zoom_settings); |
| 2033 SendResponse(true); | 2052 SendResponse(true); |
| 2034 return true; | 2053 return true; |
| 2035 } | 2054 } |
| 2036 | 2055 |
| 2037 } // namespace extensions | 2056 } // namespace extensions |
| OLD | NEW |