1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
// Copyright (c) 2006-2008 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_VIEW_MANAGER_H__
#define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_H__
#include "chrome/browser/printing/printed_pages_source.h"
#include "chrome/common/notification_service.h"
#include "chrome/common/render_messages.h"
class RenderViewHost;
class WebContents;
namespace printing {
class JobEventDetails;
class PrintJob;
class PrintJobWorkerOwner;
// Manages the print commands in relation to a WebContents. WebContents
// delegates a few printing related commands to this instance.
class PrintViewManager : public NotificationObserver,
public PrintedPagesSource {
public:
PrintViewManager(WebContents& owner);
// Destroys the "Print..." dialog, makes sure the pages are finished rendering
// and release the print job.
void Destroy();
// Cancels the print job.
void Stop();
// Shows the "Print..." dialog if none is shown and if no rendering is
// pending. This is done asynchronously.
void ShowPrintDialog();
// Initiates a print job immediately. This is done asynchronously. Returns
// false if printing is impossible at the moment.
bool PrintNow();
// Terminates or cancels the print job if one was pending, depending on the
// current state. Returns false if the renderer was not valuable.
bool OnRendererGone(RenderViewHost* render_view_host);
// Received a notification from the renderer that the number of printed page
// has just been calculated..
void DidGetPrintedPagesCount(int cookie, int number_pages);
// Received a notification from the renderer that a printed page page is
// finished renderering.
void DidPrintPage(const ViewHostMsg_DidPrintPage_Params& params);
// PrintedPagesSource implementation.
virtual void RenderOnePrintedPage(PrintedDocument* document, int page_number);
virtual std::wstring RenderSourceName();
virtual GURL RenderSourceUrl();
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
private:
// Processes a NOTIFY_PRINT_JOB_EVENT notification.
void OnNotifyPrintJobEvent(const JobEventDetails& event_details);
// Processes a xxx_INIT_xxx type of NOTIFY_PRINT_JOB_EVENT notification.
void OnNotifyPrintJobInitEvent(const JobEventDetails& event_details);
// Requests the RenderView to render all the missing pages for the print job.
// Noop if no print job is pending. Returns true if at least one page has been
// requested to the renderer.
bool RenderAllMissingPagesNow();
// Quits the current message loop if these conditions hold true: a document is
// loaded and is complete and waiting_for_pages_to_be_rendered_ is true. This
// function is called in DidPrintPage() or on ALL_PAGES_REQUESTED
// notification. The inner message loop is created was created by
// RenderAllMissingPagesNow().
void ShouldQuitFromInnerMessageLoop();
// Creates a new empty print job. It has no settings loaded. If there is
// currently a print job, safely disconnect from it. Returns false if it is
// impossible to safely disconnect from the current print job or it is
// impossible to create a new print job.
bool CreateNewPrintJob(PrintJobWorkerOwner* job);
// Makes sure the current print_job_ has all its data before continuing, and
// disconnect from it.
void DisconnectFromCurrentPrintJob();
// Terminates the print job. Noop if no print job has been created. If
// |cancel| is true, cancel it instead of waiting for the job to finish. Will
// call ReleasePrintJob().
void TerminatePrintJob(bool cancel);
// Releases print_job_. Correctly deregisters from notifications. Noop if
// no print job has been created.
void ReleasePrintJob();
// Prints the document. Starts the actual print job. Requests asynchronously
// the renderered pages from the renderer. Is called once the printing context
// is initialized, on a DEFAULT_INIT_DONE notification when waiting_to_print_
// is true.
void PrintNowInternal();
// Runs an inner message loop. It will set inside_inner_message_loop_ to true
// while the blocking inner message loop is running. This is useful in cases
// where the RenderView is about to be destroyed while a printing job isn't
// finished.
bool RunInnerMessageLoop();
// In the case of Scripted Printing, where the renderer is controlling the
// control flow, print_job_ is initialized whenever possible. No-op is
// print_job_ is initialized.
bool OpportunisticallyCreatePrintJob(int cookie);
// Cache the last print settings requested to the renderer.
ViewMsg_Print_Params print_params_;
// Manages the low-level talk to the printer.
scoped_refptr<PrintJob> print_job_;
// Waiting for print_job_ initialization to be completed to start printing.
// Specifically the DEFAULT_INIT_DONE notification. Set when PrintNow() is
// called.
bool waiting_to_print_;
// Running an inner message loop inside RenderAllMissingPagesNow(). This means
// we are _blocking_ until all the necessary pages have been rendered or the
// print settings are being loaded.
bool inside_inner_message_loop_;
// The object is waiting for some information to call print_job_->Init(true).
// It is either a DEFAULT_INIT_DONE notification or the
// DidGetPrintedPagesCount() callback.
// Showing the Print... dialog box is a multi-step operation:
// - print_job_->Init(false) to get the default settings. Set
// waiting_to_show_print_dialog_ = true.
// - on DEFAULT_INIT_DONE, gathers new settings.
// - did settings() or document() change since the last intialization?
// - Call SwitchCssToPrintMediaType()
// - On DidGetPrintedPagesCount() call, if
// waiting_to_show_print_dialog_ = true
// - calls print_job_->Init(true).
// - waiting_to_show_print_dialog_ = false.
// - DONE.
// - else (It may happens when redisplaying the dialog box with settings that
// haven't changed)
// - if waiting_to_show_print_dialog_ = true && page_count is initialized.
// - calls print_job_->Init(true).
// - waiting_to_show_print_dialog_ = false.
bool waiting_to_show_print_dialog_;
// PrintViewManager is created as an extension of WebContent specialized for
// printing-related behavior. Still, access to the renderer is needed so a
// back reference is kept the the "parent object".
WebContents& owner_;
DISALLOW_EVIL_CONSTRUCTORS(PrintViewManager);
};
} // namespace printing
#endif // CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_H__
|