Chromium Code Reviews| Index: chrome/browser/extensions/api/tabs/windows_util.cc |
| diff --git a/chrome/browser/extensions/api/tabs/windows_util.cc b/chrome/browser/extensions/api/tabs/windows_util.cc |
| index 0e2ead5b3e8b9c70018413ae476d90e05c3c2f49..9b2e8c0f3f63fe7883d544516c4360fac23f2f8c 100644 |
| --- a/chrome/browser/extensions/api/tabs/windows_util.cc |
| +++ b/chrome/browser/extensions/api/tabs/windows_util.cc |
| @@ -2,24 +2,77 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <string> |
| +#include <vector> |
| + |
| #include "chrome/browser/extensions/api/tabs/windows_util.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
| #include "chrome/browser/extensions/chrome_extension_function.h" |
| #include "chrome/browser/extensions/chrome_extension_function_details.h" |
| +#include "chrome/browser/extensions/extension_util.h" |
| #include "chrome/browser/extensions/window_controller.h" |
| #include "chrome/browser/extensions/window_controller_list.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/common/extensions/api/windows.h" |
| #include "extensions/browser/extension_function.h" |
| #include "extensions/browser/extension_function_dispatcher.h" |
| #include "extensions/common/constants.h" |
| #include "extensions/common/error_utils.h" |
| +#include "extensions/common/extension.h" |
| + |
| +namespace keys = extensions::tabs_constants; |
| +namespace windows = extensions::api::windows; |
| namespace windows_util { |
| +namespace { |
| + |
| +extensions::WindowTypeFilter CreateTypeFilter( |
| + int length, |
| + const windows::WindowType types[]) { |
| + extensions::WindowTypeFilter filter; |
| + for (int i = 0; i < length; i++) |
| + filter.push_back(types[i]); |
| + return filter; |
| +} |
| + |
| +} // namespace |
| + |
| +const extensions::WindowTypeFilter& GetDefaultWindowTypeFilters() { |
| + static const windows::WindowType types[] = {windows::WINDOW_TYPE_NORMAL, |
| + windows::WINDOW_TYPE_PANEL, |
| + windows::WINDOW_TYPE_POPUP}; |
|
not at google - send to devlin
2015/07/31 21:48:03
There are so few of these, you could model it as a
llandwerlin-old
2015/08/03 10:11:54
Switching to a bitmask.
|
| + CR_DEFINE_STATIC_LOCAL(extensions::WindowTypeFilter, filter, |
| + (CreateTypeFilter(arraysize(types), types))); |
| + return filter; |
| +} |
| + |
| +const extensions::WindowTypeFilter& GetNoWindowTypeFilters() { |
|
not at google - send to devlin
2015/07/31 21:48:03
I don't understand this naming... looks like it ma
llandwerlin-old
2015/08/03 10:11:54
Done.
|
| + static const windows::WindowType types[] = { |
| + windows::WINDOW_TYPE_APP, windows::WINDOW_TYPE_DEVTOOLS, |
| + windows::WINDOW_TYPE_NORMAL, windows::WINDOW_TYPE_PANEL, |
| + windows::WINDOW_TYPE_POPUP}; |
| + CR_DEFINE_STATIC_LOCAL(extensions::WindowTypeFilter, filter, |
| + (CreateTypeFilter(arraysize(types), types))); |
| + return filter; |
| +} |
| + |
| +bool WindowMatchesTypeFilter(const extensions::WindowController* controller, |
| + const extensions::WindowTypeFilter& filters) { |
| + int window_type = extensions::api::windows::ParseWindowType( |
|
not at google - send to devlin
2015/07/31 21:48:03
this should be a WindowType not an int.
llandwerlin-old
2015/08/03 10:11:54
Done.
|
| + controller->GetWindowTypeText()); |
| + for (const auto& iter : filters) { |
| + if (window_type == iter) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| bool GetWindowFromWindowID(UIThreadExtensionFunction* function, |
| int window_id, |
| + const extensions::WindowTypeFilter& type_filter, |
| extensions::WindowController** controller) { |
| if (window_id == extension_misc::kCurrentWindowId) { |
| extensions::WindowController* extension_window_controller = |
| @@ -38,7 +91,8 @@ bool GetWindowFromWindowID(UIThreadExtensionFunction* function, |
| } |
| } else { |
| *controller = extensions::WindowControllerList::GetInstance() |
| - ->FindWindowForFunctionById(function, window_id); |
| + ->FindWindowForFunctionByIdWithFilter(function, window_id, |
| + type_filter); |
| if (!(*controller)) { |
| function->SetError(extensions::ErrorUtils::FormatErrorMessage( |
| extensions::tabs_constants::kWindowNotFoundError, |
| @@ -49,12 +103,30 @@ bool GetWindowFromWindowID(UIThreadExtensionFunction* function, |
| return true; |
| } |
| +bool ExtensionCanOperateOnWindow( |
| + const extensions::Extension* extension, |
| + content::BrowserContext* browser_context, |
| + const extensions::WindowController* controller, |
| + const extensions::WindowTypeFilter& type_filter) { |
| + if (!WindowMatchesTypeFilter(controller, type_filter)) |
| + return false; |
| + |
| + if (browser_context == controller->profile()) |
| + return true; |
| + |
| + if (!extensions::util::CanCrossIncognito(extension, browser_context)) |
|
not at google - send to devlin
2015/07/31 21:48:03
The other implementation uses function->include_in
llandwerlin-old
2015/08/03 10:11:54
It looks like the remaining of a previous iteratio
|
| + return false; |
| + |
| + Profile* profile = Profile::FromBrowserContext(browser_context); |
| + return profile->HasOffTheRecordProfile() && |
| + profile->GetOffTheRecordProfile() == controller->profile(); |
| +} |
| + |
| bool CanOperateOnWindow(const UIThreadExtensionFunction* function, |
| - const extensions::WindowController* controller) { |
| - if (function->extension() != NULL && |
| - !controller->IsVisibleToExtension(function->extension())) { |
| + const extensions::WindowController* controller, |
| + const extensions::WindowTypeFilter& type_filter) { |
| + if (!WindowMatchesTypeFilter(controller, type_filter)) |
| return false; |
| - } |
| if (function->browser_context() == controller->profile()) |
| return true; |