summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/browser/renderer_host/pepper_message_filter.cc19
-rw-r--r--content/browser/renderer_host/pepper_message_filter.h10
-rw-r--r--content/browser/renderer_host/pepper_print_settings_initializer.cc124
-rw-r--r--content/browser/renderer_host/pepper_print_settings_initializer.h46
-rw-r--r--content/content_browser.gypi3
5 files changed, 200 insertions, 2 deletions
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc
index d6336aa..f1f50d5 100644
--- a/content/browser/renderer_host/pepper_message_filter.cc
+++ b/content/browser/renderer_host/pepper_message_filter.cc
@@ -52,6 +52,7 @@
#endif
using content::BrowserThread;
+using content::PepperPrintSettingsInitializer;
using content::RenderViewHostImpl;
using ppapi::NetAddressPrivateImpl;
@@ -77,13 +78,15 @@ PepperMessageFilter::PepperMessageFilter(
process_id_(process_id),
resource_context_(browser_context->GetResourceContext()),
host_resolver_(NULL),
- next_socket_id_(1) {
+ next_socket_id_(1),
+ print_settings_initializer_(new PepperPrintSettingsInitializer) {
DCHECK(type == RENDERER);
DCHECK(browser_context);
// Keep BrowserContext data in FILE-thread friendly storage.
browser_path_ = browser_context->GetPath();
incognito_ = browser_context->IsOffTheRecord();
DCHECK(resource_context_);
+ print_settings_initializer_->Initialize();
}
PepperMessageFilter::PepperMessageFilter(ProcessType type,
@@ -93,9 +96,11 @@ PepperMessageFilter::PepperMessageFilter(ProcessType type,
resource_context_(NULL),
host_resolver_(host_resolver),
next_socket_id_(1),
- incognito_(false) {
+ incognito_(false),
+ print_settings_initializer_(new PepperPrintSettingsInitializer) {
DCHECK(type == PLUGIN);
DCHECK(host_resolver);
+ print_settings_initializer_->Initialize();
}
void PepperMessageFilter::OverrideThreadForMessage(
@@ -166,6 +171,10 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg,
IPC_MESSAGE_HANDLER(PepperMsg_GetDeviceID, OnGetDeviceID)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashDeviceID_Get, OnGetDeviceIDAsync)
+ // PPBInstance messages.
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBPInstance_GetDefaultPrintSettings,
+ OnGetDefaultPrintSettings);
+
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
return handled;
@@ -697,6 +706,12 @@ void PepperMessageFilter::OnGetDeviceIDAsync(int32_t routing_id,
result));
}
+void PepperMessageFilter::OnGetDefaultPrintSettings(
+ PP_PrintSettings_Dev* settings,
+ bool* result) {
+ *result = print_settings_initializer_->GetDefaultPrintSettings(settings);
+}
+
void PepperMessageFilter::GetFontFamiliesComplete(
IPC::Message* reply_msg,
scoped_ptr<base::ListValue> result) {
diff --git a/content/browser/renderer_host/pepper_message_filter.h b/content/browser/renderer_host/pepper_message_filter.h
index 9a0a453..fab8f50 100644
--- a/content/browser/renderer_host/pepper_message_filter.h
+++ b/content/browser/renderer_host/pepper_message_filter.h
@@ -16,6 +16,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/process.h"
#include "base/time.h"
+#include "content/browser/renderer_host/pepper_print_settings_initializer.h"
#include "content/public/browser/browser_message_filter.h"
#include "net/base/network_change_notifier.h"
#include "net/base/net_util.h"
@@ -29,6 +30,7 @@ class PepperTCPSocket;
class PepperUDPSocket;
struct PP_HostResolver_Private_Hint;
struct PP_NetAddress_Private;
+struct PP_PrintSettings_Dev;
namespace base {
class ListValue;
@@ -216,6 +218,11 @@ class PepperMessageFilter
void OnGetDeviceID(std::string* id);
void OnGetDeviceIDAsync(int32_t routing_id, PP_Resource resource);
+ // Outputs the default print settings in |settings|. Sets |result| to true
+ // on success.
+ void OnGetDefaultPrintSettings(PP_PrintSettings_Dev* settings,
+ bool* result);
+
// Callback when the font list has been retrieved on a background thread.
void GetFontFamiliesComplete(IPC::Message* reply_msg,
scoped_ptr<base::ListValue> result);
@@ -258,6 +265,9 @@ class PepperMessageFilter
FilePath browser_path_;
bool incognito_;
+ scoped_refptr<content::PepperPrintSettingsInitializer>
+ print_settings_initializer_;
+
DISALLOW_COPY_AND_ASSIGN(PepperMessageFilter);
};
diff --git a/content/browser/renderer_host/pepper_print_settings_initializer.cc b/content/browser/renderer_host/pepper_print_settings_initializer.cc
new file mode 100644
index 0000000..59cb5dd
--- /dev/null
+++ b/content/browser/renderer_host/pepper_print_settings_initializer.cc
@@ -0,0 +1,124 @@
+// Copyright (c) 2012 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 "content/browser/renderer_host/pepper_print_settings_initializer.h"
+
+#include "content/browser/browser_thread_impl.h"
+#include "printing/printing_context.h"
+#include "printing/units.h"
+
+namespace content {
+
+namespace {
+
+// |kAccessorThread| is the thread which will call |GetDefaultPrintSettings|.
+const BrowserThread::ID kAccessorThread = BrowserThread::IO;
+
+// Print units conversion functions.
+int32_t DeviceUnitsInPoints(int32_t device_units,
+ int32_t device_units_per_inch) {
+#if defined(ENABLE_PRINTING)
+ return printing::ConvertUnit(device_units, printing::kPointsPerInch,
+ device_units_per_inch);
+#else
+ return 0;
+#endif
+}
+
+PP_Size PrintSizeToPPPrintSize(const gfx::Size& print_size,
+ int32_t device_units_per_inch) {
+ PP_Size result;
+ result.width = DeviceUnitsInPoints(print_size.width(), device_units_per_inch);
+ result.height = DeviceUnitsInPoints(print_size.height(),
+ device_units_per_inch);
+ return result;
+
+}
+
+PP_Rect PrintAreaToPPPrintArea(const gfx::Rect& print_area,
+ int32_t device_units_per_inch) {
+ PP_Rect result;
+ result.point.x = DeviceUnitsInPoints(print_area.origin().x(),
+ device_units_per_inch);
+ result.point.y = DeviceUnitsInPoints(print_area.origin().y(),
+ device_units_per_inch);
+ result.size = PrintSizeToPPPrintSize(print_area.size(),
+ device_units_per_inch);
+ return result;
+}
+
+} // namespace
+
+PepperPrintSettingsInitializer::PepperPrintSettingsInitializer()
+ : initialized_(false) {
+}
+
+void PepperPrintSettingsInitializer::Initialize() {
+ // Multiple initializations are OK, it would just refresh the settings.
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&PepperPrintSettingsInitializer::DoInitialize, this));
+}
+
+bool PepperPrintSettingsInitializer::GetDefaultPrintSettings(
+ PP_PrintSettings_Dev* settings) const {
+ DCHECK(BrowserThread::CurrentlyOn(kAccessorThread));
+ if (!initialized_)
+ return false;
+ *settings = default_print_settings_;
+ return true;
+}
+
+PepperPrintSettingsInitializer::~PepperPrintSettingsInitializer() {
+}
+
+void PepperPrintSettingsInitializer::DoInitialize() {
+// If printing isn't enabled, we don't do any initialization.
+#if defined(ENABLE_PRINTING)
+ // This function should run on the UI thread because |PrintingContext| methods
+ // call into platform APIs.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ PP_PrintSettings_Dev default_settings;
+ scoped_ptr<printing::PrintingContext> context(
+ printing::PrintingContext::Create(""));
+ if (!context.get())
+ return;
+ context->UseDefaultSettings();
+ const printing::PrintSettings& print_settings = context->settings();
+ const printing::PageSetup& page_setup =
+ print_settings.page_setup_device_units();
+ int device_units_per_inch = print_settings.device_units_per_inch();
+ default_settings.printable_area =
+ PrintAreaToPPPrintArea(page_setup.printable_area(), device_units_per_inch);
+ default_settings.content_area =
+ PrintAreaToPPPrintArea(page_setup.content_area(), device_units_per_inch);
+ default_settings.paper_size =
+ PrintSizeToPPPrintSize(page_setup.physical_size(), device_units_per_inch);
+ default_settings.dpi = print_settings.dpi();
+
+ // The remainder of the attributes are hard-coded to the defaults as set
+ // elsewhere.
+ default_settings.orientation = PP_PRINTORIENTATION_NORMAL;
+ default_settings.grayscale = PP_FALSE;
+ default_settings.print_scaling_option = PP_PRINTSCALINGOPTION_SOURCE_SIZE;
+
+ // TODO(raymes): Should be computed in the same way as
+ // |PluginInstance::GetPreferredPrintOutputFormat|.
+ // |PP_PRINTOUTPUTFORMAT_PDF| is currently the only supported format though,
+ // so just make it the default.
+ default_settings.format = PP_PRINTOUTPUTFORMAT_PDF;
+
+ BrowserThread::PostTask(kAccessorThread, FROM_HERE,
+ base::Bind(&PepperPrintSettingsInitializer::SetDefaultPrintSettings,
+ this, default_settings));
+#endif
+}
+
+void PepperPrintSettingsInitializer::SetDefaultPrintSettings(
+ const PP_PrintSettings_Dev& settings) {
+ DCHECK(BrowserThread::CurrentlyOn(kAccessorThread));
+ initialized_ = true;
+ default_print_settings_ = settings;
+}
+
+} // namespace content
diff --git a/content/browser/renderer_host/pepper_print_settings_initializer.h b/content/browser/renderer_host/pepper_print_settings_initializer.h
new file mode 100644
index 0000000..f4beec4
--- /dev/null
+++ b/content/browser/renderer_host/pepper_print_settings_initializer.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2012 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 CONTENT_BROWSER_RENDERER_HOST_PEPPER_PRINT_SETTINGS_INITIALIZER_H_
+#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PRINT_SETTINGS_INITIALIZER_H_
+#pragma once
+
+#include "base/memory/ref_counted.h"
+#include "ppapi/c/dev/pp_print_settings_dev.h"
+
+namespace content {
+
+// This is a helper class for |PepperMessageFilter| which caches the default
+// print settings which are obtained from the system upon startup.
+// TODO(raymes): Ideally we would grab the default print settings every time
+// they are requested (because there is a chance they could change) however we
+// need to get the print settings on the UI thread and sync messages can't be
+// processed on the UI thread on Windows. We want this message to be synchronous
+// because it is called by Flash. There might be a better solution than this.
+class PepperPrintSettingsInitializer
+ : public base::RefCountedThreadSafe<PepperPrintSettingsInitializer> {
+ public:
+ PepperPrintSettingsInitializer();
+ void Initialize();
+ // Returns true if default settings are available and places them in
+ // |settings|.
+ bool GetDefaultPrintSettings(PP_PrintSettings_Dev* settings) const;
+
+ private:
+ friend class base::RefCountedThreadSafe<PepperPrintSettingsInitializer>;
+
+ virtual ~PepperPrintSettingsInitializer();
+
+ void DoInitialize();
+ void SetDefaultPrintSettings(const PP_PrintSettings_Dev& settings);
+
+ bool initialized_;
+ PP_PrintSettings_Dev default_print_settings_;
+
+ DISALLOW_COPY_AND_ASSIGN(PepperPrintSettingsInitializer);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PRINT_SETTINGS_INITIALIZER_H_
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index e5489bd..60617c6 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -11,6 +11,7 @@
'../net/net.gyp:http_server',
'../net/net.gyp:net',
'../ppapi/ppapi_internal.gyp:ppapi_proxy',
+ '../printing/printing.gyp:printing',
'../skia/skia.gyp:skia',
'../third_party/flac/flac.gyp:libflac',
'../third_party/speex/speex.gyp:libspeex',
@@ -567,6 +568,8 @@
'browser/renderer_host/pepper_lookup_request.h',
'browser/renderer_host/pepper_message_filter.cc',
'browser/renderer_host/pepper_message_filter.h',
+ 'browser/renderer_host/pepper_print_settings_initializer.cc',
+ 'browser/renderer_host/pepper_print_settings_initializer.h',
'browser/renderer_host/pepper_tcp_server_socket.cc',
'browser/renderer_host/pepper_tcp_server_socket.h',
'browser/renderer_host/pepper_tcp_socket.cc',