Chromium Code Reviews| Index: chrome/browser/extensions/api/media_galleries/media_galleries_api.cc |
| =================================================================== |
| --- chrome/browser/extensions/api/media_galleries/media_galleries_api.cc (revision 246091) |
| +++ chrome/browser/extensions/api/media_galleries/media_galleries_api.cc (working copy) |
| @@ -19,8 +19,10 @@ |
| #include "base/values.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| +#include "chrome/browser/extensions/api/messaging/message_service.h" |
| #include "chrome/browser/extensions/blob_reader.h" |
| #include "chrome/browser/extensions/extension_prefs.h" |
| +#include "chrome/browser/extensions/extension_tab_util.h" |
| #include "chrome/browser/media_galleries/media_file_system_registry.h" |
| #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" |
| #include "chrome/browser/media_galleries/media_galleries_histograms.h" |
| @@ -403,17 +405,39 @@ |
| bool MediaGalleriesAddUserSelectedFolderFunction::RunImpl() { |
| media_galleries::UsageCount(media_galleries::ADD_USER_SELECTED_FOLDER); |
| + |
| + // Need to do this before OnPreferencesInit() because OnPreferencesInit() can |
| + // be deferred, by which time, extensions::MessageService() no longer knows |
| + // whether this API can access the source tab or not. |
|
not at google - send to devlin
2014/01/23 16:41:59
I'm being dense and can't follow why this (and the
Lei Zhang
2014/01/23 20:53:12
Yes, I'm being paranoid, but if you say we don't n
not at google - send to devlin
2014/01/23 21:07:43
Thanks for being paranoid. The bug, if it can be c
|
| + bool can_access_source_tab = false; |
| + if (source_tab_id() >= 0) { |
| + Profile* profile = GetProfile(); |
| + can_access_source_tab = |
| + extensions::MessageService::Get(profile)->CanPlatformAppAccessTab( |
| + GetExtension()->id(), source_tab_id()); |
| + } |
| return Setup(GetProfile(), &error_, base::Bind( |
| - &MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit, this)); |
| + &MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit, |
| + this, |
| + can_access_source_tab)); |
| } |
| -void MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit() { |
| +void MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit( |
| + bool can_access_source_tab) { |
| Profile* profile = GetProfile(); |
| const std::string& app_id = GetExtension()->id(); |
| WebContents* contents = GetWebContents(render_view_host(), profile, app_id); |
| if (!contents) { |
| - SendResponse(false); |
| - return; |
| + bool found_tab = false; |
| + if (can_access_source_tab) { |
| + found_tab = extensions::ExtensionTabUtil::GetTabById( |
| + source_tab_id(), profile, profile->IsOffTheRecord(), |
| + NULL, NULL, &contents, NULL); |
| + } |
| + if (!found_tab || !contents) { |
| + SendResponse(false); |
| + return; |
| + } |
| } |
| if (!user_gesture()) { |