Skip to content

Commit

Permalink
Submitting https://codereview.chromium.org/23116003/ for Cihat Imamoglu.
Browse files Browse the repository at this point in the history
Adds PrintingContext implementation stub for Android.

BUG=147070
TBR=thestig@chromium.org

Review URL: https://codereview.chromium.org/22999026

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218339 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
avayvod@chromium.org committed Aug 19, 2013
1 parent 4f3c1df commit b25f003
Show file tree
Hide file tree
Showing 27 changed files with 300 additions and 37 deletions.
10 changes: 9 additions & 1 deletion build/common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,6 @@
'enable_automation%': 0,
'enable_extensions%': 0,
'enable_google_now%': 0,
'enable_printing%': 0,
'enable_spellcheck%': 0,
'enable_themes%': 0,
'proprietary_codecs%': 1,
Expand All @@ -534,6 +533,15 @@
'native_memory_pressure_signals%': 1,
}],

# Enable basic printing for Chrome for Android but disable printing
# completely for WebView.
['OS=="android" and android_webview_build==0', {
'enable_printing%': 2,
}],
['OS=="android" and android_webview_build==1', {
'enable_printing%': 0,
}],

# Enable autofill dialog for Android, Mac and Views-enabled platforms.
['toolkit_views==1 or (OS=="android" and android_webview_build==0) or OS=="mac"', {
'enable_autofill_dialog%': 1
Expand Down
13 changes: 13 additions & 0 deletions chrome/android/testshell/testshell_stubs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "chrome/browser/translate/translate_infobar_delegate.h"
#include "chrome/browser/ui/auto_login_infobar_delegate.h"
#include "chrome/browser/ui/auto_login_infobar_delegate_android.h"
#include "printing/printing_context.h"
#include "printing/printing_context_android.h"

// This file contains temporary stubs to allow the libtestshell target to
// compile. They will be removed once real implementations are
Expand Down Expand Up @@ -57,3 +59,14 @@ InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
InfoBar* TranslateInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
return NULL;
}

// static
printing::PrintingContext* printing::PrintingContext::Create(
const std::string& app_locale) {
return NULL;
}

// static
void printing::PrintingContextAndroid::PdfWritingDone(int fd, bool success) {
}

13 changes: 13 additions & 0 deletions chrome/browser/android/tab_android_test_stubs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include "chrome/browser/translate/translate_infobar_delegate.h"
#include "chrome/browser/ui/auto_login_infobar_delegate.h"
#include "chrome/browser/ui/auto_login_infobar_delegate_android.h"
#include "printing/printing_context.h"
#include "printing/printing_context_android.h"

// static
TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) {
Expand Down Expand Up @@ -57,3 +59,14 @@ InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
InfoBar* TranslateInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
return NULL;
}

// static
printing::PrintingContext* printing::PrintingContext::Create(
const std::string& app_locale) {
return NULL;
}

// static
void printing::PrintingContextAndroid::PdfWritingDone(int fd, bool success) {
}

2 changes: 1 addition & 1 deletion chrome/browser/printing/print_view_manager_base.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Copyright 2013 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.

Expand Down
6 changes: 4 additions & 2 deletions chrome/browser/printing/print_view_manager_base.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Copyright 2013 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.

Expand Down Expand Up @@ -56,6 +56,9 @@ class PrintViewManagerBase : public content::NotificationObserver,
// content::WebContentsObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;

// IPC Message handlers.
virtual void OnPrintingFailed(int cookie);

private:
// content::NotificationObserver implementation.
virtual void Observe(int type,
Expand All @@ -73,7 +76,6 @@ class PrintViewManagerBase : public content::NotificationObserver,
void OnDidGetPrintedPagesCount(int cookie, int number_pages);
void OnDidGetDocumentCookie(int cookie);
void OnDidPrintPage(const PrintHostMsg_DidPrintPage_Params& params);
void OnPrintingFailed(int cookie);

// Processes a NOTIFY_PRINT_JOB_EVENT notification.
void OnNotifyPrintJobEvent(const JobEventDetails& event_details);
Expand Down
32 changes: 31 additions & 1 deletion chrome/browser/printing/print_view_manager_basic.cc
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Copyright 2013 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/printing/print_view_manager_basic.h"

#if defined(OS_ANDROID)
#include "base/file_descriptor_posix.h"
#include "chrome/common/print_messages.h"
#include "printing/printing_context_android.h"
#endif

DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintViewManagerBasic);

namespace printing {
Expand All @@ -15,4 +21,28 @@ PrintViewManagerBasic::PrintViewManagerBasic(content::WebContents* web_contents)
PrintViewManagerBasic::~PrintViewManagerBasic() {
}

#if defined(OS_ANDROID)
void PrintViewManagerBasic::RenderProcessGone(base::TerminationStatus status) {
PrintingContextAndroid::PdfWritingDone(file_descriptor_.fd, false);
file_descriptor_ = base::FileDescriptor(-1, false);
PrintViewManagerBase::RenderProcessGone(status);
}

void PrintViewManagerBasic::OnPrintingFailed(int cookie) {
PrintingContextAndroid::PdfWritingDone(file_descriptor_.fd, false);
file_descriptor_ = base::FileDescriptor(-1, false);
PrintViewManagerBase::OnPrintingFailed(cookie);
}

bool PrintViewManagerBasic::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PrintViewManagerBasic, message)
IPC_MESSAGE_HANDLER(PrintHostMsg_PrintingFailed, OnPrintingFailed)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()

return handled ? true : PrintViewManagerBase::OnMessageReceived(message);
}
#endif

} // namespace printing
30 changes: 29 additions & 1 deletion chrome/browser/printing/print_view_manager_basic.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Copyright 2013 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.

Expand All @@ -8,6 +8,10 @@
#include "chrome/browser/printing/print_view_manager_base.h"
#include "content/public/browser/web_contents_user_data.h"

#if defined(OS_ANDROID)
#include "base/file_descriptor_posix.h"
#endif

namespace printing {

// Manages the print commands for a WebContents - basic version.
Expand All @@ -17,10 +21,34 @@ class PrintViewManagerBasic
public:
virtual ~PrintViewManagerBasic();

#if defined(OS_ANDROID)
// Sets the file descriptor into which the PDF will be written.
void set_file_descriptor(const base::FileDescriptor& file_descriptor) {
file_descriptor_ = file_descriptor;
}

// Gets the file descriptor into which the PDF will be written.
base::FileDescriptor file_descriptor() const { return file_descriptor_; }

// content::WebContentsObserver implementation.
// Terminates or cancels the print job if one was pending.
virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;

// content::WebContentsObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
#endif

private:
explicit PrintViewManagerBasic(content::WebContents* web_contents);
friend class content::WebContentsUserData<PrintViewManagerBasic>;

#if defined(OS_ANDROID)
virtual void OnPrintingFailed(int cookie) OVERRIDE;

// The file descriptor into which the PDF of the page will be written.
base::FileDescriptor file_descriptor_;
#endif

DISALLOW_COPY_AND_ASSIGN(PrintViewManagerBasic);
};

Expand Down
67 changes: 64 additions & 3 deletions chrome/browser/printing/printing_message_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
#include "chrome/browser/printing/print_dialog_cloud.h"
#endif

#if defined(OS_ANDROID)
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "printing/printing_context_android.h"
#endif

using content::BrowserThread;

namespace {
Expand Down Expand Up @@ -100,6 +106,11 @@ void PrintingMessageFilter::OverrideThreadForMessage(
message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) {
*thread = BrowserThread::FILE;
}
#elif defined(OS_ANDROID)
if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID ||
message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) {
*thread = BrowserThread::UI;
}
#endif
}

Expand All @@ -110,7 +121,7 @@ bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message,
#if defined(OS_WIN)
IPC_MESSAGE_HANDLER(PrintHostMsg_DuplicateSection, OnDuplicateSection)
#endif
#if defined(OS_CHROMEOS)
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting,
OnAllocateTempFileForPrinting)
IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten,
Expand Down Expand Up @@ -141,9 +152,13 @@ void PrintingMessageFilter::OnDuplicateSection(
}
#endif

#if defined(OS_CHROMEOS)
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
void PrintingMessageFilter::OnAllocateTempFileForPrinting(
base::FileDescriptor* temp_file_fd, int* sequence_number) {
int render_view_id,
base::FileDescriptor* temp_file_fd,
int* sequence_number) {
#if defined(OS_CHROMEOS)
// TODO(thestig): Use |render_view_id| for Chrome OS.
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
temp_file_fd->fd = *sequence_number = -1;
temp_file_fd->auto_close = false;
Expand All @@ -166,10 +181,23 @@ void PrintingMessageFilter::OnAllocateTempFileForPrinting(
}
}
}
#elif defined(OS_ANDROID)
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
printing::PrintViewManagerBasic* print_view_manager =
printing::PrintViewManagerBasic::FromWebContents(wc);
// The file descriptor is originally created in & passed from the Android
// side, and it will handle the closing.
const base::FileDescriptor& file_descriptor =
print_view_manager->file_descriptor();
temp_file_fd->fd = file_descriptor.fd;
temp_file_fd->auto_close = false;
#endif
}

void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id,
int sequence_number) {
#if defined(OS_CHROMEOS)
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map;
SequenceToPathMap::iterator it = map->find(sequence_number);
Expand All @@ -185,8 +213,21 @@ void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id,

// Erase the entry in the map.
map->erase(it);
#elif defined(OS_ANDROID)
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
printing::PrintViewManagerBasic* print_view_manager =
printing::PrintViewManagerBasic::FromWebContents(wc);
const base::FileDescriptor& file_descriptor =
print_view_manager->file_descriptor();
printing::PrintingContextAndroid::PdfWritingDone(file_descriptor.fd, true);
// Invalidate the file descriptor so it doesn't accidentally get reused.
print_view_manager->set_file_descriptor(base::FileDescriptor(-1, false));
#endif
}
#endif // defined(OS_CHROMEOS) || defined(OS_ANDROID)

#if defined(OS_CHROMEOS)
void PrintingMessageFilter::CreatePrintDialogForFile(
int render_view_id,
const base::FilePath& path) {
Expand Down Expand Up @@ -332,12 +373,32 @@ void PrintingMessageFilter::OnScriptedPrintReply(
PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params);
Send(reply_msg);
if (params.params.dpi && params.params.document_cookie) {
#if defined(OS_ANDROID)
int file_descriptor;
const string16& device_name = printer_query->settings().device_name();
if (base::StringToInt(device_name, &file_descriptor)) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&PrintingMessageFilter::UpdateFileDescriptor, this,
reply_msg->routing_id(), file_descriptor));
}
#endif
print_job_manager_->QueuePrinterQuery(printer_query.get());
} else {
printer_query->StopWorker();
}
}

#if defined(OS_ANDROID)
void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
printing::PrintViewManagerBasic* print_view_manager =
printing::PrintViewManagerBasic::FromWebContents(wc);
print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false));
}
#endif

void PrintingMessageFilter::OnUpdatePrintSettings(
int document_cookie, const DictionaryValue& job_settings,
IPC::Message* reply_msg) {
Expand Down
14 changes: 12 additions & 2 deletions chrome/browser/printing/printing_message_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,25 @@ class PrintingMessageFilter : public content::BrowserMessageFilter {
base::SharedMemoryHandle* browser_handle);
#endif

#if defined(OS_CHROMEOS)
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
// Used to ask the browser allocate a temporary file for the renderer
// to fill in resulting PDF in renderer.
void OnAllocateTempFileForPrinting(base::FileDescriptor* temp_file_fd,
void OnAllocateTempFileForPrinting(int render_view_id,
base::FileDescriptor* temp_file_fd,
int* sequence_number);
void OnTempFileForPrintingWritten(int render_view_id, int sequence_number);
#endif

#if defined(OS_CHROMEOS)
void CreatePrintDialogForFile(int render_view_id, const base::FilePath& path);
#endif

#if defined(OS_ANDROID)
// Updates the file descriptor for the PrintViewManagerBasic of a given
// render_view_id.
void UpdateFileDescriptor(int render_view_id, int fd);
#endif

// Given a render_view_id get the corresponding WebContents.
// Must be called on the UI thread.
content::WebContents* GetWebContentsForRenderView(int render_view_id);
Expand Down
1 change: 1 addition & 0 deletions chrome/chrome_renderer.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@
'renderer/prerender/prerenderer_client.h',
'renderer/printing/print_web_view_helper.cc',
'renderer/printing/print_web_view_helper.h',
'renderer/printing/print_web_view_helper_android.cc',
'renderer/printing/print_web_view_helper_linux.cc',
'renderer/printing/print_web_view_helper_mac.mm',
'renderer/printing/print_web_view_helper_win.cc',
Expand Down
9 changes: 5 additions & 4 deletions chrome/common/print_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -370,15 +370,16 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PrintHostMsg_ScriptedPrint,
PrintMsg_PrintPages_Params
/* settings chosen by the user*/)

#if defined(USE_X11)
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
// Asks the browser to create a temporary file for the renderer to fill
// in resulting NativeMetafile in printing.
IPC_SYNC_MESSAGE_CONTROL0_2(PrintHostMsg_AllocateTempFileForPrinting,
IPC_SYNC_MESSAGE_CONTROL1_2(PrintHostMsg_AllocateTempFileForPrinting,
int /* render_view_id */,
base::FileDescriptor /* temp file fd */,
int /* fd in browser*/)
int /* fd in browser*/) // Used only by Chrome OS.
IPC_MESSAGE_CONTROL2(PrintHostMsg_TempFileForPrintingWritten,
int /* render_view_id */,
int /* fd in browser */)
int /* fd in browser */) // Used only by Chrome OS.
#endif

// Asks the browser to do print preview.
Expand Down
1 change: 1 addition & 0 deletions chrome/renderer/chrome_mock_render_thread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ void ChromeMockRenderThread::OnOpenChannelToExtension(
#if defined(ENABLE_PRINTING)
#if defined(OS_CHROMEOS)
void ChromeMockRenderThread::OnAllocateTempFileForPrinting(
int render_view_id,
base::FileDescriptor* renderer_fd,
int* browser_fd) {
renderer_fd->fd = *browser_fd = -1;
Expand Down
Loading

0 comments on commit b25f003

Please sign in to comment.