Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5845)

Unified Diff: chrome/browser/ui/webui/cloud_print_signin_dialog.cc

Issue 7518002: Add sign in dialog for GCP->print preview integration. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.
+

Powered by Google App Engine
This is Rietveld 408576698