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 WindowController::TypeFilter type_filters() { |
| 132 if (params_->get_info.get() && params_->get_info->window_types.get()) |
| 133 return WindowController::GetFilterFromWindowTypes( |
| 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 |