Index: chrome/browser/extensions/chrome_extension_function_details.cc |
diff --git a/chrome/browser/extensions/chrome_extension_function_details.cc b/chrome/browser/extensions/chrome_extension_function_details.cc |
index 460f490387a771730df485f6f573cef391c08aae..5d2e480bb9675c45f4c8fa23c66292b3a01e03c5 100644 |
--- a/chrome/browser/extensions/chrome_extension_function_details.cc |
+++ b/chrome/browser/extensions/chrome_extension_function_details.cc |
@@ -4,14 +4,19 @@ |
#include "chrome/browser/extensions/chrome_extension_function_details.h" |
+#include "chrome/browser/extensions/extension_tab_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/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/browser_window.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "components/web_modal/web_contents_modal_dialog_manager.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
+#include "extensions/browser/app_window/app_window.h" |
+#include "extensions/browser/app_window/app_window_registry.h" |
#include "extensions/browser/extension_function.h" |
#include "extensions/browser/extension_function_dispatcher.h" |
@@ -95,3 +100,62 @@ ChromeExtensionFunctionDetails::GetAssociatedWebContents() { |
return NULL; |
return browser->tab_strip_model()->GetActiveWebContents(); |
} |
+ |
+content::WebContents* ChromeExtensionFunctionDetails::GetOriginWebContents() { |
+ WebContents* contents = function_->GetSenderWebContents(); |
+ if (!contents) |
+ return nullptr; |
+ |
+ // Hack: use the existence of a WebContentsModalDialogManager to decide |
+ // whether the sender web contents is visible. |
+ web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
+ web_modal::WebContentsModalDialogManager::FromWebContents(contents); |
+ if (web_contents_modal_dialog_manager) |
+ return contents; |
+ |
+ // If there is no WebContentsModalDialogManager, then this contents is |
+ // probably the background page for an extension or app. |
+ contents = nullptr; |
+ |
+ int source_tab_id = function_->source_tab_id(); |
+ if (source_tab_id != TabStripModel::kNoTab) { |
+ // When the request originated from a background page, but there is no |
+ // app window open, check to see if it originated from a tab and display |
+ // the dialog in that tab. |
+ if (extensions::ExtensionTabUtil::GetTabById( |
+ source_tab_id, GetProfile(), true /* include_incognito */, nullptr, |
+ nullptr, &contents, nullptr)) |
+ return contents; |
+ } |
+ |
+ // Try to find an app window and get its web contents. |
+ const extensions::Extension* extension = function_->extension(); |
+ if (extension) { |
+ extensions::AppWindow* window = |
+ extensions::AppWindowRegistry::Get(GetProfile()) |
+ ->GetCurrentAppWindowForApp(extension->id()); |
+ if (window) |
+ return window->web_contents(); |
+ } |
+ return contents; |
+} |
+ |
+gfx::NativeWindow ChromeExtensionFunctionDetails::GetNativeWindowForUI() { |
+ // Try to use WindowControllerList first because WebContents's |
+ // GetTopLevelNativeWindow() can't return the top level window when the tab |
+ // is not focused. |
+ WindowController* controller = |
+ extensions::WindowControllerList::GetInstance()->CurrentWindowForFunction( |
+ function_); |
+ if (controller) |
+ return controller->window()->GetNativeWindow(); |
+ |
+ // CurrentWindowForFunction() can't find app's window. |
+ WebContents* contents = GetOriginWebContents(); |
+ if (contents) |
+ return contents->GetTopLevelNativeWindow(); |
+ |
+ Browser* browser = |
+ chrome::FindBrowserWithProfile(GetProfile(), chrome::GetActiveDesktop()); |
+ return browser->window()->GetNativeWindow(); |
+} |