Bug 675709 - Create needed API when printing info PDF on macOS. r=haik
☠☠ backed out by 9436c71aecf1 ☠ ☠
authorHiroshi Hatake <cosmo0920.oucc@gmail.com>
Sat, 21 Jan 2017 17:26:01 +0900
changeset 340882 2114a592360dffbeb0c4588f20c809d7438c49bb
parent 340881 8bb8a944f0bc2ee93012375e386882b36fef71c0
child 340883 d88c174c2d20fe3f20b2c7bc5ffe73a154c5079f
push id31318
push usercbook@mozilla.com
push dateMon, 06 Feb 2017 11:56:59 +0000
treeherdermozilla-central@1cc159c7a044 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewershaik
bugs675709
milestone54.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 675709 - Create needed API when printing info PDF on macOS. r=haik
widget/cocoa/nsPrintSettingsX.h
widget/cocoa/nsPrintSettingsX.mm
--- a/widget/cocoa/nsPrintSettingsX.h
+++ b/widget/cocoa/nsPrintSettingsX.h
@@ -46,28 +46,44 @@ public:
 
   // Re-initialize mAdjustedPaper{Width,Height} with values from mPageFormat.
   // Should be called whenever mPageFormat is initialized or overwritten.
   nsresult InitAdjustedPaperSize();
 
   void SetInchesScale(float aWidthScale, float aHeightScale);
   void GetInchesScale(float *aWidthScale, float *aHeightScale);
 
+  NS_IMETHOD SetPaperSizeUnit(int16_t aPaperSizeUnit) override;
+
+  NS_IMETHOD SetScaling(double aScaling) override;
+  NS_IMETHOD SetToFileName(const char16_t * aToFileName) override;
+
+  NS_IMETHOD GetOrientation(int32_t *aOrientation) override;
+  NS_IMETHOD SetOrientation(int32_t aOrientation) override;
+
+  NS_IMETHOD SetUnwriteableMarginTop(double aUnwriteableMarginTop) override;
+  NS_IMETHOD SetUnwriteableMarginLeft(double aUnwriteableMarginLeft) override;
+  NS_IMETHOD SetUnwriteableMarginBottom(double aUnwriteableMarginBottom) override;
+  NS_IMETHOD SetUnwriteableMarginRight(double aUnwriteableMarginRight) override;
+
   void SetAdjustedPaperSize(double aWidth, double aHeight);
   void GetAdjustedPaperSize(double *aWidth, double *aHeight);
+  nsresult SetCocoaPaperSize(double aWidth, double aHeight);
 
 protected:
   virtual ~nsPrintSettingsX();
 
   nsPrintSettingsX(const nsPrintSettingsX& src);
   nsPrintSettingsX& operator=(const nsPrintSettingsX& rhs);
 
   nsresult _Clone(nsIPrintSettings **_retval) override;
   nsresult _Assign(nsIPrintSettings *aPS) override;
 
+  int GetCocoaUnit(int16_t aGeckoUnit);
+
   // The out param has a ref count of 1 on return so caller needs to PMRelase() when done.
   OSStatus CreateDefaultPageFormat(PMPrintSession aSession, PMPageFormat& outFormat);
   OSStatus CreateDefaultPrintSettings(PMPrintSession aSession, PMPrintSettings& outSettings);
 
   NSPrintInfo* mPrintInfo;
 
   // Scaling factors used to convert the NSPrintInfo
   // paper size units to inches
--- a/widget/cocoa/nsPrintSettingsX.mm
+++ b/widget/cocoa/nsPrintSettingsX.mm
@@ -249,24 +249,247 @@ NS_IMETHODIMP nsPrintSettingsX::SetPaper
   mPaperHeight = aPaperHeight;
   mAdjustedPaperHeight = aPaperHeight * mHeightScale;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsPrintSettingsX::GetEffectivePageSize(double *aWidth, double *aHeight)
 {
-  *aWidth  = NS_INCHES_TO_TWIPS(mAdjustedPaperWidth / mWidthScale);
-  *aHeight = NS_INCHES_TO_TWIPS(mAdjustedPaperHeight / mHeightScale);
+  if (kPaperSizeInches == GetCocoaUnit(mPaperSizeUnit)) {
+    *aWidth  = NS_INCHES_TO_TWIPS(mAdjustedPaperWidth / mWidthScale);
+    *aHeight = NS_INCHES_TO_TWIPS(mAdjustedPaperHeight / mHeightScale);
+  } else {
+    *aWidth  = NS_MILLIMETERS_TO_TWIPS(mAdjustedPaperWidth / mWidthScale);
+    *aHeight = NS_MILLIMETERS_TO_TWIPS(mAdjustedPaperHeight / mHeightScale);
+  }
   return NS_OK;
 }
 
 void nsPrintSettingsX::SetAdjustedPaperSize(double aWidth, double aHeight)
 {
   mAdjustedPaperWidth = aWidth;
   mAdjustedPaperHeight = aHeight;
 }
 
 void nsPrintSettingsX::GetAdjustedPaperSize(double *aWidth, double *aHeight)
 {
   *aWidth = mAdjustedPaperWidth;
   *aHeight = mAdjustedPaperHeight;
 }
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetPaperSizeUnit(int16_t aPaperSizeUnit)
+{
+  mPaperSizeUnit = aPaperSizeUnit;
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetScaling(double aScaling)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  [printInfoDict setObject: [NSNumber numberWithFloat: aScaling]
+   forKey: NSPrintScalingFactor];
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetToFileName(const char16_t *aToFileName)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  nsString filename = nsDependentString(aToFileName);
+
+  NSURL* jobSavingURL =
+      [NSURL fileURLWithPath: nsCocoaUtils::ToNSString(filename)];
+  if (jobSavingURL) {
+    [printInfoDict setObject: NSPrintSaveJob forKey: NSPrintJobDisposition];
+    [printInfoDict setObject: jobSavingURL forKey: NSPrintJobSavingURL];
+  }
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::GetOrientation(int32_t *aOrientation)
+{
+  if ([mPrintInfo orientation] == NSPaperOrientationPortrait) {
+    *aOrientation = nsIPrintSettings::kPortraitOrientation;
+  } else {
+    *aOrientation = nsIPrintSettings::kLandscapeOrientation;
+  }
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetOrientation(int32_t aOrientation)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  if (aOrientation == nsIPrintSettings::kPortraitOrientation) {
+    [printInfoDict setObject: [NSNumber numberWithInt: NSPaperOrientationPortrait]
+     forKey: NSPrintOrientation];
+  } else {
+    [printInfoDict setObject: [NSNumber numberWithInt: NSPaperOrientationLandscape]
+     forKey: NSPrintOrientation];
+  }
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetUnwriteableMarginTop(double aUnwriteableMarginTop)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  nsPrintSettings::SetUnwriteableMarginTop(aUnwriteableMarginTop);
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  [printInfoDict setObject : [NSNumber numberWithDouble: aUnwriteableMarginTop]
+   forKey : NSPrintTopMargin];
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetUnwriteableMarginLeft(double aUnwriteableMarginLeft)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  nsPrintSettings::SetUnwriteableMarginLeft(aUnwriteableMarginLeft);
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  [printInfoDict setObject : [NSNumber numberWithDouble: aUnwriteableMarginLeft]
+   forKey : NSPrintLeftMargin];
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetUnwriteableMarginBottom(double aUnwriteableMarginBottom)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  nsPrintSettings::SetUnwriteableMarginBottom(aUnwriteableMarginBottom);
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  [printInfoDict setObject : [NSNumber numberWithDouble: aUnwriteableMarginBottom]
+   forKey : NSPrintBottomMargin];
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+nsPrintSettingsX::SetUnwriteableMarginRight(double aUnwriteableMarginRight)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  nsPrintSettings::SetUnwriteableMarginRight(aUnwriteableMarginRight);
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  [printInfoDict setObject : [NSNumber numberWithDouble: aUnwriteableMarginRight]
+   forKey : NSPrintRightMargin];
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+int
+nsPrintSettingsX::GetCocoaUnit(int16_t aGeckoUnit)
+{
+  if (aGeckoUnit == kPaperSizeMillimeters)
+    return kPaperSizeMillimeters;
+  else
+    return kPaperSizeInches;
+}
+
+nsresult nsPrintSettingsX::SetCocoaPaperSize(double aWidth, double aHeight)
+{
+  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+  NSSize paperSize;
+  NSMutableDictionary* printInfoDict = [mPrintInfo dictionary];
+  if ([mPrintInfo orientation] == NSPaperOrientationPortrait) {
+    // switch widths and heights
+    paperSize = NSMakeSize(aWidth, aHeight);
+    [printInfoDict setObject: [NSValue valueWithSize: paperSize]
+     forKey: NSPrintPaperSize];
+  } else {
+    paperSize = NSMakeSize(aHeight, aWidth);
+    [printInfoDict setObject: [NSValue valueWithSize: paperSize]
+     forKey: NSPrintPaperSize];
+  }
+  NSPrintInfo* newPrintInfo =
+      [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
+  if (NS_WARN_IF(!newPrintInfo)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  SetCocoaPrintInfo(newPrintInfo);
+  [newPrintInfo release];
+  return NS_OK;
+
+  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}