summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authornkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-13 06:42:38 +0000
committernkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-13 06:42:38 +0000
commitc04ec03c76f5d6f86605103d98f1608b59c8cc7f (patch)
tree84313233f04fd533f80d94886c2c6a550e055cdb /chrome/browser
parent1229f0b556f09ee6997684d5e6f799cf15228bb4 (diff)
downloadchromium_src-c04ec03c76f5d6f86605103d98f1608b59c8cc7f.zip
chromium_src-c04ec03c76f5d6f86605103d98f1608b59c8cc7f.tar.gz
chromium_src-c04ec03c76f5d6f86605103d98f1608b59c8cc7f.tar.bz2
Fix crash when opening "Select certificate file" in OOBE.
Pass default profile and correct top window in OOBE. BUG=http://crosbug.com/2978 TEST=On welcome screen select encrypted 802.1X network and open "select certificate" dialog. It should open withot crash. Review URL: http://codereview.chromium.org/2053001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47125 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/chromeos/frame/browser_view.cc4
-rw-r--r--chrome/browser/chromeos/frame/browser_view.h1
-rw-r--r--chrome/browser/chromeos/login/background_view.cc4
-rw-r--r--chrome/browser/chromeos/login/background_view.h1
-rw-r--r--chrome/browser/chromeos/login/network_screen.cc1
-rw-r--r--chrome/browser/chromeos/options/network_config_view.cc19
-rw-r--r--chrome/browser/chromeos/options/network_config_view.h14
-rw-r--r--chrome/browser/chromeos/options/wifi_config_view.cc7
-rw-r--r--chrome/browser/chromeos/status/network_menu_button.cc5
-rw-r--r--chrome/browser/chromeos/status/status_area_host.h3
-rw-r--r--chrome/browser/shell_dialogs.h3
-rw-r--r--chrome/browser/views/browser_dialogs.h2
-rw-r--r--chrome/browser/views/frame/browser_view.cc2
-rw-r--r--chrome/browser/views/html_dialog_view.cc4
-rw-r--r--chrome/browser/views/select_file_dialog.cc41
15 files changed, 98 insertions, 13 deletions
diff --git a/chrome/browser/chromeos/frame/browser_view.cc b/chrome/browser/chromeos/frame/browser_view.cc
index 30b6449..354676f 100644
--- a/chrome/browser/chromeos/frame/browser_view.cc
+++ b/chrome/browser/chromeos/frame/browser_view.cc
@@ -513,6 +513,10 @@ bool BrowserView::IsButtonVisible(const views::View* button_view) const {
return true;
}
+bool BrowserView::IsBrowserMode() const {
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////////////
// BrowserView public:
diff --git a/chrome/browser/chromeos/frame/browser_view.h b/chrome/browser/chromeos/frame/browser_view.h
index 647211f..87dc59b 100644
--- a/chrome/browser/chromeos/frame/browser_view.h
+++ b/chrome/browser/chromeos/frame/browser_view.h
@@ -82,6 +82,7 @@ class BrowserView : public ::BrowserView,
const views::View* button_view) const;
virtual void OpenButtonOptions(const views::View* button_view) const;
virtual bool IsButtonVisible(const views::View* button_view) const;
+ virtual bool IsBrowserMode() const;
// Shows the compact location bar under the selected tab.
void ShowCompactLocationBarUnderSelectedTab(bool select_all);
diff --git a/chrome/browser/chromeos/login/background_view.cc b/chrome/browser/chromeos/login/background_view.cc
index 9ae8845..c70d7ee 100644
--- a/chrome/browser/chromeos/login/background_view.cc
+++ b/chrome/browser/chromeos/login/background_view.cc
@@ -141,6 +141,10 @@ bool BackgroundView::IsButtonVisible(const views::View* button_view) const {
return true;
}
+bool BackgroundView::IsBrowserMode() const {
+ return false;
+}
+
void BackgroundView::LocaleChanged() {
Layout();
SchedulePaint();
diff --git a/chrome/browser/chromeos/login/background_view.h b/chrome/browser/chromeos/login/background_view.h
index df8ce55..135129d 100644
--- a/chrome/browser/chromeos/login/background_view.h
+++ b/chrome/browser/chromeos/login/background_view.h
@@ -51,6 +51,7 @@ class BackgroundView : public views::View, public StatusAreaHost {
const views::View* button_view) const;
virtual void OpenButtonOptions(const views::View* button_view) const;
virtual bool IsButtonVisible(const views::View* button_view) const;
+ virtual bool IsBrowserMode() const;
private:
// Creates and adds the status_area.
diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc
index 6d80fdd..4e50e6e 100644
--- a/chrome/browser/chromeos/login/network_screen.cc
+++ b/chrome/browser/chromeos/login/network_screen.cc
@@ -203,6 +203,7 @@ void NetworkScreen::NotifyOnOffline() {
void NetworkScreen::OpenPasswordDialog(WifiNetwork network) {
NetworkConfigView* dialog = new NetworkConfigView(network, true);
+ dialog->set_browser_mode(false);
views::Window* window = views::Window::CreateChromeWindow(
view()->GetNativeWindow(), gfx::Rect(), dialog);
window->SetIsAlwaysOnTop(true);
diff --git a/chrome/browser/chromeos/options/network_config_view.cc b/chrome/browser/chromeos/options/network_config_view.cc
index b48a60a..f5aa05e 100644
--- a/chrome/browser/chromeos/options/network_config_view.cc
+++ b/chrome/browser/chromeos/options/network_config_view.cc
@@ -13,19 +13,24 @@
#include "grit/locale_settings.h"
#include "views/grid_layout.h"
#include "views/standard_layout.h"
+#include "views/widget/widget_gtk.h"
#include "views/window/window.h"
+using views::WidgetGtk;
+
namespace chromeos {
NetworkConfigView::NetworkConfigView(EthernetNetwork ethernet)
- : flags_(FLAG_ETHERNET | FLAG_SHOW_IPCONFIG),
+ : browser_mode_(true),
+ flags_(FLAG_ETHERNET | FLAG_SHOW_IPCONFIG),
ethernet_(ethernet),
wificonfig_view_(NULL),
ipconfig_view_(NULL) {
}
NetworkConfigView::NetworkConfigView(WifiNetwork wifi, bool login_only)
- : flags_(FLAG_WIFI),
+ : browser_mode_(true),
+ flags_(FLAG_WIFI),
wifi_(wifi),
wificonfig_view_(NULL),
ipconfig_view_(NULL) {
@@ -36,18 +41,24 @@ NetworkConfigView::NetworkConfigView(WifiNetwork wifi, bool login_only)
}
NetworkConfigView::NetworkConfigView(CellularNetwork cellular)
- : flags_(FLAG_CELLULAR | FLAG_SHOW_IPCONFIG),
+ : browser_mode_(true),
+ flags_(FLAG_CELLULAR | FLAG_SHOW_IPCONFIG),
cellular_(cellular),
wificonfig_view_(NULL),
ipconfig_view_(NULL) {
}
NetworkConfigView::NetworkConfigView()
- : flags_(FLAG_WIFI | FLAG_LOGIN_ONLY | FLAG_OTHER_NETWORK),
+ : browser_mode_(true),
+ flags_(FLAG_WIFI | FLAG_LOGIN_ONLY | FLAG_OTHER_NETWORK),
wificonfig_view_(NULL),
ipconfig_view_(NULL) {
}
+gfx::NativeWindow NetworkConfigView::GetNativeWindow() const {
+ return GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView());
+}
+
std::wstring NetworkConfigView::GetDialogButtonLabel(
MessageBoxFlags::DialogButton button) const {
if (button == MessageBoxFlags::DIALOGBUTTON_OK) {
diff --git a/chrome/browser/chromeos/options/network_config_view.h b/chrome/browser/chromeos/options/network_config_view.h
index 65704bd..3b42abd 100644
--- a/chrome/browser/chromeos/options/network_config_view.h
+++ b/chrome/browser/chromeos/options/network_config_view.h
@@ -38,6 +38,9 @@ class NetworkConfigView : public views::View,
explicit NetworkConfigView();
virtual ~NetworkConfigView() {}
+ // Returns corresponding native window.
+ gfx::NativeWindow GetNativeWindow() const;
+
// views::DialogDelegate methods.
virtual std::wstring GetDialogButtonLabel(
MessageBoxFlags::DialogButton button) const;
@@ -59,6 +62,14 @@ class NetworkConfigView : public views::View,
// Sets the focus on the login tab's first textfield.
void SetLoginTextfieldFocus();
+ // Getter/setter for browser mode.
+ void set_browser_mode(bool value) {
+ browser_mode_ = value;
+ }
+ bool is_browser_mode() const {
+ return browser_mode_;
+ }
+
protected:
// views::View overrides:
virtual void Layout();
@@ -80,6 +91,9 @@ class NetworkConfigView : public views::View,
// Initializes UI.
void Init();
+ // True when opening in browser, otherwise in OOBE/login mode.
+ bool browser_mode_;
+
views::TabbedPane* tabs_;
// NetworkConfigFlags to specify which UIs to show.
diff --git a/chrome/browser/chromeos/options/wifi_config_view.cc b/chrome/browser/chromeos/options/wifi_config_view.cc
index e360973..2ca3fc3 100644
--- a/chrome/browser/chromeos/options/wifi_config_view.cc
+++ b/chrome/browser/chromeos/options/wifi_config_view.cc
@@ -87,9 +87,14 @@ void WifiConfigView::ButtonPressed(views::Button* sender,
passphrase_textfield_->SetPassword(!passphrase_textfield_->IsPassword());
} else if (sender == certificate_browse_button_) {
select_file_dialog_ = SelectFileDialog::Create(this);
+ select_file_dialog_->set_browser_mode(parent_->is_browser_mode());
select_file_dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE,
string16(), FilePath(), NULL, 0,
- std::string(), NULL, NULL);
+ std::string(),
+ parent_->is_browser_mode() ?
+ NULL :
+ parent_->GetNativeWindow(),
+ NULL);
} else {
NOTREACHED();
}
diff --git a/chrome/browser/chromeos/status/network_menu_button.cc b/chrome/browser/chromeos/status/network_menu_button.cc
index aa9b046..09c84f3 100644
--- a/chrome/browser/chromeos/status/network_menu_button.cc
+++ b/chrome/browser/chromeos/status/network_menu_button.cc
@@ -100,6 +100,7 @@ void NetworkMenuButton::ActivatedAt(int index) {
cros->EnableOfflineMode(!cros->offline_mode());
} else if (flags & FLAG_OTHER_NETWORK) {
NetworkConfigView* view = new NetworkConfigView();
+ view->set_browser_mode(host_->IsBrowserMode());
views::Window* window = views::Window::CreateChromeWindow(
host_->GetNativeWindow(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
@@ -108,6 +109,7 @@ void NetworkMenuButton::ActivatedAt(int index) {
} else if (flags & FLAG_ETHERNET) {
if (cros->ethernet_connected()) {
NetworkConfigView* view = new NetworkConfigView(cros->ethernet_network());
+ view->set_browser_mode(host_->IsBrowserMode());
views::Window* window = views::Window::CreateChromeWindow(
host_->GetNativeWindow(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
@@ -121,6 +123,7 @@ void NetworkMenuButton::ActivatedAt(int index) {
if (wifi.name() == cros->wifi_name()) {
if (cros->wifi_connected()) {
NetworkConfigView* view = new NetworkConfigView(wifi, false);
+ view->set_browser_mode(host_->IsBrowserMode());
views::Window* window = views::Window::CreateChromeWindow(
host_->GetNativeWindow(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
@@ -133,6 +136,7 @@ void NetworkMenuButton::ActivatedAt(int index) {
cros->ConnectToWifiNetwork(wifi, string16(), string16(), string16());
} else {
NetworkConfigView* view = new NetworkConfigView(wifi, true);
+ view->set_browser_mode(host_->IsBrowserMode());
views::Window* window = views::Window::CreateChromeWindow(
host_->GetNativeWindow(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
@@ -148,6 +152,7 @@ void NetworkMenuButton::ActivatedAt(int index) {
if (cellular.name() == cros->cellular_name()) {
if (cros->cellular_connected()) {
NetworkConfigView* view = new NetworkConfigView(cellular);
+ view->set_browser_mode(host_->IsBrowserMode());
views::Window* window = views::Window::CreateChromeWindow(
host_->GetNativeWindow(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
diff --git a/chrome/browser/chromeos/status/status_area_host.h b/chrome/browser/chromeos/status/status_area_host.h
index cc33434..b236e31 100644
--- a/chrome/browser/chromeos/status/status_area_host.h
+++ b/chrome/browser/chromeos/status/status_area_host.h
@@ -37,6 +37,9 @@ class StatusAreaHost {
// Indicates if the button specified should be visible at the moment.
virtual bool IsButtonVisible(const views::View* button_view) const = 0;
+ // True if status area hosted in browser. Otherwise it's OOBE/login state.
+ virtual bool IsBrowserMode() const = 0;
+
protected:
virtual ~StatusAreaHost() {}
};
diff --git a/chrome/browser/shell_dialogs.h b/chrome/browser/shell_dialogs.h
index 18400f6..878424e2 100644
--- a/chrome/browser/shell_dialogs.h
+++ b/chrome/browser/shell_dialogs.h
@@ -116,6 +116,9 @@ class SelectFileDialog
gfx::NativeWindow owning_window,
void* params) = 0;
+ // browser_mode is true when running inside the browser.
+ virtual void set_browser_mode(bool value) {}
+
protected:
friend class base::RefCountedThreadSafe<SelectFileDialog>;
diff --git a/chrome/browser/views/browser_dialogs.h b/chrome/browser/views/browser_dialogs.h
index 6997a0a..31604c5 100644
--- a/chrome/browser/views/browser_dialogs.h
+++ b/chrome/browser/views/browser_dialogs.h
@@ -72,7 +72,7 @@ void ShowAboutChromeView(gfx::NativeWindow parent,
Profile* profile);
// Shows an HTML dialog. See HtmlDialogView.
-void ShowHtmlDialogView(gfx::NativeWindow parent, Browser* browser,
+void ShowHtmlDialogView(gfx::NativeWindow parent, Profile* profile,
HtmlDialogUIDelegate* delegate);
// Creates and returns a find bar for the given browser window. See FindBarWin.
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index db95498..59f013c 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -1067,7 +1067,7 @@ void BrowserView::ShowHTMLDialog(HtmlDialogUIDelegate* delegate,
// Default to using our window as the parent if the argument is not specified.
gfx::NativeWindow parent = parent_window ? parent_window
: GetNativeHandle();
- browser::ShowHtmlDialogView(parent, browser_.get(), delegate);
+ browser::ShowHtmlDialogView(parent, browser_.get()->profile(), delegate);
}
void BrowserView::ShowCreateShortcutsDialog(TabContents* tab_contents) {
diff --git a/chrome/browser/views/html_dialog_view.cc b/chrome/browser/views/html_dialog_view.cc
index ccf1423..68a2c80 100644
--- a/chrome/browser/views/html_dialog_view.cc
+++ b/chrome/browser/views/html_dialog_view.cc
@@ -14,10 +14,10 @@
namespace browser {
// Declared in browser_dialogs.h so that others don't need to depend on our .h.
-void ShowHtmlDialogView(gfx::NativeWindow parent, Browser* browser,
+void ShowHtmlDialogView(gfx::NativeWindow parent, Profile* profile,
HtmlDialogUIDelegate* delegate) {
HtmlDialogView* html_view =
- new HtmlDialogView(browser->profile(), delegate);
+ new HtmlDialogView(profile, delegate);
views::Window::CreateChromeWindow(parent, gfx::Rect(), html_view);
html_view->InitDialog();
html_view->window()->Show();
diff --git a/chrome/browser/views/select_file_dialog.cc b/chrome/browser/views/select_file_dialog.cc
index c50c1c1..c8cd839 100644
--- a/chrome/browser/views/select_file_dialog.cc
+++ b/chrome/browser/views/select_file_dialog.cc
@@ -18,12 +18,15 @@
#include "chrome/browser/dom_ui/html_dialog_ui.h"
#include "chrome/browser/shell_dialogs.h"
#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/views/browser_dialogs.h"
#include "chrome/browser/views/html_dialog_view.h"
#include "chrome/common/url_constants.h"
#include "grit/generated_resources.h"
#include "views/window/non_client_view.h"
#include "views/window/window.h"
+#include "chrome/browser/profile_manager.h"
+
namespace {
static const wchar_t* kKeyNamePath = L"path";
@@ -52,6 +55,10 @@ class SelectFileDialogImpl : public SelectFileDialog {
gfx::NativeWindow owning_window,
void* params);
+ virtual void set_browser_mode(bool value) {
+ browser_mode_ = value;
+ }
+
private:
virtual ~SelectFileDialogImpl();
@@ -130,12 +137,19 @@ class SelectFileDialogImpl : public SelectFileDialog {
// Notification from FileBrowseDelegate when file browse UI is dismissed.
void OnDialogClosed(FileBrowseDelegate* delegate, const std::string& json);
+ // Callback method to open HTML
+ void OpenHtmlDialog(gfx::NativeWindow owning_window,
+ FileBrowseDelegate* file_browse_delegate);
+
// The set of all parent windows for which we are currently running dialogs.
std::set<gfx::NativeWindow> parents_;
// The set of all FileBrowseDelegate that we are currently running.
std::set<FileBrowseDelegate*> delegates_;
+ // True when opening in browser, otherwise in OOBE/login mode.
+ bool browser_mode_;
+
// The listener to be notified of selection completion.
Listener* listener_;
@@ -150,7 +164,8 @@ SelectFileDialog* SelectFileDialog::Create(Listener* listener) {
}
SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener)
- : listener_(listener) {
+ : browser_mode_(true),
+ listener_(listener) {
}
SelectFileDialogImpl::~SelectFileDialogImpl() {
@@ -206,9 +221,19 @@ void SelectFileDialogImpl::SelectFile(
default_extension, owning_window, params);
delegates_.insert(file_browse_delegate);
- Browser* browser = BrowserList::GetLastActive();
- DCHECK(browser);
- browser->BrowserShowHtmlDialog(file_browse_delegate, owning_window);
+ if (browser_mode_) {
+ Browser* browser = BrowserList::GetLastActive();
+ DCHECK(browser);
+ browser->BrowserShowHtmlDialog(file_browse_delegate, owning_window);
+ } else {
+ ChromeThread::PostTask(
+ ChromeThread::UI,
+ FROM_HERE,
+ NewRunnableMethod(this,
+ &SelectFileDialogImpl::OpenHtmlDialog,
+ owning_window,
+ file_browse_delegate));
+ }
}
void SelectFileDialogImpl::OnDialogClosed(FileBrowseDelegate* delegate,
@@ -271,6 +296,14 @@ void SelectFileDialogImpl::OnDialogClosed(FileBrowseDelegate* delegate,
delegates_.erase(delegate);
}
+void SelectFileDialogImpl::OpenHtmlDialog(
+ gfx::NativeWindow owning_window,
+ FileBrowseDelegate* file_browse_delegate) {
+ browser::ShowHtmlDialogView(owning_window,
+ ProfileManager::GetDefaultProfile(),
+ file_browse_delegate);
+}
+
SelectFileDialogImpl::FileBrowseDelegate::FileBrowseDelegate(
SelectFileDialogImpl* owner,
Type type,