Index: chrome/browser/printing/print_dialog_cloud.cc |
=================================================================== |
--- chrome/browser/printing/print_dialog_cloud.cc (revision 72336) |
+++ chrome/browser/printing/print_dialog_cloud.cc (working copy) |
@@ -6,6 +6,7 @@ |
#include "chrome/browser/printing/print_dialog_cloud_internal.h" |
#include "base/base64.h" |
+#include "base/command_line.h" |
#include "base/file_util.h" |
#include "base/json/json_reader.h" |
#include "base/values.h" |
@@ -14,12 +15,20 @@ |
#include "chrome/browser/debugger/devtools_manager.h" |
#include "chrome/browser/dom_ui/dom_ui.h" |
#include "chrome/browser/dom_ui/dom_ui_util.h" |
+#if defined(TOOLKIT_GTK) |
+#include "chrome/browser/ui/gtk/html_dialog_gtk.h" |
+#endif // defined(TOOLKIT_GTK) |
#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/profiles/profile_manager.h" |
#include "chrome/browser/renderer_host/render_view_host.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/tab_contents/tab_contents_view.h" |
+#if defined(TOOLKIT_VIEWS) |
+#include "chrome/browser/ui/views/browser_dialogs.h" |
+#endif // defined(TOOLKIT_VIEWS) |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/common/notification_observer.h" |
#include "chrome/common/notification_registrar.h" |
#include "chrome/common/notification_source.h" |
@@ -393,8 +402,10 @@ |
const FilePath& path_to_pdf, |
int width, int height, |
const std::string& json_arguments, |
- const string16& print_job_title) |
+ const string16& print_job_title, |
+ bool modal) |
: flow_handler_(new CloudPrintFlowHandler(path_to_pdf, print_job_title)), |
+ modal_(modal), |
owns_flow_handler_(true) { |
Init(width, height, json_arguments); |
} |
@@ -402,8 +413,10 @@ |
CloudPrintHtmlDialogDelegate::CloudPrintHtmlDialogDelegate( |
CloudPrintFlowHandler* flow_handler, |
int width, int height, |
- const std::string& json_arguments) |
+ const std::string& json_arguments, |
+ bool modal) |
: flow_handler_(flow_handler), |
+ modal_(modal), |
owns_flow_handler_(true) { |
Init(width, height, json_arguments); |
} |
@@ -419,6 +432,10 @@ |
params_.json_input = json_arguments; |
flow_handler_->SetDialogDelegate(this); |
+ // If we're not modal we can show the dialog with no browser. |
+ // We need this to keep Chrome alive while our dialog is up. |
+ if (!modal_) |
+ BrowserList::StartKeepAlive(); |
} |
CloudPrintHtmlDialogDelegate::~CloudPrintHtmlDialogDelegate() { |
@@ -432,7 +449,7 @@ |
} |
bool CloudPrintHtmlDialogDelegate::IsDialogModal() const { |
- return true; |
+ return modal_; |
} |
std::wstring CloudPrintHtmlDialogDelegate::GetDialogTitle() const { |
@@ -465,6 +482,10 @@ |
const std::string& json_retval) { |
// Get the final dialog size and store it. |
flow_handler_->StoreDialogClientSize(); |
+ // If we're modal we can show the dialog with no browser. |
+ // End the keep-alive so that Chrome can exit. |
+ if (!modal_) |
+ BrowserList::EndKeepAlive(); |
delete this; |
} |
@@ -486,34 +507,52 @@ |
// TODO(scottbyer): The signature here will need to change as the |
// workflow through the printing code changes to allow for dynamically |
// changing page setup parameters while the dialog is active. |
-void PrintDialogCloud::CreatePrintDialogForPdf(const FilePath& path_to_pdf) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+void PrintDialogCloud::CreatePrintDialogForPdf(const FilePath& path_to_pdf, |
+ const string16& print_job_title, |
+ bool modal) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE) || |
+ BrowserThread::CurrentlyOn(BrowserThread::UI)); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- NewRunnableFunction(&PrintDialogCloud::CreateDialogImpl, path_to_pdf)); |
+ NewRunnableFunction(&PrintDialogCloud::CreateDialogImpl, |
+ path_to_pdf, |
+ print_job_title, |
+ modal)); |
} |
// static, called from the UI thread. |
-void PrintDialogCloud::CreateDialogImpl(const FilePath& path_to_pdf) { |
+void PrintDialogCloud::CreateDialogImpl(const FilePath& path_to_pdf, |
+ const string16& print_job_title, |
+ bool modal) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- new PrintDialogCloud(path_to_pdf); |
+ new PrintDialogCloud(path_to_pdf, print_job_title, modal); |
} |
// Initialize the print dialog. Called on the UI thread. |
-PrintDialogCloud::PrintDialogCloud(const FilePath& path_to_pdf) |
- : browser_(BrowserList::GetLastActive()) { |
+PrintDialogCloud::PrintDialogCloud(const FilePath& path_to_pdf, |
+ const string16& print_job_title, |
+ bool modal) |
+ : browser_(BrowserList::GetLastActive()), |
+ print_job_title_(print_job_title), |
+ modal_(modal) { |
// TODO(scottbyer): Verify GAIA login valid, execute GAIA login if not (should |
// be distilled out of bookmark sync.) |
- string16 print_job_title; |
- if (browser_ && browser_->GetSelectedTabContents()) |
- print_job_title = browser_->GetSelectedTabContents()->GetTitle(); |
- |
const int kDefaultWidth = 497; |
const int kDefaultHeight = 332; |
- |
- PrefService* pref_service = browser_->GetProfile()->GetPrefs(); |
+ Profile* profile = NULL; |
+ PrefService* pref_service = NULL; |
+ if (modal_) { |
+ DCHECK(browser_); |
+ if (print_job_title_.empty() && browser_->GetSelectedTabContents()) |
+ print_job_title_ = browser_->GetSelectedTabContents()->GetTitle(); |
+ profile = browser_->GetProfile(); |
+ } else { |
+ profile = ProfileManager::GetDefaultProfile(); |
+ } |
+ DCHECK(profile); |
+ pref_service = profile->GetPrefs(); |
DCHECK(pref_service); |
if (!pref_service->FindPreference(prefs::kCloudPrintDialogWidth)) { |
pref_service->RegisterIntegerPref(prefs::kCloudPrintDialogWidth, |
@@ -526,10 +565,22 @@ |
int width = pref_service->GetInteger(prefs::kCloudPrintDialogWidth); |
int height = pref_service->GetInteger(prefs::kCloudPrintDialogHeight); |
+ |
HtmlDialogUIDelegate* dialog_delegate = |
new internal_cloud_print_helpers::CloudPrintHtmlDialogDelegate( |
- path_to_pdf, width, height, std::string(), print_job_title); |
- browser_->BrowserShowHtmlDialog(dialog_delegate, NULL); |
+ path_to_pdf, width, height, std::string(), print_job_title_, modal_); |
+ if (modal_) { |
+ DCHECK(browser_); |
+ browser_->BrowserShowHtmlDialog(dialog_delegate, NULL); |
+ } else { |
+#if defined(TOOLKIT_VIEWS) |
+ browser::ShowHtmlDialogView(NULL, profile, dialog_delegate); |
+#elif defined(TOOLKIT_GTK) |
+ HtmlDialogGtk* html_dialog = |
+ new HtmlDialogGtk(profile, dialog_delegate, NULL); |
+ html_dialog->InitDialog(); |
+#endif // defined(TOOLKIT_VIEWS) |
+ } |
} |
PrintDialogCloud::~PrintDialogCloud() { |