diff options
author | nkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 06:42:38 +0000 |
---|---|---|
committer | nkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 06:42:38 +0000 |
commit | c04ec03c76f5d6f86605103d98f1608b59c8cc7f (patch) | |
tree | 84313233f04fd533f80d94886c2c6a550e055cdb /chrome/browser | |
parent | 1229f0b556f09ee6997684d5e6f799cf15228bb4 (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/frame/browser_view.h | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/background_view.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/background_view.h | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_screen.cc | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/options/network_config_view.cc | 19 | ||||
-rw-r--r-- | chrome/browser/chromeos/options/network_config_view.h | 14 | ||||
-rw-r--r-- | chrome/browser/chromeos/options/wifi_config_view.cc | 7 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu_button.cc | 5 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/status_area_host.h | 3 | ||||
-rw-r--r-- | chrome/browser/shell_dialogs.h | 3 | ||||
-rw-r--r-- | chrome/browser/views/browser_dialogs.h | 2 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.cc | 2 | ||||
-rw-r--r-- | chrome/browser/views/html_dialog_view.cc | 4 | ||||
-rw-r--r-- | chrome/browser/views/select_file_dialog.cc | 41 |
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, |