// 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.
#ifndef CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_INTERNAL_H_
#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_INTERNAL_H_
#pragma once
#include <string>
#include <vector>
#include "base/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
#include "chrome/browser/ui/webui/html_dialog_ui.h"
#include "content/browser/webui/web_ui.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
class GURL;
class StringValue;
class CloudPrintHtmlDialogDelegateTest;
namespace internal_cloud_print_helpers {
// Small class to virtualize a few functions to aid with unit testing.
class CloudPrintDataSenderHelper {
public:
explicit CloudPrintDataSenderHelper(WebUI* web_ui) : web_ui_(web_ui) {}
virtual ~CloudPrintDataSenderHelper() {}
// Virtualize the overrides of these three functions from WebUI to
// facilitate unit testing.
virtual void CallJavascriptFunction(const std::wstring& function_name);
virtual void CallJavascriptFunction(const std::wstring& function_name,
const Value& arg);
virtual void CallJavascriptFunction(const std::wstring& function_name,
const Value& arg1,
const Value& arg2);
private:
WebUI* web_ui_;
DISALLOW_COPY_AND_ASSIGN(CloudPrintDataSenderHelper);
};
// Small helper class to get the print data loaded in from the PDF
// file (on the FILE thread) and send it to the print dialog contents
// (on the IO thread), allowing for cancellation.
class CloudPrintDataSender
: public base::RefCountedThreadSafe<CloudPrintDataSender> {
public:
// The owner of this object is also expected to own and control the
// lifetime of the helper.
CloudPrintDataSender(CloudPrintDataSenderHelper* helper,
const string16& print_job_title,
const std::string& file_type);
// Calls to read in the PDF file (on the FILE thread) then send that
// information to the dialog renderer (on the IO thread). We know
// that the WebUI pointer lifetime will outlast us, so we should be
// good.
void ReadPrintDataFile(const FilePath& path_to_file);
void SendPrintDataFile();
// Cancels any ramining part of the task by clearing out the WebUI
// helper_ ptr.
void CancelPrintDataFile();
private:
friend class base::RefCountedThreadSafe<CloudPrintDataSender>;
virtual ~CloudPrintDataSender();
base::Lock lock_;
CloudPrintDataSenderHelper* volatile helper_;
scoped_ptr<StringValue> print_data_;
string16 print_job_title_;
std::string file_type_;
DISALLOW_COPY_AND_ASSIGN(CloudPrintDataSender);
};
class CloudPrintHtmlDialogDelegate;
// The CloudPrintFlowHandler connects the state machine (the UI delegate)
// to the dialog backing HTML and JS by providing WebUIMessageHandler
// functions for the JS to use. This include refreshing the page
// setup parameters (which will cause a re-generation of the PDF in
// the renderer process - do we want a progress throbber shown?
// Probably..), and packing up the PDF and job parameters and sending
// them to the cloud.
class CloudPrintFlowHandler : public WebUIMessageHandler,
public NotificationObserver {
public:
explicit CloudPrintFlowHandler(const FilePath& path_to_file,
const string16& print_job_title,
const std::string& file_type);
virtual ~CloudPrintFlowHandler();
// WebUIMessageHandler implementation.
virtual void RegisterMessages();
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Callbacks from the page.
void HandleShowDebugger(const ListValue* args);
void HandleSendPrintData(const ListValue* args);
void HandleSetPageParameters(const ListValue* args);
virtual void SetDialogDelegate(CloudPrintHtmlDialogDelegate *delegate);
void StoreDialogClientSize() const;
private:
virtual scoped_refptr<CloudPrintDataSender> CreateCloudPrintDataSender();
// Call to get the debugger loaded on our hosted dialog page
// specifically. Since we're not in an official browser tab, only
// way to get the debugger going.
void ShowDebugger();
void CancelAnyRunningTask();
CloudPrintHtmlDialogDelegate* dialog_delegate_;
NotificationRegistrar registrar_;
FilePath path_to_file_;
string16 print_job_title_;
std::string file_type_;
scoped_refptr<CloudPrintDataSender> print_data_sender_;
scoped_ptr<CloudPrintDataSenderHelper> print_data_helper_;
DISALLOW_COPY_AND_ASSIGN(CloudPrintFlowHandler);
};
// State machine used to run the printing dialog. This class is used
// to open and run the html dialog and deletes itself when the dialog
// is closed.
class CloudPrintHtmlDialogDelegate : public HtmlDialogUIDelegate {
public:
CloudPrintHtmlDialogDelegate(const FilePath& path_to_file,
int width, int height,
const std::string& json_arguments,
const string16& print_job_title,
const std::string& file_type,
bool modal);
virtual ~CloudPrintHtmlDialogDelegate();
// HTMLDialogUIDelegate implementation:
virtual bool IsDialogModal() const;
virtual std::wstring GetDialogTitle() const;
virtual GURL GetDialogContentURL() const;
virtual void GetWebUIMessageHandlers(
std::vector<WebUIMessageHandler*>* handlers) const;
virtual void GetDialogSize(gfx::Size* size) const;
virtual std::string GetDialogArgs() const;
virtual void OnDialogClosed(const std::string& json_retval);
virtual void OnCloseContents(TabContents* source, bool* out_close_dialog);
virtual bool ShouldShowDialogTitle() const;
virtual bool HandleContextMenu(const ContextMenuParams& params);
private:
friend class ::CloudPrintHtmlDialogDelegateTest;
// For unit testing.
CloudPrintHtmlDialogDelegate(CloudPrintFlowHandler* flow_handler,
int width, int height,
const std::string& json_arguments,
bool modal);
void Init(int width, int height, const std::string& json_arguments);
CloudPrintFlowHandler* flow_handler_;
bool modal_;
mutable bool owns_flow_handler_;
// The parameters needed to display a modal HTML dialog.
HtmlDialogUI::HtmlDialogParams params_;
DISALLOW_COPY_AND_ASSIGN(CloudPrintHtmlDialogDelegate);
};
void CreateDialogImpl(const FilePath& path_to_file,
const string16& print_job_title,
const std::string& file_type,
bool modal);
} // namespace internal_cloud_print_helpers
#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_INTERNAL_H_