| 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();
|
| +}
|
|
|