Fix inability to open extensions option page from incognito window
Fixed the case wherein an extensions option page fails to open from an
incognito window when no regular (non-OTR) windows are present.
BUG=648779
Review-Url: https://codereview.chromium.org/2687603002
Cr-Commit-Position: refs/heads/master@{#451801}
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index 163ebfb5..9e28e8c 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -623,15 +623,35 @@
return NULL;
}
+bool ExtensionTabUtil::OpenOptionsPageFromAPI(
+ const Extension* extension,
+ content::BrowserContext* browser_context) {
+ if (!OptionsPageInfo::HasOptionsPage(extension))
+ return false;
+ Profile* profile = Profile::FromBrowserContext(browser_context);
+ // This version of OpenOptionsPage() is only called when the extension
+ // initiated the command via chrome.runtime.openOptionsPage. For a spanning
+ // mode extension, this API could only be called from a regular profile, since
+ // that's the only place it's running.
+ DCHECK(!profile->IsOffTheRecord() || IncognitoInfo::IsSplitMode(extension));
+ Browser* browser = chrome::FindBrowserWithProfile(profile);
+ if (!browser)
+ browser = new Browser(Browser::CreateParams(profile));
+ return extensions::ExtensionTabUtil::OpenOptionsPage(extension, browser);
+}
+
bool ExtensionTabUtil::OpenOptionsPage(const Extension* extension,
Browser* browser) {
if (!OptionsPageInfo::HasOptionsPage(extension))
return false;
- // Force the options page to open in non-OTR window, because it won't be
- // able to save settings from OTR.
+ // Force the options page to open in non-OTR window if the extension is not
+ // running in split mode, because it won't be able to save settings from OTR.
+ // This version of OpenOptionsPage() can be called from an OTR window via e.g.
+ // the action menu, since that's not initiated by the extension.
std::unique_ptr<chrome::ScopedTabbedBrowserDisplayer> displayer;
- if (browser->profile()->IsOffTheRecord()) {
+ if (browser->profile()->IsOffTheRecord() &&
+ !IncognitoInfo::IsSplitMode(extension)) {
displayer.reset(new chrome::ScopedTabbedBrowserDisplayer(
browser->profile()->GetOriginalProfile()));
browser = displayer->browser();