summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 00:13:52 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 00:13:52 +0000
commit789125a154a972deb76967014e5022f5989be9e1 (patch)
tree35493bf8f8414294f829fe3210569010b6af119d
parente05c2bfbe755499514ad252234f83e98e09721b2 (diff)
downloadchromium_src-789125a154a972deb76967014e5022f5989be9e1.zip
chromium_src-789125a154a972deb76967014e5022f5989be9e1.tar.gz
chromium_src-789125a154a972deb76967014e5022f5989be9e1.tar.bz2
Printing selection from context menu.
BUG=83098 Review URL: https://chromiumcodereview.appspot.com/12177009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180570 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/printing/print_preview_dialog_controller_browsertest.cc8
-rw-r--r--chrome/browser/printing/print_preview_dialog_controller_unittest.cc10
-rw-r--r--chrome/browser/printing/print_preview_message_handler.cc11
-rw-r--r--chrome/browser/printing/print_preview_message_handler.h6
-rw-r--r--chrome/browser/printing/print_view_manager.cc15
-rw-r--r--chrome/browser/printing/print_view_manager.h2
-rw-r--r--chrome/browser/resources/print_preview/native_layer.js2
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.cc16
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.h1
-rw-r--r--chrome/browser/ui/browser_commands.cc2
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler.cc2
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_ui.cc19
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_ui.h15
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc8
-rw-r--r--chrome/common/print_messages.cc11
-rw-r--r--chrome/common/print_messages.h28
-rw-r--r--chrome/renderer/printing/print_web_view_helper.cc32
-rw-r--r--chrome/renderer/printing/print_web_view_helper.h3
-rw-r--r--chrome/renderer/printing/print_web_view_helper_browsertest.cc2
19 files changed, 114 insertions, 79 deletions
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 8e57fba..b231d103 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -68,7 +68,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
// Get the preview tab for initiator tab.
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -85,7 +85,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
ASSERT_TRUE(observer.tab_destroyed());
// Get the print preview tab for initiator tab.
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -113,7 +113,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
// Get the preview tab for initiator tab.
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -133,7 +133,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
ASSERT_TRUE(tab_destroyed_observer.tab_destroyed());
// Get the print preview tab for initiator tab.
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
diff --git a/chrome/browser/printing/print_preview_dialog_controller_unittest.cc b/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
index f92c6d0..54c7946 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
@@ -47,7 +47,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_GetOrCreatePreviewTab) {
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
- printing::PrintViewManager::FromWebContents(initiator_tab)->PrintPreviewNow();
+ printing::PrintViewManager::FromWebContents(initiator_tab)->
+ PrintPreviewNow(false);
WebContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -92,7 +93,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_MultiplePreviewTabs) {
// Create preview tab for |tab_contents_1|
printing::PrintViewManager::FromWebContents(web_contents_1)->
- PrintPreviewNow();
+ PrintPreviewNow(false);
WebContents* preview_tab_1 =
tab_controller->GetOrCreatePreviewTab(web_contents_1);
@@ -101,7 +102,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_MultiplePreviewTabs) {
// Create preview tab for |tab_contents_2|
printing::PrintViewManager::FromWebContents(web_contents_2)->
- PrintPreviewNow();
+ PrintPreviewNow(false);
WebContents* preview_tab_2 =
tab_controller->GetOrCreatePreviewTab(web_contents_2);
@@ -142,7 +143,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_ClearInitiatorTabDetails) {
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
- printing::PrintViewManager::FromWebContents(initiator_tab)->PrintPreviewNow();
+ printing::PrintViewManager::FromWebContents(initiator_tab)->
+ PrintPreviewNow(false);
WebContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc
index a3960bb..06bdf93 100644
--- a/chrome/browser/printing/print_preview_message_handler.cc
+++ b/chrome/browser/printing/print_preview_message_handler.cc
@@ -90,18 +90,13 @@ PrintPreviewUI* PrintPreviewMessageHandler::GetPrintPreviewUI() {
}
void PrintPreviewMessageHandler::OnRequestPrintPreview(
- bool source_is_modifiable,
- bool webnode_only,
- bool source_has_selection) {
- if (webnode_only) {
+ const PrintHostMsg_RequestPrintPreview_Params& params) {
+ if (params.webnode_only) {
printing::PrintViewManager::FromWebContents(web_contents())->
PrintPreviewForWebNode();
}
PrintPreviewDialogController::PrintPreview(web_contents());
- PrintPreviewUI::SetSourceIsModifiable(GetPrintPreviewTab(),
- source_is_modifiable);
- PrintPreviewUI::SetSourceHasSelection(GetPrintPreviewTab(),
- source_has_selection);
+ PrintPreviewUI::SetInitialParams(GetPrintPreviewTab(), params);
}
void PrintPreviewMessageHandler::OnDidGetPreviewPageCount(
diff --git a/chrome/browser/printing/print_preview_message_handler.h b/chrome/browser/printing/print_preview_message_handler.h
index f715f44..4bf6d78 100644
--- a/chrome/browser/printing/print_preview_message_handler.h
+++ b/chrome/browser/printing/print_preview_message_handler.h
@@ -13,6 +13,7 @@ class PrintPreviewUI;
struct PrintHostMsg_DidGetPreviewPageCount_Params;
struct PrintHostMsg_DidPreviewDocument_Params;
struct PrintHostMsg_DidPreviewPage_Params;
+struct PrintHostMsg_RequestPrintPreview_Params;
namespace content {
class WebContents;
@@ -47,9 +48,8 @@ class PrintPreviewMessageHandler
PrintPreviewUI* GetPrintPreviewUI();
// Message handlers.
- void OnRequestPrintPreview(bool source_is_modifiable,
- bool webnode_only,
- bool source_has_selection);
+ void OnRequestPrintPreview(
+ const PrintHostMsg_RequestPrintPreview_Params& params);
void OnDidGetDefaultPageLayout(
const printing::PageSizeMargins& page_layout_in_points,
const gfx::Rect& printable_area_in_points,
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 292a788..2921be3 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -130,15 +130,17 @@ bool PrintViewManager::PrintToDestination() {
return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
}
-bool PrintViewManager::PrintPreviewNow() {
+bool PrintViewManager::PrintPreviewNow(bool selection_only) {
// Users can send print commands all they want and it is beyond
// PrintViewManager's control. Just ignore the extra commands.
// See http://crbug.com/136842 for example.
if (print_preview_state_ != NOT_PREVIEWING)
return false;
- if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id())))
+ if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id(),
+ selection_only))) {
return false;
+ }
print_preview_state_ = USER_INITIATED_PREVIEW;
return true;
@@ -342,11 +344,10 @@ void PrintViewManager::OnScriptedPrintPreview(bool source_is_modifiable,
scripted_print_preview_rph_ = rph;
dialog_controller->PrintPreview(web_contents());
- PrintPreviewUI::SetSourceIsModifiable(
- dialog_controller->GetPrintPreviewForContents(web_contents()),
- source_is_modifiable);
- PrintPreviewUI::SetSourceHasSelection(
- dialog_controller->GetPrintPreviewForTab(web_contents()), false);
+ PrintHostMsg_RequestPrintPreview_Params params;
+ params.is_modifiable = source_is_modifiable;
+ PrintPreviewUI::SetInitialParams(
+ dialog_controller->GetPrintPreviewForContents(web_contents()), params);
}
void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) {
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h
index 016eb57..301c6ac 100644
--- a/chrome/browser/printing/print_view_manager.h
+++ b/chrome/browser/printing/print_view_manager.h
@@ -59,7 +59,7 @@ class PrintViewManager : public content::NotificationObserver,
// renderer. Since this happens asynchronous, the print preview dialog
// creation will not be completed on the return of this function. Returns
// false if print preview is impossible at the moment.
- bool PrintPreviewNow();
+ bool PrintPreviewNow(bool selection_only);
// Notify PrintViewManager that print preview is starting in the renderer for
// a particular WebNode.
diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
index ec7990d..2404164 100644
--- a/chrome/browser/resources/print_preview/native_layer.js
+++ b/chrome/browser/resources/print_preview/native_layer.js
@@ -336,7 +336,7 @@ cr.define('print_preview', function() {
initialSettings['previewModifiable'] || false,
initialSettings['initiatorTabTitle'] || '',
initialSettings['documentHasSelection'] || null,
- initialSettings['selectionOnly'] || null,
+ initialSettings['shouldPrintSelectionOnly'] || null,
initialSettings['printerName'] || null,
initialSettings['appState'] || null);
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index 3908e2a..848c6bd 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -487,8 +487,10 @@ void RenderViewContextMenu::InitMenu() {
else if (has_selection)
AppendCopyItem();
- if (has_selection)
+ if (has_selection) {
+ AppendPrintItem();
AppendSearchProvider();
+ }
if (!IsDevToolsURL(params_.page_url))
AppendAllExtensionItems();
@@ -532,7 +534,7 @@ void RenderViewContextMenu::AppendPlatformAppItems() {
int index = 0;
extension_items_.AppendExtensionItems(platform_app->id(),
- PrintableSelectionText(), &index);
+ PrintableSelectionText(), &index);
// Add dev tools for unpacked extensions.
if (platform_app->location() == extensions::Manifest::LOAD ||
@@ -805,6 +807,14 @@ void RenderViewContextMenu::AppendCopyItem() {
IDS_CONTENT_CONTEXT_COPY);
}
+void RenderViewContextMenu::AppendPrintItem() {
+ if (profile_->GetPrefs()->GetBoolean(prefs::kPrintingEnabled) &&
+ (params_.media_type == WebContextMenuData::MediaTypeNone ||
+ params_.media_flags & WebContextMenuData::MediaCanPrint)) {
+ menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
+ }
+}
+
void RenderViewContextMenu::AppendSearchProvider() {
DCHECK(profile_);
@@ -1563,7 +1573,7 @@ void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) {
if (profile_->GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled)) {
print_view_manager->PrintNow();
} else {
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(!params_.selection_text.empty());
}
} else {
rvh->Send(new PrintMsg_PrintNodeUnderContextMenu(rvh->GetRoutingID()));
diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h
index 438f1884..a44e4b8 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.h
+++ b/chrome/browser/tab_contents/render_view_context_menu.h
@@ -218,6 +218,7 @@ class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate,
void AppendPageItems();
void AppendFrameItems();
void AppendCopyItem();
+ void AppendPrintItem();
void AppendEditableItems();
void AppendSearchProvider();
void AppendAllExtensionItems();
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index da95740..21b9648 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -731,7 +731,7 @@ void Print(Browser* browser) {
prefs::kPrintPreviewDisabled))
print_view_manager->PrintNow();
else
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
}
bool CanPrint(const Browser* browser) {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index e525e54..8b3ab70 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -774,7 +774,7 @@ void PrintPreviewHandler::SendInitialSettings(
initial_settings.SetBoolean(kDocumentHasSelection,
print_preview_ui->source_has_selection());
initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
- false);
+ print_preview_ui->print_selection_only());
printing::StickySettings* sticky_settings = GetStickySettings();
sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
preview_web_contents()->GetBrowserContext())->GetPrefs());
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index becf933..f9ae6b1 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -394,23 +394,16 @@ void PrintPreviewUI::SetInitiatorTabTitle(
}
// static
-void PrintPreviewUI::SetSourceIsModifiable(WebContents* print_preview_dialog,
- bool source_is_modifiable) {
+void PrintPreviewUI::SetInitialParams(
+ content::WebContents* print_preview_dialog,
+ const PrintHostMsg_RequestPrintPreview_Params& params) {
if (!print_preview_dialog || !print_preview_dialog->GetWebUI())
return;
PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
print_preview_dialog->GetWebUI()->GetController());
- print_preview_ui->source_is_modifiable_ = source_is_modifiable;
-}
-
-// static
-void PrintPreviewUI::SetSourceHasSelection(WebContents* print_preview_dialog,
- bool source_has_selection) {
- if (!print_preview_dialog || !print_preview_dialog->GetWebUI())
- return;
- PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
- print_preview_dialog->GetWebUI()->GetController());
- print_preview_ui->source_has_selection_ = source_has_selection;
+ print_preview_ui->source_is_modifiable_ = params.is_modifiable;
+ print_preview_ui->source_has_selection_ = params.has_selection;
+ print_preview_ui->print_selection_only_ = params.selection_only;
}
// static
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
index 09e6d41..4cfd242 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -15,6 +15,7 @@
class PrintPreviewDataService;
class PrintPreviewHandler;
struct PrintHostMsg_DidGetPreviewPageCount_Params;
+struct PrintHostMsg_RequestPrintPreview_Params;
namespace base {
class RefCountedBytes;
@@ -60,13 +61,12 @@ class PrintPreviewUI : public ConstrainedWebDialogUI {
bool source_has_selection() { return source_has_selection_; }
- // Set |source_is_modifiable_| for |print_preview_dialog|'s PrintPreviewUI.
- static void SetSourceIsModifiable(content::WebContents* print_preview_dialog,
- bool source_is_modifiable);
+ bool print_selection_only() { return print_selection_only_; }
- // Set |source_has_selection_| for |print_preview_dialog|'s PrintPreviewUI.
- static void SetSourceHasSelection(content::WebContents* print_preview_dialog,
- bool source_has_selection);
+ // Set initial settings for PrintPreviewUI.
+ static void SetInitialParams(
+ content::WebContents* print_preview_dialog,
+ const PrintHostMsg_RequestPrintPreview_Params& params);
// Determines whether to cancel a print preview request based on
// |preview_ui_id| and |request_id|.
@@ -178,6 +178,9 @@ class PrintPreviewUI : public ConstrainedWebDialogUI {
// Indicates whether the source document has selection.
bool source_has_selection_;
+ // Indicates whether only the selection should be printed.
+ bool print_selection_only_;
+
// Store the initiator tab title, used for populating the print preview dialog
// title.
string16 initiator_tab_title_;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
index 1f13219..38e89df 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
@@ -76,7 +76,7 @@ TEST_F(PrintPreviewUIUnitTest, PrintPreviewData) {
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_dialog =
controller->GetOrCreatePreviewDialog(initiator_tab);
@@ -131,7 +131,7 @@ TEST_F(PrintPreviewUIUnitTest, PrintPreviewDraftPages) {
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_dialog =
controller->GetOrCreatePreviewDialog(initiator_tab);
@@ -193,7 +193,7 @@ TEST_F(PrintPreviewUIUnitTest, GetCurrentPrintPreviewStatus) {
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_dialog =
controller->GetOrCreatePreviewDialog(initiator_tab);
@@ -256,7 +256,7 @@ TEST_F(PrintPreviewUIUnitTest, InitiatorTabGetsFocusOnPrintPreviewDialogClose) {
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator_tab);
- print_view_manager->PrintPreviewNow();
+ print_view_manager->PrintPreviewNow(false);
WebContents* preview_dialog =
controller->GetOrCreatePreviewDialog(initiator_tab);
diff --git a/chrome/common/print_messages.cc b/chrome/common/print_messages.cc
index 8680ade..9d0111f 100644
--- a/chrome/common/print_messages.cc
+++ b/chrome/common/print_messages.cc
@@ -70,3 +70,14 @@ void PrintMsg_PrintPages_Params::Reset() {
params.Reset();
pages = std::vector<int>();
}
+
+PrintHostMsg_RequestPrintPreview_Params::
+ PrintHostMsg_RequestPrintPreview_Params()
+ : is_modifiable(false),
+ webnode_only(false),
+ has_selection(false),
+ selection_only(false) {
+}
+
+PrintHostMsg_RequestPrintPreview_Params::
+ ~PrintHostMsg_RequestPrintPreview_Params() {}
diff --git a/chrome/common/print_messages.h b/chrome/common/print_messages.h
index 8a79ebc..0b04f71 100644
--- a/chrome/common/print_messages.h
+++ b/chrome/common/print_messages.h
@@ -62,6 +62,15 @@ struct PrintMsg_PrintPages_Params {
std::vector<int> pages;
};
+struct PrintHostMsg_RequestPrintPreview_Params {
+ PrintHostMsg_RequestPrintPreview_Params();
+ ~PrintHostMsg_RequestPrintPreview_Params();
+ bool is_modifiable;
+ bool webnode_only;
+ bool has_selection;
+ bool selection_only;
+};
+
#endif // CHROME_COMMON_PRINT_MESSAGES_H_
#define IPC_MESSAGE_START PrintMsgStart
@@ -151,6 +160,13 @@ IPC_STRUCT_BEGIN(PrintMsg_PrintPage_Params)
IPC_STRUCT_MEMBER(int, page_number)
IPC_STRUCT_END()
+IPC_STRUCT_TRAITS_BEGIN(PrintHostMsg_RequestPrintPreview_Params)
+ IPC_STRUCT_TRAITS_MEMBER(is_modifiable)
+ IPC_STRUCT_TRAITS_MEMBER(webnode_only)
+ IPC_STRUCT_TRAITS_MEMBER(has_selection)
+ IPC_STRUCT_TRAITS_MEMBER(selection_only)
+IPC_STRUCT_TRAITS_END()
+
IPC_STRUCT_TRAITS_BEGIN(printing::PageSizeMargins)
IPC_STRUCT_TRAITS_MEMBER(content_width)
IPC_STRUCT_TRAITS_MEMBER(content_height)
@@ -265,7 +281,7 @@ IPC_STRUCT_END()
// Messages sent from the browser to the renderer.
// Tells the render view to initiate print preview for the entire document.
-IPC_MESSAGE_ROUTED0(PrintMsg_InitiatePrintPreview)
+IPC_MESSAGE_ROUTED1(PrintMsg_InitiatePrintPreview, bool /* selection_only */)
// Tells the render view to initiate printing or print preview for a particular
// node, depending on which mode the render view is in.
@@ -362,14 +378,8 @@ IPC_MESSAGE_CONTROL2(PrintHostMsg_TempFileForPrintingWritten,
#endif
// Asks the browser to do print preview.
-// |is_modifiable| is set to true when the request is for a web page, and false
-// for a PDF.
-// |webnode_only| is set to true if the document being printed is a specific
-// WebNode, and false if the document is a full WebFrame.
-IPC_MESSAGE_ROUTED3(PrintHostMsg_RequestPrintPreview,
- bool /* is_modifiable */,
- bool /* webnode_only */,
- bool /* has_selection */)
+IPC_MESSAGE_ROUTED1(PrintHostMsg_RequestPrintPreview,
+ PrintHostMsg_RequestPrintPreview_Params /* params */)
// Notify the browser the number of pages in the print preview document.
IPC_MESSAGE_ROUTED1(PrintHostMsg_DidGetPreviewPageCount,
diff --git a/chrome/renderer/printing/print_web_view_helper.cc b/chrome/renderer/printing/print_web_view_helper.cc
index d9a5cd7..c41839b 100644
--- a/chrome/renderer/printing/print_web_view_helper.cc
+++ b/chrome/renderer/printing/print_web_view_helper.cc
@@ -1106,12 +1106,14 @@ void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
PrintNode(render_view()->GetContextMenuNode());
}
-void PrintWebViewHelper::OnInitiatePrintPreview() {
+void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) {
DCHECK(is_preview_enabled_);
WebKit::WebFrame* frame;
if (GetPrintFrame(&frame)) {
print_preview_context_.InitWithFrame(frame);
- RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME);
+ RequestPrintPreview(selection_only ?
+ PRINT_PREVIEW_USER_INITIATED_SELECTION :
+ PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME);
} else {
// This should not happen. Let's add a CHECK here to see how often this
// gets hit.
@@ -1577,22 +1579,27 @@ void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) {
const bool is_modifiable = print_preview_context_.IsModifiable();
const bool has_selection = print_preview_context_.HasSelection();
old_print_pages_params_.reset();
+ PrintHostMsg_RequestPrintPreview_Params params;
+ params.is_modifiable = is_modifiable;
+ params.has_selection = has_selection;
switch (type) {
- case PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME: {
- Send(new PrintHostMsg_RequestPrintPreview(routing_id(), is_modifiable,
- false, has_selection));
- break;
- }
- case PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE: {
- Send(new PrintHostMsg_RequestPrintPreview(routing_id(), is_modifiable,
- true, has_selection));
- break;
- }
case PRINT_PREVIEW_SCRIPTED: {
IPC::SyncMessage* msg =
new PrintHostMsg_ScriptedPrintPreview(routing_id(), is_modifiable);
msg->EnableMessagePumping();
Send(msg);
+ return;
+ }
+ case PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME: {
+ break;
+ }
+ case PRINT_PREVIEW_USER_INITIATED_SELECTION: {
+ DCHECK(has_selection);
+ params.selection_only = has_selection;
+ break;
+ }
+ case PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE: {
+ params.webnode_only = true;
break;
}
default: {
@@ -1600,6 +1607,7 @@ void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) {
return;
}
}
+ Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params));
}
bool PrintWebViewHelper::CheckForCancel() {
diff --git a/chrome/renderer/printing/print_web_view_helper.h b/chrome/renderer/printing/print_web_view_helper.h
index 7ba6cc8..f7ae146 100644
--- a/chrome/renderer/printing/print_web_view_helper.h
+++ b/chrome/renderer/printing/print_web_view_helper.h
@@ -84,6 +84,7 @@ class PrintWebViewHelper
enum PrintPreviewRequestType {
PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME,
+ PRINT_PREVIEW_USER_INITIATED_SELECTION,
PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE,
PRINT_PREVIEW_SCRIPTED // triggered by window.print().
};
@@ -133,7 +134,7 @@ class PrintWebViewHelper
const PrintMsg_Print_Params& params);
// Initiate print preview.
- void OnInitiatePrintPreview();
+ void OnInitiatePrintPreview(bool selection_only);
// Start the process of generating a print preview using |settings|.
void OnPrintPreview(const base::DictionaryValue& settings);
diff --git a/chrome/renderer/printing/print_web_view_helper_browsertest.cc b/chrome/renderer/printing/print_web_view_helper_browsertest.cc
index acd929f..5facf4f 100644
--- a/chrome/renderer/printing/print_web_view_helper_browsertest.cc
+++ b/chrome/renderer/printing/print_web_view_helper_browsertest.cc
@@ -171,7 +171,7 @@ class PrintWebViewHelperTestBase : public ChromeRenderViewTest {
void OnPrintPreview(const DictionaryValue& dict) {
PrintWebViewHelper* print_web_view_helper = PrintWebViewHelper::Get(view_);
- print_web_view_helper->OnInitiatePrintPreview();
+ print_web_view_helper->OnInitiatePrintPreview(false);
print_web_view_helper->OnPrintPreview(dict);
ProcessPendingMessages();
}