Index: chrome/browser/ui/webui/cloud_print_signin_dialog.cc |
diff --git a/chrome/browser/ui/webui/cloud_print_signin_dialog.cc b/chrome/browser/ui/webui/cloud_print_signin_dialog.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a0b47826107d4832b32c1f32e4012cd4c3e5b2b9 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/cloud_print_signin_dialog.cc |
@@ -0,0 +1,183 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" |
+#include "chrome/browser/prefs/pref_service.h" |
+#include "chrome/browser/printing/cloud_print/cloud_print_url.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_list.h" |
+#include "chrome/browser/ui/webui/html_dialog_ui.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/tab_contents/navigation_controller.h" |
+#include "content/browser/tab_contents/tab_contents.h" |
+#include "content/browser/tab_contents/tab_contents_view.h" |
+#include "content/common/content_notification_types.h" |
+#include "content/common/notification_registrar.h" |
+#include "content/common/notification_source.h" |
+#include "content/common/view_messages.h" |
+ |
+// This module implements a sign in dialog for cloud print. |
+// it is based heavily off "chrome/browser/printing/print_dialog_cloud.cc". |
+// See the comments in that file for a discussion about how this works. |
+ |
+namespace cloud_print_signin_dialog { |
+ |
+// The flow handler sends our dialog to the correct URL, saves size info, |
+// and closes the dialog when sign in is complete. |
+class CloudPrintSigninFlowHandler : public WebUIMessageHandler, |
+ public NotificationObserver { |
+ // WebUIMessageHandler implementation. |
+ virtual void RegisterMessages() OVERRIDE; |
+ |
+ // NotificationObserver implementation. |
+ virtual void Observe(int type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) OVERRIDE; |
+ private: |
+ // Records the final size of the dialog in prefs. |
+ void StoreDialogSize(); |
+ NotificationRegistrar registrar_; |
+}; |
+ |
+void CloudPrintSigninFlowHandler::RegisterMessages() { |
+ if (web_ui_ && web_ui_->tab_contents()) { |
+ NavigationController* controller = &web_ui_->tab_contents()->controller(); |
+ NavigationEntry* pending_entry = controller->pending_entry(); |
+ if (pending_entry) |
+ pending_entry->set_url(CloudPrintURL( |
+ Profile::FromWebUI(web_ui_)).GetCloudPrintSigninURL()); |
+ registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
+ Source<NavigationController>(controller)); |
+ } |
+} |
+ |
+void CloudPrintSigninFlowHandler::Observe(int type, |
+ const NotificationSource& source, |
Scott Byer
2011/08/23 23:57:33
nit: indent
Albert Bodenhamer
2011/08/24 01:00:07
Done.
|
+ const NotificationDetails& details) { |
+ if (type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) { |
+ GURL url = web_ui_->tab_contents()->GetURL(); |
+ GURL dialog_url = CloudPrintURL( |
+ Profile::FromWebUI(web_ui_)).GetCloudPrintServiceURL(); |
+ if (url.host() == dialog_url.host() && |
+ url.path() == dialog_url.path() && |
+ url.scheme() == dialog_url.scheme()) { |
+ StoreDialogSize(); |
+ web_ui_->tab_contents()->render_view_host()->ClosePage(); |
+ } |
+ } |
+} |
+ |
+void CloudPrintSigninFlowHandler::StoreDialogSize() { |
+ if (web_ui_ && web_ui_->tab_contents() && web_ui_->tab_contents()->view()) { |
+ gfx::Size size = web_ui_->tab_contents()->view()->GetContainerSize(); |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ profile->GetPrefs()->SetInteger(prefs::kCloudPrintSigninDialogWidth, |
+ size.width()); |
+ profile->GetPrefs()->SetInteger( |
+ prefs::kCloudPrintSigninDialogHeight, size.height()); |
+ } |
+} |
+ |
+// The delegate provides most of the basic setup for the dialog. |
+class CloudPrintSigninDelegate : public HtmlDialogUIDelegate { |
+ public: |
+ explicit CloudPrintSigninDelegate(TabContents* parent_tab); |
+ virtual bool IsDialogModal() const OVERRIDE; |
+ virtual string16 GetDialogTitle() const OVERRIDE; |
+ virtual GURL GetDialogContentURL() const OVERRIDE; |
+ virtual void GetWebUIMessageHandlers( |
+ std::vector<WebUIMessageHandler*>* handlers) const OVERRIDE; |
+ virtual void GetDialogSize(gfx::Size* size) const OVERRIDE; |
+ virtual std::string GetDialogArgs() const OVERRIDE; |
+ virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE; |
+ virtual void OnCloseContents( |
+ TabContents* source, bool* out_close_dialog) OVERRIDE; |
+ virtual bool ShouldShowDialogTitle() const OVERRIDE; |
+ private: |
+ TabContents* parent_tab_; |
+}; |
+ |
+CloudPrintSigninDelegate::CloudPrintSigninDelegate(TabContents* parent_tab) |
+ : parent_tab_(parent_tab) { |
+} |
+ |
+ |
Scott Byer
2011/08/23 23:57:33
nit: extra blank line
Albert Bodenhamer
2011/08/24 01:00:07
Done.
|
+bool CloudPrintSigninDelegate::IsDialogModal() const { |
+ // TODO(abodenha@chromium.org) We want this to be modal, but calling |
+ // ClosePage from the flow handler on a modal dialog results in the |
+ // browser window never responding to input again. Figure out why. |
Scott Byer
2011/08/23 23:57:33
Add a bug to track this with and put the URL here.
Albert Bodenhamer
2011/08/24 01:00:07
Done.
|
+ return false; |
+} |
+ |
+string16 CloudPrintSigninDelegate::GetDialogTitle() const { |
+ return string16(); |
+} |
+ |
+GURL CloudPrintSigninDelegate::GetDialogContentURL() const { |
+ return GURL(chrome::kChromeUICloudPrintResourcesURL); |
+} |
+ |
+void CloudPrintSigninDelegate::GetWebUIMessageHandlers( |
+ std::vector<WebUIMessageHandler*>* handlers) const { |
+ handlers->push_back(new CloudPrintSigninFlowHandler()); |
+} |
+ |
+void CloudPrintSigninDelegate::GetDialogSize(gfx::Size* size) const { |
+ PrefService* pref_service = |
+ BrowserList::GetLastActive()->GetProfile()->GetPrefs(); |
+ if (!pref_service->FindPreference(prefs::kCloudPrintSigninDialogWidth)) { |
+ pref_service->RegisterIntegerPref(prefs::kCloudPrintSigninDialogWidth, |
+ 800, |
+ PrefService::UNSYNCABLE_PREF); |
+ } |
+ if (!pref_service->FindPreference(prefs::kCloudPrintSigninDialogHeight)) { |
+ pref_service->RegisterIntegerPref(prefs::kCloudPrintSigninDialogHeight, |
+ 600, |
+ PrefService::UNSYNCABLE_PREF); |
+ } |
+ |
+ size->set_width( |
+ pref_service->GetInteger(prefs::kCloudPrintSigninDialogWidth)); |
+ size->set_height( |
+ pref_service->GetInteger(prefs::kCloudPrintSigninDialogHeight)); |
+} |
+ |
+std::string CloudPrintSigninDelegate::GetDialogArgs() const { |
+ return std::string(); |
+} |
+ |
+void CloudPrintSigninDelegate::OnDialogClosed(const std::string& json_retval) { |
+ parent_tab_->controller().Reload(false); |
+} |
+ |
+void CloudPrintSigninDelegate::OnCloseContents(TabContents* source, |
+ bool* out_close_dialog) { |
+ if (out_close_dialog) |
+ *out_close_dialog = true; |
+} |
+ |
+bool CloudPrintSigninDelegate::ShouldShowDialogTitle() const { |
+ return false; |
+} |
+ |
+void CreateCloudPrintSigninDialogImpl(TabContents* parent_tab) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ HtmlDialogUIDelegate* dialog_delegate = |
+ new CloudPrintSigninDelegate(parent_tab); |
+ BrowserList::GetLastActive()->BrowserShowHtmlDialog(dialog_delegate, NULL); |
+} |
+ |
+void CreateCloudPrintSigninDialog(TabContents* parent_tab) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ NewRunnableFunction(CreateCloudPrintSigninDialogImpl, |
+ parent_tab)); |
+} |
+} |
Scott Byer
2011/08/23 23:57:33
Missing // namespace comment.
Albert Bodenhamer
2011/08/24 01:00:07
Done.
|
+ |