Update to 41.0 Build 1
This commit is contained in:
		
							parent
							
								
									1d5f27bb2b
								
							
						
					
					
						commit
						f37041f277
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -155,3 +155,5 @@ firefox-3.6.4.source.tar.bz2 | |||||||
| /firefox-langpacks-40.0-20150811.tar.xz | /firefox-langpacks-40.0-20150811.tar.xz | ||||||
| /firefox-40.0.3.source.tar.bz2 | /firefox-40.0.3.source.tar.bz2 | ||||||
| /firefox-langpacks-40.0.3-20150827.tar.xz | /firefox-langpacks-40.0.3-20150827.tar.xz | ||||||
|  | /firefox-41.0.source.tar.xz | ||||||
|  | /firefox-langpacks-41.0-20150915.tar.xz | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								firefox.spec
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								firefox.spec
									
									
									
									
									
								
							| @ -90,14 +90,14 @@ | |||||||
| 
 | 
 | ||||||
| Summary:        Mozilla Firefox Web browser | Summary:        Mozilla Firefox Web browser | ||||||
| Name:           firefox | Name:           firefox | ||||||
| Version:        40.0.3 | Version:        41.0 | ||||||
| Release:        3%{?pre_tag}%{?dist} | Release:        1%{?pre_tag}%{?dist} | ||||||
| URL:            http://www.mozilla.org/projects/firefox/ | URL:            http://www.mozilla.org/projects/firefox/ | ||||||
| License:        MPLv1.1 or GPLv2+ or LGPLv2+ | License:        MPLv1.1 or GPLv2+ or LGPLv2+ | ||||||
| Group:          Applications/Internet | Group:          Applications/Internet | ||||||
| Source0:        ftp://ftp.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.bz2 | Source0:        ftp://ftp.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz | ||||||
| %if %{build_langpacks} | %if %{build_langpacks} | ||||||
| Source1:        firefox-langpacks-%{version}%{?pre_version}-20150827.tar.xz | Source1:        firefox-langpacks-%{version}%{?pre_version}-20150915.tar.xz | ||||||
| %endif | %endif | ||||||
| Source10:       firefox-mozconfig | Source10:       firefox-mozconfig | ||||||
| Source12:       firefox-redhat-default-prefs.js | Source12:       firefox-redhat-default-prefs.js | ||||||
| @ -131,15 +131,8 @@ Patch221:        firefox-fedora-ua.patch | |||||||
| # Upstream patches | # Upstream patches | ||||||
| 
 | 
 | ||||||
| # Gtk3 upstream patches | # Gtk3 upstream patches | ||||||
| Patch419:        mozilla-1144745-3.patch |  | ||||||
| Patch420:        mozilla-1160154.patch | Patch420:        mozilla-1160154.patch | ||||||
| Patch421:        mozilla-1169233.patch |  | ||||||
| Patch422:        mozilla-1169232.patch |  | ||||||
| Patch423:        mozilla-1129873-apppicker.patch |  | ||||||
| Patch424:        mozilla-entry-padding.patch |  | ||||||
| Patch425:        mozilla-1192243.patch | Patch425:        mozilla-1192243.patch | ||||||
| Patch426:        mozilla-1127752.patch |  | ||||||
| Patch427:        mozilla-1166584.patch |  | ||||||
| 
 | 
 | ||||||
| # Fix Skia Neon stuff on AArch64 | # Fix Skia Neon stuff on AArch64 | ||||||
| Patch500:        aarch64-fix-skia.patch | Patch500:        aarch64-fix-skia.patch | ||||||
| @ -280,15 +273,8 @@ cd %{tarballdir} | |||||||
| 
 | 
 | ||||||
| # Upstream patches | # Upstream patches | ||||||
| %if %{toolkit_gtk3} | %if %{toolkit_gtk3} | ||||||
| %patch419 -p1 -b .1144745-3 |  | ||||||
| %patch420 -p1 -b .1160154 | %patch420 -p1 -b .1160154 | ||||||
| %patch421 -p1 -b .1169233 |  | ||||||
| %patch422 -p1 -b .1169232 |  | ||||||
| %patch423 -p1 -b .1129873-apppicker |  | ||||||
| %patch424 -p2 -b .entry-padding |  | ||||||
| %patch425 -p1 -b .1192243 | %patch425 -p1 -b .1192243 | ||||||
| %patch426 -p2 -b .1127752 |  | ||||||
| %patch427 -p1 -b .1166584 |  | ||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| %patch500 -p1 | %patch500 -p1 | ||||||
| @ -781,6 +767,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : | |||||||
| #--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Sep 15 2015 Martin Stransky <stransky@redhat.com> - 41.0-1 | ||||||
|  | - Update to 40.0 Build 1 | ||||||
|  | 
 | ||||||
| * Thu Sep 3 2015 Martin Stransky <stransky@redhat.com> - 40.0.3-3 | * Thu Sep 3 2015 Martin Stransky <stransky@redhat.com> - 40.0.3-3 | ||||||
| - Removed the dom.ipc.plugins.asyncInit hack, it's already in tarball | - Removed the dom.ipc.plugins.asyncInit hack, it's already in tarball | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,941 +0,0 @@ | |||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/BorrowedContext.h.1127752 firefox-40.0/mozilla-release/gfx/2d/BorrowedContext.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/BorrowedContext.h.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/BorrowedContext.h	2015-08-26 14:07:24.666087911 +0200
 |  | ||||||
| @@ -8,6 +8,11 @@
 |  | ||||||
|   |  | ||||||
|  #include "2D.h" |  | ||||||
|   |  | ||||||
| +#ifdef MOZ_X11
 |  | ||||||
| +#include <X11/extensions/Xrender.h>
 |  | ||||||
| +#include <X11/Xlib.h>
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  struct _cairo; |  | ||||||
|  typedef struct _cairo cairo_t; |  | ||||||
|   |  | ||||||
| @@ -69,6 +74,69 @@ private:
 |  | ||||||
|    DrawTarget *mDT; |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| +#ifdef MOZ_X11
 |  | ||||||
| +/* This is a helper class that let's you borrow an Xlib drawable from
 |  | ||||||
| + * a DrawTarget. This is used for drawing themed widgets.
 |  | ||||||
| + *
 |  | ||||||
| + * Callers should check the Xlib drawable after constructing the object
 |  | ||||||
| + * to see if it succeeded. The DrawTarget should not be used while
 |  | ||||||
| + * the drawable is borrowed. */
 |  | ||||||
| +class BorrowedXlibDrawable
 |  | ||||||
| +{
 |  | ||||||
| +public:
 |  | ||||||
| +  BorrowedXlibDrawable()
 |  | ||||||
| +    : mDT(nullptr),
 |  | ||||||
| +      mDisplay(nullptr),
 |  | ||||||
| +      mDrawable(None),
 |  | ||||||
| +      mScreen(nullptr),
 |  | ||||||
| +      mVisual(nullptr),
 |  | ||||||
| +      mXRenderFormat(nullptr)
 |  | ||||||
| +  {}
 |  | ||||||
| +
 |  | ||||||
| +  explicit BorrowedXlibDrawable(DrawTarget *aDT)
 |  | ||||||
| +    : mDT(nullptr),
 |  | ||||||
| +      mDisplay(nullptr),
 |  | ||||||
| +      mDrawable(None),
 |  | ||||||
| +      mScreen(nullptr),
 |  | ||||||
| +      mVisual(nullptr),
 |  | ||||||
| +      mXRenderFormat(nullptr)
 |  | ||||||
| +  {
 |  | ||||||
| +    Init(aDT);
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  // We can optionally Init after construction in
 |  | ||||||
| +  // case we don't know what the DT will be at construction
 |  | ||||||
| +  // time.
 |  | ||||||
| +  bool Init(DrawTarget *aDT);
 |  | ||||||
| +
 |  | ||||||
| +  // The caller needs to call Finish if drawable is non-zero when
 |  | ||||||
| +  // they are done with the context. This is currently explicit
 |  | ||||||
| +  // instead of happening implicitly in the destructor to make
 |  | ||||||
| +  // what's happening in the caller more clear. It also
 |  | ||||||
| +  // let's you resume using the DrawTarget in the same scope.
 |  | ||||||
| +  void Finish();
 |  | ||||||
| +
 |  | ||||||
| +  ~BorrowedXlibDrawable() {
 |  | ||||||
| +    MOZ_ASSERT(!mDrawable);
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  Display *GetDisplay() const { return mDisplay; }
 |  | ||||||
| +  Drawable GetDrawable() const { return mDrawable; }
 |  | ||||||
| +  Screen *GetScreen() const { return mScreen; }
 |  | ||||||
| +  Visual *GetVisual() const { return mVisual; }
 |  | ||||||
| +
 |  | ||||||
| +  XRenderPictFormat* GetXRenderFormat() const { return mXRenderFormat; }
 |  | ||||||
| +
 |  | ||||||
| +private:
 |  | ||||||
| +  DrawTarget *mDT;
 |  | ||||||
| +  Display *mDisplay;
 |  | ||||||
| +  Drawable mDrawable;
 |  | ||||||
| +  Screen *mScreen;
 |  | ||||||
| +  Visual *mVisual;
 |  | ||||||
| +  XRenderPictFormat *mXRenderFormat;
 |  | ||||||
| +};
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  #ifdef XP_MACOSX |  | ||||||
|  /* This is a helper class that let's you borrow a CGContextRef from a |  | ||||||
|   * DrawTargetCG. This is used for drawing themed widgets. |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.cpp.1127752 firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.cpp	2015-08-26 14:07:24.666087911 +0200
 |  | ||||||
| @@ -1714,5 +1714,50 @@ BorrowedCairoContext::ReturnCairoContext
 |  | ||||||
|    cairoDT->mContext = aCairo; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +#ifdef MOZ_X11
 |  | ||||||
| +bool
 |  | ||||||
| +BorrowedXlibDrawable::Init(DrawTarget* aDT)
 |  | ||||||
| +{
 |  | ||||||
| +  MOZ_ASSERT(aDT, "Caller should check for nullptr");
 |  | ||||||
| +  MOZ_ASSERT(!mDT, "Can't initialize twice!");
 |  | ||||||
| +  mDT = aDT;
 |  | ||||||
| +  mDrawable = None;
 |  | ||||||
| +
 |  | ||||||
| +#ifdef CAIRO_HAS_XLIB_SURFACE
 |  | ||||||
| +  if (aDT->GetBackendType() != BackendType::CAIRO ||
 |  | ||||||
| +      aDT->IsDualDrawTarget() ||
 |  | ||||||
| +      aDT->IsTiledDrawTarget()) {
 |  | ||||||
| +    return false;
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  DrawTargetCairo* cairoDT = static_cast<DrawTargetCairo*>(aDT);
 |  | ||||||
| +  cairo_surface_t* surf = cairoDT->mSurface;
 |  | ||||||
| +  if (cairo_surface_get_type(surf) != CAIRO_SURFACE_TYPE_XLIB) {
 |  | ||||||
| +    return false;
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  cairoDT->WillChange();
 |  | ||||||
| +
 |  | ||||||
| +  mDisplay = cairo_xlib_surface_get_display(surf);
 |  | ||||||
| +  mDrawable = cairo_xlib_surface_get_drawable(surf);
 |  | ||||||
| +  mScreen = cairo_xlib_surface_get_screen(surf);
 |  | ||||||
| +  mVisual = cairo_xlib_surface_get_visual(surf);
 |  | ||||||
| +  mXRenderFormat = cairo_xlib_surface_get_xrender_format(surf);
 |  | ||||||
| +
 |  | ||||||
| +  return true;
 |  | ||||||
| +#else
 |  | ||||||
| +  return false;
 |  | ||||||
| +#endif
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +void
 |  | ||||||
| +BorrowedXlibDrawable::Finish()
 |  | ||||||
| +{
 |  | ||||||
| +  if (mDrawable) {
 |  | ||||||
| +    mDrawable = None;
 |  | ||||||
| +  }
 |  | ||||||
| +}
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  } |  | ||||||
|  } |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.h.1127752 firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.h.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/DrawTargetCairo.h	2015-08-26 14:07:24.666087911 +0200
 |  | ||||||
| @@ -54,6 +54,7 @@ class DrawTargetCairo final : public Dra
 |  | ||||||
|  public: |  | ||||||
|    MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetCairo, override) |  | ||||||
|    friend class BorrowedCairoContext; |  | ||||||
| +  friend class BorrowedXlibDrawable;
 |  | ||||||
|   |  | ||||||
|    DrawTargetCairo(); |  | ||||||
|    virtual ~DrawTargetCairo(); |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.cpp.1127752 firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.cpp	2015-08-26 14:07:24.667087889 +0200
 |  | ||||||
| @@ -148,6 +148,35 @@ DrawTargetSkia::Snapshot()
 |  | ||||||
|    return snapshot.forget(); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +bool
 |  | ||||||
| +DrawTargetSkia::LockBits(uint8_t** aData, IntSize* aSize,
 |  | ||||||
| +                          int32_t* aStride, SurfaceFormat* aFormat)
 |  | ||||||
| +{
 |  | ||||||
| +  const SkBitmap &bitmap = mCanvas->getDevice()->accessBitmap(false);
 |  | ||||||
| +  if (!bitmap.lockPixelsAreWritable()) {
 |  | ||||||
| +    return false;
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  MarkChanged();
 |  | ||||||
| +
 |  | ||||||
| +  bitmap.lockPixels();
 |  | ||||||
| +  *aData = reinterpret_cast<uint8_t*>(bitmap.getPixels());
 |  | ||||||
| +  *aSize = IntSize(bitmap.width(), bitmap.height());
 |  | ||||||
| +  *aStride = int32_t(bitmap.rowBytes());
 |  | ||||||
| +  *aFormat = SkiaColorTypeToGfxFormat(bitmap.colorType());
 |  | ||||||
| +  return true;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +void
 |  | ||||||
| +DrawTargetSkia::ReleaseBits(uint8_t* aData)
 |  | ||||||
| +{
 |  | ||||||
| +  const SkBitmap &bitmap = mCanvas->getDevice()->accessBitmap(false);
 |  | ||||||
| +  MOZ_ASSERT(bitmap.lockPixelsAreWritable());
 |  | ||||||
| +
 |  | ||||||
| +  bitmap.unlockPixels();
 |  | ||||||
| +  bitmap.notifyPixelsChanged();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|  static void |  | ||||||
|  SetPaintPattern(SkPaint& aPaint, const Pattern& aPattern, TempBitmap& aTmpBitmap, |  | ||||||
|                  Float aAlpha = 1.0) |  | ||||||
| @@ -688,10 +717,10 @@ DrawTargetSkia::CreateSourceSurfaceFromN
 |  | ||||||
|      cairo_surface_t* surf = static_cast<cairo_surface_t*>(aSurface.mSurface); |  | ||||||
|      return new SourceSurfaceCairo(surf, aSurface.mSize, aSurface.mFormat); |  | ||||||
|  #if USE_SKIA_GPU |  | ||||||
| -  } else if (aSurface.mType == NativeSurfaceType::OPENGL_TEXTURE) {
 |  | ||||||
| +  } else if (aSurface.mType == NativeSurfaceType::OPENGL_TEXTURE && UsingSkiaGPU()) {
 |  | ||||||
|      RefPtr<SourceSurfaceSkia> newSurf = new SourceSurfaceSkia(); |  | ||||||
|      unsigned int texture = (unsigned int)((uintptr_t)aSurface.mSurface); |  | ||||||
| -    if (UsingSkiaGPU() && newSurf->InitFromTexture((DrawTargetSkia*)this, texture, aSurface.mSize, aSurface.mFormat)) {
 |  | ||||||
| +    if (newSurf->InitFromTexture((DrawTargetSkia*)this, texture, aSurface.mSize, aSurface.mFormat)) {
 |  | ||||||
|        return newSurf; |  | ||||||
|      } |  | ||||||
|      return nullptr; |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.h.1127752 firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.h.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/DrawTargetSkia.h	2015-08-26 14:07:24.667087889 +0200
 |  | ||||||
| @@ -36,6 +36,9 @@ public:
 |  | ||||||
|    virtual BackendType GetBackendType() const override { return BackendType::SKIA; } |  | ||||||
|    virtual TemporaryRef<SourceSurface> Snapshot() override; |  | ||||||
|    virtual IntSize GetSize() override { return mSize; } |  | ||||||
| +  virtual bool LockBits(uint8_t** aData, IntSize* aSize,
 |  | ||||||
| +                        int32_t* aStride, SurfaceFormat* aFormat) override;
 |  | ||||||
| +  virtual void ReleaseBits(uint8_t* aData) override;
 |  | ||||||
|    virtual void Flush() override; |  | ||||||
|    virtual void DrawSurface(SourceSurface *aSurface, |  | ||||||
|                             const Rect &aDest, |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/2d/moz.build.1127752 firefox-40.0/mozilla-release/gfx/2d/moz.build
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/2d/moz.build.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/2d/moz.build	2015-08-26 14:07:24.667087889 +0200
 |  | ||||||
| @@ -79,6 +79,7 @@ if CONFIG['MOZ_ENABLE_SKIA']:
 |  | ||||||
|          'image_operations.cpp', # Uses _USE_MATH_DEFINES |  | ||||||
|      ] |  | ||||||
|      EXPORTS.mozilla.gfx += [ |  | ||||||
| +        'HelpersCairo.h',
 |  | ||||||
|          'HelpersSkia.h', |  | ||||||
|      ] |  | ||||||
|   |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/layers/basic/BasicCompositor.cpp.1127752 firefox-40.0/mozilla-release/gfx/layers/basic/BasicCompositor.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/layers/basic/BasicCompositor.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/layers/basic/BasicCompositor.cpp	2015-08-26 14:07:24.667087889 +0200
 |  | ||||||
| @@ -523,7 +523,7 @@ BasicCompositor::BeginFrame(const nsIntR
 |  | ||||||
|    RefPtr<CompositingRenderTarget> target = CreateRenderTarget(mInvalidRect, INIT_MODE_CLEAR); |  | ||||||
|    if (!target) { |  | ||||||
|      if (!mTarget) { |  | ||||||
| -      mWidget->EndRemoteDrawing();
 |  | ||||||
| +      mWidget->EndRemoteDrawingInRegion(mDrawTarget, mInvalidRegion);
 |  | ||||||
|      } |  | ||||||
|      return; |  | ||||||
|    } |  | ||||||
| @@ -585,7 +585,7 @@ BasicCompositor::EndFrame()
 |  | ||||||
|                        IntPoint(r->x - offset.x, r->y - offset.y)); |  | ||||||
|    } |  | ||||||
|    if (!mTarget) { |  | ||||||
| -    mWidget->EndRemoteDrawing();
 |  | ||||||
| +    mWidget->EndRemoteDrawingInRegion(mDrawTarget, mInvalidRegion);
 |  | ||||||
|    } |  | ||||||
|   |  | ||||||
|    mDrawTarget = nullptr; |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/src/nsRegion.h.1127752 firefox-40.0/mozilla-release/gfx/src/nsRegion.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/src/nsRegion.h.1127752	2015-08-07 17:54:05.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/src/nsRegion.h	2015-08-26 14:07:24.667087889 +0200
 |  | ||||||
| @@ -715,6 +715,12 @@ public:
 |  | ||||||
|      return This(); |  | ||||||
|    } |  | ||||||
|   |  | ||||||
| +  Derived& ScaleInverseRoundOut (float aXScale, float aYScale)
 |  | ||||||
| +  {
 |  | ||||||
| +    mImpl.ScaleInverseRoundOut(aXScale, aYScale);
 |  | ||||||
| +    return This();
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
|    Derived& Transform (const gfx3DMatrix &aTransform) |  | ||||||
|    { |  | ||||||
|      mImpl.Transform(aTransform); |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/thebes/gfxContext.cpp.1127752 firefox-40.0/mozilla-release/gfx/thebes/gfxContext.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/thebes/gfxContext.cpp.1127752	2015-08-07 17:54:05.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/thebes/gfxContext.cpp	2015-08-26 14:07:24.668087868 +0200
 |  | ||||||
| @@ -619,6 +619,23 @@ gfxContext::GetClipExtents()
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  bool |  | ||||||
| +gfxContext::HasComplexClip() const
 |  | ||||||
| +{
 |  | ||||||
| +  for (int i = mStateStack.Length() - 1; i >= 0; i--) {
 |  | ||||||
| +    for (unsigned int c = 0; c < mStateStack[i].pushedClips.Length(); c++) {
 |  | ||||||
| +      const AzureState::PushedClip &clip = mStateStack[i].pushedClips[c];
 |  | ||||||
| +      if (clip.path || !clip.transform.IsRectilinear()) {
 |  | ||||||
| +        return true;
 |  | ||||||
| +      }
 |  | ||||||
| +    }
 |  | ||||||
| +    if (mStateStack[i].clipWasReset) {
 |  | ||||||
| +      break;
 |  | ||||||
| +    }
 |  | ||||||
| +  }
 |  | ||||||
| +  return false;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +bool
 |  | ||||||
|  gfxContext::ClipContainsRect(const gfxRect& aRect) |  | ||||||
|  { |  | ||||||
|    unsigned int lastReset = 0; |  | ||||||
| diff -up firefox-40.0/mozilla-release/gfx/thebes/gfxContext.h.1127752 firefox-40.0/mozilla-release/gfx/thebes/gfxContext.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/gfx/thebes/gfxContext.h.1127752	2015-08-07 17:54:05.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/gfx/thebes/gfxContext.h	2015-08-26 14:07:24.668087868 +0200
 |  | ||||||
| @@ -446,6 +446,11 @@ public:
 |  | ||||||
|      gfxRect GetClipExtents(); |  | ||||||
|   |  | ||||||
|      /** |  | ||||||
| +     * Whether the current clip is not a simple rectangle.
 |  | ||||||
| +     */
 |  | ||||||
| +    bool HasComplexClip() const;
 |  | ||||||
| +
 |  | ||||||
| +    /**
 |  | ||||||
|       * Returns true if the given rectangle is fully contained in the current clip.  |  | ||||||
|       * This is conservative; it may return false even when the given rectangle is  |  | ||||||
|       * fully contained by the current clip. |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1127752 firefox-40.0/mozilla-release/widget/gtk/nsNativeThemeGTK.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1127752	2015-08-26 14:07:24.657088105 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/gtk/nsNativeThemeGTK.cpp	2015-08-26 14:07:24.669087846 +0200
 |  | ||||||
| @@ -33,6 +33,18 @@
 |  | ||||||
|  #include "gfxContext.h" |  | ||||||
|  #include "gfxPlatformGtk.h" |  | ||||||
|  #include "gfxGdkNativeRenderer.h" |  | ||||||
| +#include "mozilla/gfx/BorrowedContext.h"
 |  | ||||||
| +#include "mozilla/gfx/HelpersCairo.h"
 |  | ||||||
| +
 |  | ||||||
| +#ifdef MOZ_X11
 |  | ||||||
| +#  ifdef CAIRO_HAS_XLIB_SURFACE
 |  | ||||||
| +#    include "cairo-xlib.h"
 |  | ||||||
| +#  endif
 |  | ||||||
| +#  ifdef CAIRO_HAS_XLIB_XRENDER_SURFACE
 |  | ||||||
| +#    include "cairo-xlib-xrender.h"
 |  | ||||||
| +#  endif
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  #include <algorithm> |  | ||||||
|  #include <dlfcn.h> |  | ||||||
|   |  | ||||||
| @@ -706,6 +718,158 @@ ThemeRenderer::DrawWithGDK(GdkDrawable *
 |  | ||||||
|   |  | ||||||
|    return NS_OK; |  | ||||||
|  } |  | ||||||
| +#else
 |  | ||||||
| +static void
 |  | ||||||
| +DrawThemeWithCairo(gfxContext* aContext, DrawTarget* aDrawTarget,
 |  | ||||||
| +                   GtkWidgetState aState, GtkThemeWidgetType aGTKWidgetType,
 |  | ||||||
| +                   gint aFlags, GtkTextDirection aDirection, gint aScaleFactor,
 |  | ||||||
| +                   bool aSnapped, const Point& aDrawOrigin, const nsIntSize& aDrawSize,
 |  | ||||||
| +                   GdkRectangle& aGDKRect, nsITheme::Transparency aTransparency)
 |  | ||||||
| +{
 |  | ||||||
| +#ifndef MOZ_TREE_CAIRO
 |  | ||||||
| +  // Directly use the Cairo draw target to render the widget if using system Cairo everywhere.
 |  | ||||||
| +  BorrowedCairoContext borrow(aDrawTarget);
 |  | ||||||
| +  if (borrow.mCairo) {
 |  | ||||||
| +    if (aSnapped) {
 |  | ||||||
| +      cairo_identity_matrix(borrow.mCairo);
 |  | ||||||
| +    }
 |  | ||||||
| +    if (aDrawOrigin != Point(0, 0)) {
 |  | ||||||
| +      cairo_translate(borrow.mCairo, aDrawOrigin.x, aDrawOrigin.y);
 |  | ||||||
| +    }
 |  | ||||||
| +    if (aScaleFactor != 1) {
 |  | ||||||
| +      cairo_scale(borrow.mCairo, aScaleFactor, aScaleFactor);
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
| +    moz_gtk_widget_paint(aGTKWidgetType, borrow.mCairo, &aGDKRect, &aState, aFlags, aDirection);
 |  | ||||||
| +
 |  | ||||||
| +    borrow.Finish();
 |  | ||||||
| +    return;
 |  | ||||||
| +  }
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
| +  // A direct Cairo draw target is not available, so we need to create a temporary one.
 |  | ||||||
| +  bool needClip = !aSnapped || aContext->HasComplexClip();
 |  | ||||||
| +#if defined(MOZ_X11) && defined(CAIRO_HAS_XLIB_SURFACE)
 |  | ||||||
| +  if (!needClip) {
 |  | ||||||
| +    // If using a Cairo xlib surface, then try to reuse it.
 |  | ||||||
| +    BorrowedXlibDrawable borrow(aDrawTarget);
 |  | ||||||
| +    if (borrow.GetDrawable()) {
 |  | ||||||
| +      nsIntSize size = aDrawTarget->GetSize();
 |  | ||||||
| +      cairo_surface_t* surf = nullptr;
 |  | ||||||
| +      // Check if the surface is using XRender.
 |  | ||||||
| +#ifdef CAIRO_HAS_XLIB_XRENDER_SURFACE
 |  | ||||||
| +      if (borrow.GetXRenderFormat()) {
 |  | ||||||
| +        surf = cairo_xlib_surface_create_with_xrender_format(
 |  | ||||||
| +          borrow.GetDisplay(), borrow.GetDrawable(), borrow.GetScreen(),
 |  | ||||||
| +          borrow.GetXRenderFormat(), size.width, size.height);
 |  | ||||||
| +      } else {
 |  | ||||||
| +#else
 |  | ||||||
| +      if (! borrow.GetXRenderFormat()) {
 |  | ||||||
| +#endif
 |  | ||||||
| +        surf = cairo_xlib_surface_create(
 |  | ||||||
| +          borrow.GetDisplay(), borrow.GetDrawable(), borrow.GetVisual(),
 |  | ||||||
| +          size.width, size.height);
 |  | ||||||
| +      }
 |  | ||||||
| +      if (!NS_WARN_IF(!surf)) {
 |  | ||||||
| +        cairo_t* cr = cairo_create(surf);
 |  | ||||||
| +        if (!NS_WARN_IF(!cr)) {
 |  | ||||||
| +          cairo_new_path(cr);
 |  | ||||||
| +          cairo_rectangle(cr, aDrawOrigin.x, aDrawOrigin.y, aDrawSize.width, aDrawSize.height);
 |  | ||||||
| +          cairo_clip(cr);
 |  | ||||||
| +          if (aDrawOrigin != Point(0, 0)) {
 |  | ||||||
| +            cairo_translate(cr, aDrawOrigin.x, aDrawOrigin.y);
 |  | ||||||
| +          }
 |  | ||||||
| +          if (aScaleFactor != 1) {
 |  | ||||||
| +            cairo_scale(cr, aScaleFactor, aScaleFactor);
 |  | ||||||
| +          }
 |  | ||||||
| +
 |  | ||||||
| +          moz_gtk_widget_paint(aGTKWidgetType, cr, &aGDKRect, &aState, aFlags, aDirection);
 |  | ||||||
| +
 |  | ||||||
| +          cairo_destroy(cr);
 |  | ||||||
| +        }
 |  | ||||||
| +        cairo_surface_destroy(surf);
 |  | ||||||
| +      }
 |  | ||||||
| +      borrow.Finish();
 |  | ||||||
| +      return;
 |  | ||||||
| +    }
 |  | ||||||
| +  }
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
| +  // Check if the widget requires complex masking that must be composited.
 |  | ||||||
| +  // Try to directly write to the draw target's pixels if possible.
 |  | ||||||
| +  uint8_t* data;
 |  | ||||||
| +  nsIntSize size;
 |  | ||||||
| +  int32_t stride;
 |  | ||||||
| +  SurfaceFormat format;
 |  | ||||||
| +  if (!needClip && aDrawTarget->LockBits(&data, &size, &stride, &format)) {
 |  | ||||||
| +    // Create a Cairo image surface context the device rectangle.
 |  | ||||||
| +    cairo_surface_t* surf =
 |  | ||||||
| +      cairo_image_surface_create_for_data(
 |  | ||||||
| +        data + int32_t(aDrawOrigin.y) * stride + int32_t(aDrawOrigin.x) * BytesPerPixel(format),
 |  | ||||||
| +        GfxFormatToCairoFormat(format), aDrawSize.width, aDrawSize.height, stride);
 |  | ||||||
| +    if (!NS_WARN_IF(!surf)) {
 |  | ||||||
| +      cairo_t* cr = cairo_create(surf);
 |  | ||||||
| +      if (!NS_WARN_IF(!cr)) {
 |  | ||||||
| +        if (aScaleFactor != 1) {
 |  | ||||||
| +          cairo_scale(cr, aScaleFactor, aScaleFactor);
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +        moz_gtk_widget_paint(aGTKWidgetType, cr, &aGDKRect, &aState, aFlags, aDirection);
 |  | ||||||
| +
 |  | ||||||
| +        cairo_destroy(cr);
 |  | ||||||
| +      }
 |  | ||||||
| +      cairo_surface_destroy(surf);
 |  | ||||||
| +    }
 |  | ||||||
| +    aDrawTarget->ReleaseBits(data);
 |  | ||||||
| +  } else {
 |  | ||||||
| +    // If the widget has any transparency, make sure to choose an alpha format.
 |  | ||||||
| +    format = aTransparency != nsITheme::eOpaque ? SurfaceFormat::B8G8R8A8 : aDrawTarget->GetFormat();
 |  | ||||||
| +    // Create a temporary data surface to render the widget into.
 |  | ||||||
| +    RefPtr<DataSourceSurface> dataSurface =
 |  | ||||||
| +      Factory::CreateDataSourceSurface(aDrawSize, format, aTransparency != nsITheme::eOpaque);
 |  | ||||||
| +    DataSourceSurface::MappedSurface map;
 |  | ||||||
| +    if (!NS_WARN_IF(!(dataSurface && dataSurface->Map(DataSourceSurface::MapType::WRITE, &map)))) {
 |  | ||||||
| +      // Create a Cairo image surface wrapping the data surface.
 |  | ||||||
| +      cairo_surface_t* surf =
 |  | ||||||
| +        cairo_image_surface_create_for_data(map.mData, GfxFormatToCairoFormat(format),
 |  | ||||||
| +                                            aDrawSize.width, aDrawSize.height, map.mStride);
 |  | ||||||
| +      cairo_t* cr = nullptr;
 |  | ||||||
| +      if (!NS_WARN_IF(!surf)) {
 |  | ||||||
| +        cr = cairo_create(surf);
 |  | ||||||
| +        if (!NS_WARN_IF(!cr)) {
 |  | ||||||
| +          if (aScaleFactor != 1) {
 |  | ||||||
| +            cairo_scale(cr, aScaleFactor, aScaleFactor);
 |  | ||||||
| +          }
 |  | ||||||
| +
 |  | ||||||
| +          moz_gtk_widget_paint(aGTKWidgetType, cr, &aGDKRect, &aState, aFlags, aDirection);
 |  | ||||||
| +        }
 |  | ||||||
| +      }
 |  | ||||||
| +
 |  | ||||||
| +      // Unmap the surface before using it as a source
 |  | ||||||
| +      dataSurface->Unmap();
 |  | ||||||
| +
 |  | ||||||
| +      if (cr) {
 |  | ||||||
| +        if (needClip || aTransparency != nsITheme::eOpaque) {
 |  | ||||||
| +          // The widget either needs to be masked or has transparency, so use the slower drawing path.
 |  | ||||||
| +          aDrawTarget->DrawSurface(dataSurface,
 |  | ||||||
| +                                   Rect(aDrawOrigin, Size(aDrawSize)),
 |  | ||||||
| +                                   Rect(0, 0, aDrawSize.width, aDrawSize.height));
 |  | ||||||
| +        } else {
 |  | ||||||
| +          // The widget is a simple opaque rectangle, so just copy it out.
 |  | ||||||
| +          aDrawTarget->CopySurface(dataSurface,
 |  | ||||||
| +                                   IntRect(0, 0, aDrawSize.width, aDrawSize.height),
 |  | ||||||
| +                                   TruncatedToInt(aDrawOrigin));
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +        cairo_destroy(cr);
 |  | ||||||
| +      }
 |  | ||||||
| +
 |  | ||||||
| +      if (surf) {
 |  | ||||||
| +        cairo_surface_destroy(surf);
 |  | ||||||
| +      }
 |  | ||||||
| +    }
 |  | ||||||
| +  }
 |  | ||||||
| +}
 |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|  bool |  | ||||||
| @@ -800,10 +964,6 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|                                         const nsRect& aRect, |  | ||||||
|                                         const nsRect& aDirtyRect) |  | ||||||
|  { |  | ||||||
| -#if (MOZ_WIDGET_GTK != 2)
 |  | ||||||
| -  DrawTarget& aDrawTarget = *aContext->GetDrawTarget();
 |  | ||||||
| -#endif
 |  | ||||||
| -
 |  | ||||||
|    GtkWidgetState state; |  | ||||||
|    GtkThemeWidgetType gtkWidgetType; |  | ||||||
|    GtkTextDirection direction = GetTextDirection(aFrame); |  | ||||||
| @@ -823,8 +983,8 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|    // to provide crisper and faster drawing. |  | ||||||
|    // Don't snap if it's a non-unit scale factor. We're going to have to take |  | ||||||
|    // slow paths then in any case. |  | ||||||
| -  bool snapXY = ctx->UserToDevicePixelSnapped(rect);
 |  | ||||||
| -  if (snapXY) {
 |  | ||||||
| +  bool snapped = ctx->UserToDevicePixelSnapped(rect);
 |  | ||||||
| +  if (snapped) {
 |  | ||||||
|      // Leave rect in device coords but make dirtyRect consistent. |  | ||||||
|      dirtyRect = ctx->UserToDevice(dirtyRect); |  | ||||||
|    } |  | ||||||
| @@ -853,23 +1013,6 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|        || !drawingRect.IntersectRect(overflowRect, drawingRect)) |  | ||||||
|      return NS_OK; |  | ||||||
|   |  | ||||||
| -  // gdk rectangles are wrt the drawing rect.
 |  | ||||||
| -
 |  | ||||||
| -  GdkRectangle gdk_rect = {-drawingRect.x/scaleFactor,
 |  | ||||||
| -                           -drawingRect.y/scaleFactor,
 |  | ||||||
| -                           widgetRect.width/scaleFactor,
 |  | ||||||
| -                           widgetRect.height/scaleFactor};
 |  | ||||||
| -
 |  | ||||||
| -  // translate everything so (0,0) is the top left of the drawingRect
 |  | ||||||
| -  gfxContextAutoSaveRestore autoSR(ctx);
 |  | ||||||
| -  gfxMatrix tm;
 |  | ||||||
| -  if (!snapXY) { // else rects are in device coords
 |  | ||||||
| -    tm = ctx->CurrentMatrix();
 |  | ||||||
| -  }
 |  | ||||||
| -  tm.Translate(rect.TopLeft() + gfxPoint(drawingRect.x, drawingRect.y));
 |  | ||||||
| -  tm.Scale(scaleFactor, scaleFactor); // Draw in GDK coords
 |  | ||||||
| -  ctx->SetMatrix(tm);
 |  | ||||||
| -
 |  | ||||||
|    NS_ASSERTION(!IsWidgetTypeDisabled(mDisabledWidgetTypes, aWidgetType), |  | ||||||
|                 "Trying to render an unsafe widget!"); |  | ||||||
|   |  | ||||||
| @@ -879,7 +1022,27 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|      gdk_error_trap_push (); |  | ||||||
|    } |  | ||||||
|   |  | ||||||
| +  Transparency transparency = GetWidgetTransparency(aFrame, aWidgetType);
 |  | ||||||
| +
 |  | ||||||
| +  // gdk rectangles are wrt the drawing rect.
 |  | ||||||
| +  GdkRectangle gdk_rect = {-drawingRect.x/scaleFactor,
 |  | ||||||
| +                           -drawingRect.y/scaleFactor,
 |  | ||||||
| +                           widgetRect.width/scaleFactor,
 |  | ||||||
| +                           widgetRect.height/scaleFactor};
 |  | ||||||
| +
 |  | ||||||
| +  // translate everything so (0,0) is the top left of the drawingRect
 |  | ||||||
| +  gfxPoint origin = rect.TopLeft() + drawingRect.TopLeft();
 |  | ||||||
| +
 |  | ||||||
|  #if (MOZ_WIDGET_GTK == 2) |  | ||||||
| +  gfxContextAutoSaveRestore autoSR(ctx);
 |  | ||||||
| +  gfxMatrix matrix;
 |  | ||||||
| +  if (!snapped) { // else rects are in device coords
 |  | ||||||
| +    matrix = ctx->CurrentMatrix();
 |  | ||||||
| +  }
 |  | ||||||
| +  matrix.Translate(origin);
 |  | ||||||
| +  matrix.Scale(scaleFactor, scaleFactor); // Draw in GDK coords
 |  | ||||||
| +  ctx->SetMatrix(matrix);
 |  | ||||||
| +
 |  | ||||||
|    // The gdk_clip is just advisory here, meaning "you don't |  | ||||||
|    // need to draw outside this rect if you don't feel like it!" |  | ||||||
|    GdkRectangle gdk_clip = {0, 0, drawingRect.width, drawingRect.height}; |  | ||||||
| @@ -891,7 +1054,7 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|    // clip rect we provide, so we cannot advertise support for clipping within |  | ||||||
|    // the widget bounds. |  | ||||||
|    uint32_t rendererFlags = 0; |  | ||||||
| -  if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque) {
 |  | ||||||
| +  if (transparency == eOpaque) {
 |  | ||||||
|      rendererFlags |= gfxGdkNativeRenderer::DRAW_IS_OPAQUE; |  | ||||||
|    } |  | ||||||
|   |  | ||||||
| @@ -901,11 +1064,10 @@ nsNativeThemeGTK::DrawWidgetBackground(n
 |  | ||||||
|   |  | ||||||
|    renderer.Draw(ctx, drawingRect.Size(), rendererFlags, colormap); |  | ||||||
|  #else  |  | ||||||
| -  cairo_t *cairo_ctx =
 |  | ||||||
| -    (cairo_t*)aDrawTarget.GetNativeSurface(NativeSurfaceType::CAIRO_CONTEXT); 
 |  | ||||||
| -  MOZ_ASSERT(cairo_ctx);
 |  | ||||||
| -  moz_gtk_widget_paint(gtkWidgetType, cairo_ctx, &gdk_rect, 
 |  | ||||||
| -                       &state, flags, direction);
 |  | ||||||
| +  DrawThemeWithCairo(ctx, aContext->GetDrawTarget(),
 |  | ||||||
| +                     state, gtkWidgetType, flags, direction, scaleFactor,
 |  | ||||||
| +                     snapped, ToPoint(origin), drawingRect.Size(),
 |  | ||||||
| +                     gdk_rect, transparency);
 |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|    if (!safeState) { |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/gtk/nsScreenGtk.cpp.1127752 firefox-40.0/mozilla-release/widget/gtk/nsScreenGtk.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/gtk/nsScreenGtk.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/gtk/nsScreenGtk.cpp	2015-08-26 14:07:24.669087846 +0200
 |  | ||||||
| @@ -12,6 +12,7 @@
 |  | ||||||
|  #endif |  | ||||||
|  #include <gtk/gtk.h> |  | ||||||
|  #include <dlfcn.h> |  | ||||||
| +#include "gfxPlatformGtk.h"
 |  | ||||||
|   |  | ||||||
|  static uint32_t sScreenId = 0; |  | ||||||
|   |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/gtk/nsWindow.cpp.1127752 firefox-40.0/mozilla-release/widget/gtk/nsWindow.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/gtk/nsWindow.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/gtk/nsWindow.cpp	2015-08-26 14:07:24.670087825 +0200
 |  | ||||||
| @@ -2050,71 +2050,52 @@ gdk_window_flash(GdkWindow *    aGdkWind
 |  | ||||||
|  #endif // DEBUG |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| -struct ExposeRegion
 |  | ||||||
| -{
 |  | ||||||
| -    nsIntRegion mRegion;
 |  | ||||||
| -
 |  | ||||||
|  #if (MOZ_WIDGET_GTK == 2) |  | ||||||
| -    GdkRectangle *mRects;
 |  | ||||||
| -    GdkRectangle *mRectsEnd;
 |  | ||||||
| -
 |  | ||||||
| -    ExposeRegion() : mRects(nullptr)
 |  | ||||||
| -    {
 |  | ||||||
| -    }
 |  | ||||||
| -    ~ExposeRegion()
 |  | ||||||
| -    {
 |  | ||||||
| -        g_free(mRects);
 |  | ||||||
| -    }
 |  | ||||||
| -    bool Init(GdkEventExpose *aEvent)
 |  | ||||||
| -    {
 |  | ||||||
| -        gint nrects;
 |  | ||||||
| -        gdk_region_get_rectangles(aEvent->region, &mRects, &nrects);
 |  | ||||||
| -
 |  | ||||||
| -        if (nrects > MAX_RECTS_IN_REGION) {
 |  | ||||||
| -            // Just use the bounding box
 |  | ||||||
| -            mRects[0] = aEvent->area;
 |  | ||||||
| -            nrects = 1;
 |  | ||||||
| -        }
 |  | ||||||
| +static bool
 |  | ||||||
| +ExtractExposeRegion(nsIntRegion& aRegion, GdkEventExpose* aEvent)
 |  | ||||||
| +{
 |  | ||||||
| +  GdkRectangle* rects;
 |  | ||||||
| +  gint nrects;
 |  | ||||||
| +  gdk_region_get_rectangles(aEvent->region, &rects, &nrects);
 |  | ||||||
| +
 |  | ||||||
| +  if (nrects > MAX_RECTS_IN_REGION) {
 |  | ||||||
| +      // Just use the bounding box
 |  | ||||||
| +      rects[0] = aEvent->area;
 |  | ||||||
| +      nrects = 1;
 |  | ||||||
| +  }
 |  | ||||||
|   |  | ||||||
| -        mRectsEnd = mRects + nrects;
 |  | ||||||
| +  for (GdkRectangle* r = rects; r < rects + nrects; r++) {
 |  | ||||||
| +      aRegion.Or(aRegion, nsIntRect(r->x, r->y, r->width, r->height));
 |  | ||||||
| +      LOGDRAW(("\t%d %d %d %d\n", r->x, r->y, r->width, r->height));
 |  | ||||||
| +  }
 |  | ||||||
|   |  | ||||||
| -        for (GdkRectangle *r = mRects; r < mRectsEnd; r++) {
 |  | ||||||
| -            mRegion.Or(mRegion, nsIntRect(r->x, r->y, r->width, r->height));
 |  | ||||||
| -            LOGDRAW(("\t%d %d %d %d\n", r->x, r->y, r->width, r->height));
 |  | ||||||
| -        }
 |  | ||||||
| -        return true;
 |  | ||||||
| -    }
 |  | ||||||
| +  g_free(rects);
 |  | ||||||
| +  return true;
 |  | ||||||
| +}
 |  | ||||||
|   |  | ||||||
|  #else |  | ||||||
|  # ifdef cairo_copy_clip_rectangle_list |  | ||||||
|  #  error "Looks like we're including Mozilla's cairo instead of system cairo" |  | ||||||
|  # endif |  | ||||||
| -    cairo_rectangle_list_t *mRects;
 |  | ||||||
| +static bool
 |  | ||||||
| +ExtractExposeRegion(nsIntRegion& aRegion, cairo_t* cr)
 |  | ||||||
| +{
 |  | ||||||
| +  cairo_rectangle_list_t* rects = cairo_copy_clip_rectangle_list(cr);
 |  | ||||||
| +  if (rects->status != CAIRO_STATUS_SUCCESS) {
 |  | ||||||
| +      NS_WARNING("Failed to obtain cairo rectangle list.");
 |  | ||||||
| +      return false;
 |  | ||||||
| +  }
 |  | ||||||
|   |  | ||||||
| -    ExposeRegion() : mRects(nullptr)
 |  | ||||||
| -    {
 |  | ||||||
| -    }
 |  | ||||||
| -    ~ExposeRegion()
 |  | ||||||
| -    {
 |  | ||||||
| -        cairo_rectangle_list_destroy(mRects);
 |  | ||||||
| -    }
 |  | ||||||
| -    bool Init(cairo_t* cr)
 |  | ||||||
| -    {
 |  | ||||||
| -        mRects = cairo_copy_clip_rectangle_list(cr);
 |  | ||||||
| -        if (mRects->status != CAIRO_STATUS_SUCCESS) {
 |  | ||||||
| -            NS_WARNING("Failed to obtain cairo rectangle list.");
 |  | ||||||
| -            return false;
 |  | ||||||
| -        }
 |  | ||||||
| +  for (int i = 0; i < rects->num_rectangles; i++)  {
 |  | ||||||
| +      const cairo_rectangle_t& r = rects->rectangles[i];
 |  | ||||||
| +      aRegion.Or(aRegion, nsIntRect(r.x, r.y, r.width, r.height));
 |  | ||||||
| +      LOGDRAW(("\t%d %d %d %d\n", r.x, r.y, r.width, r.height));
 |  | ||||||
| +  }
 |  | ||||||
|   |  | ||||||
| -        for (int i = 0; i < mRects->num_rectangles; i++)  {
 |  | ||||||
| -            const cairo_rectangle_t& r = mRects->rectangles[i];
 |  | ||||||
| -            mRegion.Or(mRegion, nsIntRect(r.x, r.y, r.width, r.height));
 |  | ||||||
| -            LOGDRAW(("\t%d %d %d %d\n", r.x, r.y, r.width, r.height));
 |  | ||||||
| -        }
 |  | ||||||
| -        return true;
 |  | ||||||
| -    }
 |  | ||||||
| +  cairo_rectangle_list_destroy(rects);
 |  | ||||||
| +  return true;
 |  | ||||||
| +}
 |  | ||||||
|  #endif |  | ||||||
| -};
 |  | ||||||
|   |  | ||||||
|  #if (MOZ_WIDGET_GTK == 2) |  | ||||||
|  gboolean |  | ||||||
| @@ -2137,17 +2118,17 @@ nsWindow::OnExposeEvent(cairo_t *cr)
 |  | ||||||
|      if (!listener) |  | ||||||
|          return FALSE; |  | ||||||
|   |  | ||||||
| -    ExposeRegion exposeRegion;
 |  | ||||||
| +    nsIntRegion exposeRegion;
 |  | ||||||
|  #if (MOZ_WIDGET_GTK == 2) |  | ||||||
| -    if (!exposeRegion.Init(aEvent)) {
 |  | ||||||
| +    if (!ExtractExposeRegion(exposeRegion, aEvent)) {
 |  | ||||||
|  #else |  | ||||||
| -    if (!exposeRegion.Init(cr)) {
 |  | ||||||
| +    if (!ExtractExposeRegion(exposeRegion, cr)) {
 |  | ||||||
|  #endif |  | ||||||
|          return FALSE; |  | ||||||
|      } |  | ||||||
|   |  | ||||||
|      gint scale = GdkScaleFactor(); |  | ||||||
| -    nsIntRegion& region = exposeRegion.mRegion;
 |  | ||||||
| +    nsIntRegion region = exposeRegion;
 |  | ||||||
|      region.ScaleRoundOut(scale, scale); |  | ||||||
|   |  | ||||||
|      ClientLayerManager *clientLayers = |  | ||||||
| @@ -2240,33 +2221,11 @@ nsWindow::OnExposeEvent(cairo_t *cr)
 |  | ||||||
|          return TRUE; |  | ||||||
|      } |  | ||||||
|   |  | ||||||
| -    gfxASurface* surf;
 |  | ||||||
| -#if (MOZ_WIDGET_GTK == 2)
 |  | ||||||
| -    surf = GetThebesSurface();
 |  | ||||||
| -#else
 |  | ||||||
| -    surf = GetThebesSurface(cr);
 |  | ||||||
| -#endif
 |  | ||||||
| -
 |  | ||||||
| -    nsRefPtr<gfxContext> ctx;
 |  | ||||||
| -    if (gfxPlatform::GetPlatform()->
 |  | ||||||
| -            SupportsAzureContentForType(BackendType::CAIRO)) {
 |  | ||||||
| -        IntSize intSize(surf->GetSize().width, surf->GetSize().height);
 |  | ||||||
| -        RefPtr<DrawTarget> dt =
 |  | ||||||
| -          gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(surf, intSize);
 |  | ||||||
| -        ctx = new gfxContext(dt);
 |  | ||||||
| -    } else if (gfxPlatform::GetPlatform()->
 |  | ||||||
| -                   SupportsAzureContentForType(BackendType::SKIA) &&
 |  | ||||||
| -               surf->GetType() == gfxSurfaceType::Image) {
 |  | ||||||
| -       gfxImageSurface* imgSurf = static_cast<gfxImageSurface*>(surf);
 |  | ||||||
| -       SurfaceFormat format = ImageFormatToSurfaceFormat(imgSurf->Format());
 |  | ||||||
| -       IntSize intSize(surf->GetSize().width, surf->GetSize().height);
 |  | ||||||
| -       RefPtr<DrawTarget> dt =
 |  | ||||||
| -         gfxPlatform::GetPlatform()->CreateDrawTargetForData(
 |  | ||||||
| -                        imgSurf->Data(), intSize, imgSurf->Stride(), format);
 |  | ||||||
| -       ctx = new gfxContext(dt);
 |  | ||||||
| -    } else {
 |  | ||||||
| -        MOZ_CRASH("Unexpected content type");
 |  | ||||||
| +    RefPtr<DrawTarget> dt = StartRemoteDrawing();
 |  | ||||||
| +    if(!dt) {
 |  | ||||||
| +        return FALSE;
 |  | ||||||
|      } |  | ||||||
| +    nsRefPtr<gfxContext> ctx = new gfxContext(dt);
 |  | ||||||
|   |  | ||||||
|  #ifdef MOZ_X11 |  | ||||||
|      nsIntRect boundsRect; // for shaped only |  | ||||||
| @@ -2341,11 +2300,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
 |  | ||||||
|      } |  | ||||||
|  #  ifdef MOZ_HAVE_SHMIMAGE |  | ||||||
|      if (mShmImage && MOZ_LIKELY(!mIsDestroyed)) { |  | ||||||
| -#if (MOZ_WIDGET_GTK == 2)
 |  | ||||||
| -        mShmImage->Put(mGdkWindow, exposeRegion.mRects, exposeRegion.mRectsEnd);
 |  | ||||||
| -#else
 |  | ||||||
| -        mShmImage->Put(mGdkWindow, exposeRegion.mRects);
 |  | ||||||
| -#endif
 |  | ||||||
| +        mShmImage->Put(mGdkWindow, exposeRegion);
 |  | ||||||
|      } |  | ||||||
|  #  endif  // MOZ_HAVE_SHMIMAGE |  | ||||||
|  #endif // MOZ_X11 |  | ||||||
| @@ -6262,24 +6217,49 @@ nsWindow::StartRemoteDrawing()
 |  | ||||||
|      return nullptr; |  | ||||||
|    } |  | ||||||
|   |  | ||||||
| -  IntSize size(surf->GetSize().width, surf->GetSize().height);
 |  | ||||||
| +  nsIntSize size = surf->GetSize();
 |  | ||||||
|    if (size.width <= 0 || size.height <= 0) { |  | ||||||
|      return nullptr; |  | ||||||
|    } |  | ||||||
|   |  | ||||||
| -  return gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(surf, size);
 |  | ||||||
| +  gfxPlatform *platform = gfxPlatform::GetPlatform();
 |  | ||||||
| +  if (platform->SupportsAzureContentForType(BackendType::CAIRO) ||
 |  | ||||||
| +      surf->GetType() == gfxSurfaceType::Xlib) {
 |  | ||||||
| +    return platform->CreateDrawTargetForSurface(surf, size);
 |  | ||||||
| +  } else if (platform->SupportsAzureContentForType(BackendType::SKIA) &&
 |  | ||||||
| +             surf->GetType() == gfxSurfaceType::Image) {
 |  | ||||||
| +    gfxImageSurface* imgSurf = static_cast<gfxImageSurface*>(surf);
 |  | ||||||
| +    SurfaceFormat format = ImageFormatToSurfaceFormat(imgSurf->Format());
 |  | ||||||
| +    return platform->CreateDrawTargetForData(
 |  | ||||||
| +                     imgSurf->Data(), size, imgSurf->Stride(), format);
 |  | ||||||
| +  } else {
 |  | ||||||
| +    return nullptr;
 |  | ||||||
| +  }
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -// return the gfxASurface for rendering to this widget
 |  | ||||||
| -gfxASurface*
 |  | ||||||
| -nsWindow::GetThebesSurface()
 |  | ||||||
| -#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +void
 |  | ||||||
| +nsWindow::EndRemoteDrawingInRegion(DrawTarget* aDrawTarget, nsIntRegion& aInvalidRegion)
 |  | ||||||
|  { |  | ||||||
| -    return GetThebesSurface(nullptr);
 |  | ||||||
| +#ifdef MOZ_X11
 |  | ||||||
| +#  ifdef MOZ_HAVE_SHMIMAGE
 |  | ||||||
| +  if (!mGdkWindow || mIsFullyObscured || !mHasMappedToplevel || mIsDestroyed ||
 |  | ||||||
| +      !mShmImage)
 |  | ||||||
| +    return;
 |  | ||||||
| +
 |  | ||||||
| +  gint scale = GdkScaleFactor();
 |  | ||||||
| +  if (scale != 1) {
 |  | ||||||
| +    aInvalidRegion.ScaleInverseRoundOut(scale, scale);
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  mShmImage->Put(mGdkWindow, aInvalidRegion);
 |  | ||||||
| +
 |  | ||||||
| +#  endif // MOZ_HAVE_SHMIMAGE
 |  | ||||||
| +#endif // MOZ_X11
 |  | ||||||
|  } |  | ||||||
| +
 |  | ||||||
| +// return the gfxASurface for rendering to this widget
 |  | ||||||
|  gfxASurface* |  | ||||||
| -nsWindow::GetThebesSurface(cairo_t *cr)
 |  | ||||||
| -#endif
 |  | ||||||
| +nsWindow::GetThebesSurface()
 |  | ||||||
|  { |  | ||||||
|      if (!mGdkWindow) |  | ||||||
|          return nullptr; |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/gtk/nsWindow.h.1127752 firefox-40.0/mozilla-release/widget/gtk/nsWindow.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/gtk/nsWindow.h.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/gtk/nsWindow.h	2015-08-26 14:07:24.671087803 +0200
 |  | ||||||
| @@ -194,7 +194,10 @@ public:
 |  | ||||||
|                                                 guint            aTime, |  | ||||||
|                                                 gpointer         aData); |  | ||||||
|   |  | ||||||
| -  mozilla::TemporaryRef<mozilla::gfx::DrawTarget> StartRemoteDrawing() override;
 |  | ||||||
| +    virtual mozilla::TemporaryRef<mozilla::gfx::DrawTarget>
 |  | ||||||
| +                       StartRemoteDrawing() override;
 |  | ||||||
| +    virtual void       EndRemoteDrawingInRegion(mozilla::gfx::DrawTarget* aDrawTarget,
 |  | ||||||
| +                                                nsIntRegion& aInvalidRegion) override;
 |  | ||||||
|   |  | ||||||
|  private: |  | ||||||
|      void               UpdateAlpha(gfxPattern* aPattern, nsIntRect aBoundsRect); |  | ||||||
| @@ -467,9 +470,6 @@ private:
 |  | ||||||
|                                            LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE, |  | ||||||
|                                            LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT, |  | ||||||
|                                            bool* aAllowRetaining = nullptr) override; |  | ||||||
| -#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| -    gfxASurface* GetThebesSurface(cairo_t *cr);
 |  | ||||||
| -#endif
 |  | ||||||
|   |  | ||||||
|      void CleanLayerManagerRecursive(); |  | ||||||
|   |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/nsIWidget.h.1127752 firefox-40.0/mozilla-release/widget/nsIWidget.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/nsIWidget.h.1127752	2015-08-26 14:07:24.671087803 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/nsIWidget.h	2015-08-26 14:07:59.529337002 +0200
 |  | ||||||
| @@ -1657,6 +1657,9 @@ class nsIWidget : public nsISupports {
 |  | ||||||
|       * after each composition. |  | ||||||
|       */ |  | ||||||
|      virtual void EndRemoteDrawing() = 0; |  | ||||||
| +    virtual void EndRemoteDrawingInRegion(mozilla::gfx::DrawTarget* aDrawTarget, nsIntRegion& aInvalidRegion) {
 |  | ||||||
| +      EndRemoteDrawing();
 |  | ||||||
| +    }
 |  | ||||||
|   |  | ||||||
|      /** |  | ||||||
|       * A hook for the widget to prepare a Compositor, during the latter's initialization. |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/nsShmImage.cpp.1127752 firefox-40.0/mozilla-release/widget/nsShmImage.cpp
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/nsShmImage.cpp.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/nsShmImage.cpp	2015-08-26 14:07:24.672087781 +0200
 |  | ||||||
| @@ -121,7 +121,7 @@ nsShmImage::AsSurface()
 |  | ||||||
|   |  | ||||||
|  #if (MOZ_WIDGET_GTK == 2) |  | ||||||
|  void |  | ||||||
| -nsShmImage::Put(GdkWindow* aWindow, GdkRectangle* aRects, GdkRectangle* aEnd)
 |  | ||||||
| +nsShmImage::Put(GdkWindow* aWindow, const nsIntRegion& aRegion)
 |  | ||||||
|  { |  | ||||||
|      GdkDrawable* gd; |  | ||||||
|      gint dx, dy; |  | ||||||
| @@ -131,7 +131,8 @@ nsShmImage::Put(GdkWindow* aWindow, GdkR
 |  | ||||||
|      Drawable d = GDK_DRAWABLE_XID(gd); |  | ||||||
|   |  | ||||||
|      GC gc = XCreateGC(dpy, d, 0, nullptr); |  | ||||||
| -    for (GdkRectangle* r = aRects; r < aEnd; r++) {
 |  | ||||||
| +    nsIntRegionRectIterator iter(aRegion);
 |  | ||||||
| +    for (const nsIntRect *r = iter.Next(); r; r = iter.Next()) {
 |  | ||||||
|          XShmPutImage(dpy, d, gc, mImage, |  | ||||||
|                       r->x, r->y, |  | ||||||
|                       r->x - dx, r->y - dy, |  | ||||||
| @@ -151,20 +152,19 @@ nsShmImage::Put(GdkWindow* aWindow, GdkR
 |  | ||||||
|   |  | ||||||
|  #elif (MOZ_WIDGET_GTK == 3) |  | ||||||
|  void |  | ||||||
| -nsShmImage::Put(GdkWindow* aWindow, cairo_rectangle_list_t* aRects)
 |  | ||||||
| +nsShmImage::Put(GdkWindow* aWindow, const nsIntRegion& aRegion)
 |  | ||||||
|  { |  | ||||||
|      Display* dpy = gdk_x11_get_default_xdisplay(); |  | ||||||
|      Drawable d = GDK_WINDOW_XID(aWindow); |  | ||||||
|      int dx = 0, dy = 0; |  | ||||||
|   |  | ||||||
|      GC gc = XCreateGC(dpy, d, 0, nullptr); |  | ||||||
| -    cairo_rectangle_t r;
 |  | ||||||
| -    for (int i = 0; i < aRects->num_rectangles; i++) {
 |  | ||||||
| -        r = aRects->rectangles[i];
 |  | ||||||
| +    nsIntRegionRectIterator iter(aRegion);
 |  | ||||||
| +    for (const nsIntRect *r = iter.Next(); r; r = iter.Next()) {
 |  | ||||||
|          XShmPutImage(dpy, d, gc, mImage, |  | ||||||
| -                     r.x, r.y,
 |  | ||||||
| -                     r.x - dx, r.y - dy,
 |  | ||||||
| -                     r.width, r.height,
 |  | ||||||
| +                     r->x, r->y,
 |  | ||||||
| +                     r->x - dx, r->y - dy,
 |  | ||||||
| +                     r->width, r->height,
 |  | ||||||
|                       False); |  | ||||||
|      } |  | ||||||
|   |  | ||||||
| diff -up firefox-40.0/mozilla-release/widget/nsShmImage.h.1127752 firefox-40.0/mozilla-release/widget/nsShmImage.h
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/nsShmImage.h.1127752	2015-08-07 17:54:22.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/nsShmImage.h	2015-08-26 14:07:24.672087781 +0200
 |  | ||||||
| @@ -63,10 +63,8 @@ private:
 |  | ||||||
|  public: |  | ||||||
|      already_AddRefed<gfxASurface> AsSurface(); |  | ||||||
|   |  | ||||||
| -#if (MOZ_WIDGET_GTK == 2)
 |  | ||||||
| -    void Put(GdkWindow* aWindow, GdkRectangle* aRects, GdkRectangle* aEnd);
 |  | ||||||
| -#elif (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| -    void Put(GdkWindow* aWindow, cairo_rectangle_list_t* aRects);
 |  | ||||||
| +#ifdef MOZ_WIDGET_GTK
 |  | ||||||
| +    void Put(GdkWindow* aWindow, const nsIntRegion& aRegion);
 |  | ||||||
|  #elif defined(MOZ_WIDGET_QT) |  | ||||||
|      void Put(QWindow* aWindow, QRect& aRect); |  | ||||||
|  #endif |  | ||||||
| @ -1,423 +0,0 @@ | |||||||
| diff -up mozilla-release/toolkit/mozapps/downloads/nsHelperAppDlg.js.1129873-apppicker mozilla-release/toolkit/mozapps/downloads/nsHelperAppDlg.js
 |  | ||||||
| --- mozilla-release/toolkit/mozapps/downloads/nsHelperAppDlg.js.1129873-apppicker	2015-05-25 23:28:55.000000000 +0200
 |  | ||||||
| +++ mozilla-release/toolkit/mozapps/downloads/nsHelperAppDlg.js	2015-06-09 09:37:35.313305562 +0200
 |  | ||||||
| @@ -1004,6 +1004,34 @@ nsUnknownContentTypeDialog.prototype = {
 |  | ||||||
|      return file.leafName; |  | ||||||
|    }, |  | ||||||
|   |  | ||||||
| +  finishChooseApp: function() {
 |  | ||||||
| +    if (this.chosenApp) {
 |  | ||||||
| +      // Show the "handler" menulist since we have a (user-specified)
 |  | ||||||
| +      // application now.
 |  | ||||||
| +      this.dialogElement("modeDeck").setAttribute("selectedIndex", "0");
 |  | ||||||
| +
 |  | ||||||
| +      // Update dialog.
 |  | ||||||
| +      var otherHandler = this.dialogElement("otherHandler");
 |  | ||||||
| +      otherHandler.removeAttribute("hidden");
 |  | ||||||
| +      otherHandler.setAttribute("path", this.getPath(this.chosenApp.executable));
 |  | ||||||
| +#ifdef XP_WIN
 |  | ||||||
| +      otherHandler.label = this.getFileDisplayName(this.chosenApp.executable);
 |  | ||||||
| +#else
 |  | ||||||
| +      otherHandler.label = this.chosenApp.name;
 |  | ||||||
| +#endif
 |  | ||||||
| +      this.dialogElement("openHandler").selectedIndex = 1;
 |  | ||||||
| +      this.dialogElement("openHandler").setAttribute("lastSelectedItemID", "otherHandler");
 |  | ||||||
| +
 |  | ||||||
| +      this.dialogElement("mode").selectedItem = this.dialogElement("open");
 |  | ||||||
| +    }
 |  | ||||||
| +    else {
 |  | ||||||
| +      var openHandler = this.dialogElement("openHandler");
 |  | ||||||
| +      var lastSelectedID = openHandler.getAttribute("lastSelectedItemID");
 |  | ||||||
| +      if (!lastSelectedID)
 |  | ||||||
| +        lastSelectedID = "defaultHandler";
 |  | ||||||
| +      openHandler.selectedItem = this.dialogElement(lastSelectedID);
 |  | ||||||
| +    }
 |  | ||||||
| +  },
 |  | ||||||
|    // chooseApp:  Open file picker and prompt user for application. |  | ||||||
|    chooseApp: function() { |  | ||||||
|  #ifdef XP_WIN |  | ||||||
| @@ -1047,7 +1075,23 @@ nsUnknownContentTypeDialog.prototype = {
 |  | ||||||
|          params.handlerApp.executable.isFile()) { |  | ||||||
|        // Remember the file they chose to run. |  | ||||||
|        this.chosenApp = params.handlerApp; |  | ||||||
| -
 |  | ||||||
| +    }
 |  | ||||||
| +#else
 |  | ||||||
| +#if MOZ_WIDGET_GTK == 3
 |  | ||||||
| +    var nsIApplicationChooser = Components.interfaces.nsIApplicationChooser;
 |  | ||||||
| +    var appChooser = Components.classes["@mozilla.org/applicationchooser;1"]
 |  | ||||||
| +                               .createInstance(nsIApplicationChooser);
 |  | ||||||
| +    appChooser.init(this.mDialog, this.dialogElement("strings").getString("chooseAppFilePickerTitle"));
 |  | ||||||
| +    var contentTypeDialogObj = this;
 |  | ||||||
| +    let appChooserCallback = function appChooserCallback_done(aResult) {
 |  | ||||||
| +      if (aResult) {
 |  | ||||||
| +         contentTypeDialogObj.chosenApp = aResult.QueryInterface(Components.interfaces.nsILocalHandlerApp);
 |  | ||||||
| +      }
 |  | ||||||
| +      contentTypeDialogObj.finishChooseApp();
 |  | ||||||
| +    };
 |  | ||||||
| +    appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback);
 |  | ||||||
| +    // The finishChooseApp is called from appChooserCallback
 |  | ||||||
| +    return;
 |  | ||||||
|  #else |  | ||||||
|      var nsIFilePicker = Components.interfaces.nsIFilePicker; |  | ||||||
|      var fp = Components.classes["@mozilla.org/filepicker;1"] |  | ||||||
| @@ -1065,29 +1109,11 @@ nsUnknownContentTypeDialog.prototype = {
 |  | ||||||
|                     createInstance(Components.interfaces.nsILocalHandlerApp); |  | ||||||
|        localHandlerApp.executable = fp.file; |  | ||||||
|        this.chosenApp = localHandlerApp; |  | ||||||
| -#endif
 |  | ||||||
| -
 |  | ||||||
| -      // Show the "handler" menulist since we have a (user-specified)
 |  | ||||||
| -      // application now.
 |  | ||||||
| -      this.dialogElement("modeDeck").setAttribute("selectedIndex", "0");
 |  | ||||||
| -
 |  | ||||||
| -      // Update dialog.
 |  | ||||||
| -      var otherHandler = this.dialogElement("otherHandler");
 |  | ||||||
| -      otherHandler.removeAttribute("hidden");
 |  | ||||||
| -      otherHandler.setAttribute("path", this.getPath(this.chosenApp.executable));
 |  | ||||||
| -      otherHandler.label = this.getFileDisplayName(this.chosenApp.executable);
 |  | ||||||
| -      this.dialogElement("openHandler").selectedIndex = 1;
 |  | ||||||
| -      this.dialogElement("openHandler").setAttribute("lastSelectedItemID", "otherHandler");
 |  | ||||||
| -
 |  | ||||||
| -      this.dialogElement("mode").selectedItem = this.dialogElement("open");
 |  | ||||||
| -    }
 |  | ||||||
| -    else {
 |  | ||||||
| -      var openHandler = this.dialogElement("openHandler");
 |  | ||||||
| -      var lastSelectedID = openHandler.getAttribute("lastSelectedItemID");
 |  | ||||||
| -      if (!lastSelectedID)
 |  | ||||||
| -        lastSelectedID = "defaultHandler";
 |  | ||||||
| -      openHandler.selectedItem = this.dialogElement(lastSelectedID);
 |  | ||||||
|      } |  | ||||||
| +#endif // MOZ_WIDGET_GTK3
 |  | ||||||
| +
 |  | ||||||
| +#endif // XP_WIN
 |  | ||||||
| +    this.finishChooseApp();
 |  | ||||||
|    }, |  | ||||||
|   |  | ||||||
|    // Turn this on to get debugging messages. |  | ||||||
| diff -up mozilla-release/widget/gtk/moz.build.1129873-apppicker mozilla-release/widget/gtk/moz.build
 |  | ||||||
| --- mozilla-release/widget/gtk/moz.build.1129873-apppicker	2015-05-25 23:28:56.000000000 +0200
 |  | ||||||
| +++ mozilla-release/widget/gtk/moz.build	2015-06-09 09:37:35.313305562 +0200
 |  | ||||||
| @@ -74,6 +74,7 @@ if CONFIG['MOZ_ENABLE_GTK2']:
 |  | ||||||
|  else: |  | ||||||
|      UNIFIED_SOURCES += [ |  | ||||||
|          'gtk3drawing.c', |  | ||||||
| +        'nsApplicationChooser.cpp',
 |  | ||||||
|      ] |  | ||||||
|   |  | ||||||
|  include('/ipc/chromium/chromium-config.mozbuild') |  | ||||||
| diff -up mozilla-release/widget/gtk/mozgtk/mozgtk.c.1129873-apppicker mozilla-release/widget/gtk/mozgtk/mozgtk.c
 |  | ||||||
| --- mozilla-release/widget/gtk/mozgtk/mozgtk.c.1129873-apppicker	2015-05-25 23:28:56.000000000 +0200
 |  | ||||||
| +++ mozilla-release/widget/gtk/mozgtk/mozgtk.c	2015-06-09 09:37:35.313305562 +0200
 |  | ||||||
| @@ -533,6 +533,11 @@ STUB(gtk_widget_get_style_context)
 |  | ||||||
|  STUB(gtk_widget_path_append_type) |  | ||||||
|  STUB(gtk_widget_path_new) |  | ||||||
|  STUB(gtk_widget_set_visual) |  | ||||||
| +STUB(gtk_app_chooser_dialog_new_for_content_type)
 |  | ||||||
| +STUB(gtk_app_chooser_get_type)
 |  | ||||||
| +STUB(gtk_app_chooser_get_app_info)
 |  | ||||||
| +STUB(gtk_app_chooser_dialog_get_type)
 |  | ||||||
| +STUB(gtk_app_chooser_dialog_set_heading)
 |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|  #ifdef GTK2_SYMBOLS |  | ||||||
| diff -up mozilla-release/widget/gtk/nsApplicationChooser.cpp.1129873-apppicker mozilla-release/widget/gtk/nsApplicationChooser.cpp
 |  | ||||||
| --- mozilla-release/widget/gtk/nsApplicationChooser.cpp.1129873-apppicker	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| +++ mozilla-release/widget/gtk/nsApplicationChooser.cpp	2015-06-09 09:37:35.313305562 +0200
 |  | ||||||
| @@ -0,0 +1,123 @@
 |  | ||||||
| +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 |  | ||||||
| +/* This Source Code Form is subject to the terms of the Mozilla Public
 |  | ||||||
| + * License, v. 2.0. If a copy of the MPL was not distributed with this
 |  | ||||||
| + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 |  | ||||||
| +
 |  | ||||||
| +#include "mozilla/Types.h"
 |  | ||||||
| +
 |  | ||||||
| +#include <gtk/gtk.h>
 |  | ||||||
| +
 |  | ||||||
| +#include "nsApplicationChooser.h"
 |  | ||||||
| +#include "WidgetUtils.h"
 |  | ||||||
| +#include "nsIMIMEInfo.h"
 |  | ||||||
| +#include "nsCExternalHandlerService.h"
 |  | ||||||
| +#include "nsGtkUtils.h"
 |  | ||||||
| +
 |  | ||||||
| +using namespace mozilla;
 |  | ||||||
| +
 |  | ||||||
| +NS_IMPL_ISUPPORTS(nsApplicationChooser, nsIApplicationChooser)
 |  | ||||||
| +
 |  | ||||||
| +nsApplicationChooser::nsApplicationChooser()
 |  | ||||||
| +{
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +nsApplicationChooser::~nsApplicationChooser()
 |  | ||||||
| +{
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +NS_IMETHODIMP
 |  | ||||||
| +nsApplicationChooser::Init(nsIDOMWindow* aParent, const nsACString& aTitle)
 |  | ||||||
| +{
 |  | ||||||
| +  NS_ENSURE_TRUE(aParent, NS_ERROR_FAILURE);
 |  | ||||||
| +  mParentWidget = widget::WidgetUtils::DOMWindowToWidget(aParent);
 |  | ||||||
| +  mWindowTitle.Assign(aTitle);
 |  | ||||||
| +  return NS_OK;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +NS_IMETHODIMP
 |  | ||||||
| +nsApplicationChooser::Open(const nsACString& aContentType, nsIApplicationChooserFinishedCallback *aCallback)
 |  | ||||||
| +{
 |  | ||||||
| +  MOZ_ASSERT(aCallback);
 |  | ||||||
| +  if (mCallback) {
 |  | ||||||
| +    NS_WARNING("Chooser is already in progress.");
 |  | ||||||
| +    return NS_ERROR_ALREADY_INITIALIZED;
 |  | ||||||
| +  }
 |  | ||||||
| +  mCallback = aCallback;
 |  | ||||||
| +  NS_ENSURE_TRUE(mParentWidget, NS_ERROR_FAILURE);
 |  | ||||||
| +  GtkWindow *parent_widget =
 |  | ||||||
| +    GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET));
 |  | ||||||
| +
 |  | ||||||
| +  GtkWidget* chooser =
 |  | ||||||
| +    gtk_app_chooser_dialog_new_for_content_type(parent_widget,
 |  | ||||||
| +        (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
 |  | ||||||
| +        PromiseFlatCString(aContentType).get());
 |  | ||||||
| +  gtk_app_chooser_dialog_set_heading(GTK_APP_CHOOSER_DIALOG(chooser), mWindowTitle.BeginReading());
 |  | ||||||
| +  NS_ADDREF_THIS();
 |  | ||||||
| +  g_signal_connect(chooser, "response", G_CALLBACK(OnResponse), this);
 |  | ||||||
| +  g_signal_connect(chooser, "destroy", G_CALLBACK(OnDestroy), this);
 |  | ||||||
| +  gtk_widget_show(chooser);
 |  | ||||||
| +  return NS_OK;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +/* static */ void
 |  | ||||||
| +nsApplicationChooser::OnResponse(GtkWidget* chooser, gint response_id, gpointer user_data)
 |  | ||||||
| +{
 |  | ||||||
| +  static_cast<nsApplicationChooser*>(user_data)->Done(chooser, response_id);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +/* static */ void
 |  | ||||||
| +nsApplicationChooser::OnDestroy(GtkWidget *chooser, gpointer user_data)
 |  | ||||||
| +{
 |  | ||||||
| +  static_cast<nsApplicationChooser*>(user_data)->Done(chooser, GTK_RESPONSE_CANCEL);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +void nsApplicationChooser::Done(GtkWidget* chooser, gint response)
 |  | ||||||
| +{
 |  | ||||||
| +  nsCOMPtr<nsILocalHandlerApp> localHandler;
 |  | ||||||
| +  nsresult rv;
 |  | ||||||
| +  switch (response) {
 |  | ||||||
| +    case GTK_RESPONSE_OK:
 |  | ||||||
| +    case GTK_RESPONSE_ACCEPT:
 |  | ||||||
| +        {
 |  | ||||||
| +          localHandler = do_CreateInstance(NS_LOCALHANDLERAPP_CONTRACTID, &rv);
 |  | ||||||
| +          if (NS_FAILED(rv)) {
 |  | ||||||
| +            NS_WARNING("Out of memory.");
 |  | ||||||
| +            break;
 |  | ||||||
| +          }
 |  | ||||||
| +          GAppInfo *app_info = gtk_app_chooser_get_app_info(GTK_APP_CHOOSER(chooser));
 |  | ||||||
| +
 |  | ||||||
| +          nsCOMPtr<nsIFile> localExecutable;
 |  | ||||||
| +          gchar *fileWithFullPath = g_find_program_in_path(g_app_info_get_executable(app_info));
 |  | ||||||
| +          rv = NS_NewNativeLocalFile(nsDependentCString(fileWithFullPath), false, getter_AddRefs(localExecutable));
 |  | ||||||
| +          g_free(fileWithFullPath);
 |  | ||||||
| +          if (NS_FAILED(rv)) {
 |  | ||||||
| +            NS_WARNING("Cannot create local filename.");
 |  | ||||||
| +            localHandler = nullptr;
 |  | ||||||
| +          } else {
 |  | ||||||
| +            localHandler->SetExecutable(localExecutable);
 |  | ||||||
| +            localHandler->SetName(NS_ConvertUTF8toUTF16(g_app_info_get_display_name(app_info)));
 |  | ||||||
| +          }
 |  | ||||||
| +          g_object_unref(app_info);
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +        break;
 |  | ||||||
| +    case GTK_RESPONSE_CANCEL:
 |  | ||||||
| +    case GTK_RESPONSE_CLOSE:
 |  | ||||||
| +    case GTK_RESPONSE_DELETE_EVENT:
 |  | ||||||
| +        break;
 |  | ||||||
| +    default:
 |  | ||||||
| +        NS_WARNING("Unexpected response");
 |  | ||||||
| +        break;
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  // A "response" signal won't be sent again but "destroy" will be.
 |  | ||||||
| +  g_signal_handlers_disconnect_by_func(chooser, FuncToGpointer(OnDestroy), this);
 |  | ||||||
| +  gtk_widget_destroy(chooser);
 |  | ||||||
| +
 |  | ||||||
| +  if (mCallback) {
 |  | ||||||
| +    mCallback->Done(localHandler);
 |  | ||||||
| +    mCallback = nullptr;
 |  | ||||||
| +  }
 |  | ||||||
| +  NS_RELEASE_THIS();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| diff -up mozilla-release/widget/gtk/nsApplicationChooser.h.1129873-apppicker mozilla-release/widget/gtk/nsApplicationChooser.h
 |  | ||||||
| --- mozilla-release/widget/gtk/nsApplicationChooser.h.1129873-apppicker	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| +++ mozilla-release/widget/gtk/nsApplicationChooser.h	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| @@ -0,0 +1,28 @@
 |  | ||||||
| +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 |  | ||||||
| +/* This Source Code Form is subject to the terms of the Mozilla Public
 |  | ||||||
| + * License, v. 2.0. If a copy of the MPL was not distributed with this
 |  | ||||||
| + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 |  | ||||||
| +
 |  | ||||||
| +#ifndef nsApplicationChooser_h__
 |  | ||||||
| +#define nsApplicationChooser_h__
 |  | ||||||
| +
 |  | ||||||
| +#include <gtk/gtk.h>
 |  | ||||||
| +#include "nsIApplicationChooser.h"
 |  | ||||||
| +
 |  | ||||||
| +class nsApplicationChooser : public nsIApplicationChooser
 |  | ||||||
| +{
 |  | ||||||
| +public:
 |  | ||||||
| +  nsApplicationChooser();
 |  | ||||||
| +  NS_DECL_ISUPPORTS
 |  | ||||||
| +  NS_DECL_NSIAPPLICATIONCHOOSER
 |  | ||||||
| +  void Done(GtkWidget* chooser, gint response);
 |  | ||||||
| +
 |  | ||||||
| +private:
 |  | ||||||
| +  ~nsApplicationChooser();
 |  | ||||||
| +  nsCOMPtr<nsIWidget> mParentWidget;
 |  | ||||||
| +  nsCString mWindowTitle;
 |  | ||||||
| +  nsCOMPtr<nsIApplicationChooserFinishedCallback> mCallback;
 |  | ||||||
| +  static void OnResponse(GtkWidget* chooser, gint response_id, gpointer user_data);
 |  | ||||||
| +  static void OnDestroy(GtkWidget* chooser, gpointer user_data);
 |  | ||||||
| +};
 |  | ||||||
| +#endif
 |  | ||||||
| diff -up mozilla-release/widget/gtk/nsWidgetFactory.cpp.1129873-apppicker mozilla-release/widget/gtk/nsWidgetFactory.cpp
 |  | ||||||
| --- mozilla-release/widget/gtk/nsWidgetFactory.cpp.1129873-apppicker	2015-05-25 23:28:56.000000000 +0200
 |  | ||||||
| +++ mozilla-release/widget/gtk/nsWidgetFactory.cpp	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| @@ -21,6 +21,9 @@
 |  | ||||||
|  #include "nsClipboard.h" |  | ||||||
|  #include "nsDragService.h" |  | ||||||
|  #endif |  | ||||||
| +#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +#include "nsApplicationChooser.h"
 |  | ||||||
| +#endif
 |  | ||||||
|  #include "nsColorPicker.h" |  | ||||||
|  #include "nsFilePicker.h" |  | ||||||
|  #include "nsSound.h" |  | ||||||
| @@ -152,6 +155,25 @@ nsFilePickerConstructor(nsISupports *aOu
 |  | ||||||
|    return picker->QueryInterface(aIID, aResult); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +static nsresult
 |  | ||||||
| +nsApplicationChooserConstructor(nsISupports *aOuter, REFNSIID aIID,
 |  | ||||||
| +                                void **aResult)
 |  | ||||||
| +{
 |  | ||||||
| +  *aResult = nullptr;
 |  | ||||||
| +  if (aOuter != nullptr) {
 |  | ||||||
| +    return NS_ERROR_NO_AGGREGATION;
 |  | ||||||
| +  }
 |  | ||||||
| +  nsCOMPtr<nsIApplicationChooser> chooser = new nsApplicationChooser;
 |  | ||||||
| +
 |  | ||||||
| +  if (!chooser) {
 |  | ||||||
| +    return NS_ERROR_OUT_OF_MEMORY;
 |  | ||||||
| +  }
 |  | ||||||
| +
 |  | ||||||
| +  return chooser->QueryInterface(aIID, aResult);
 |  | ||||||
| +}
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  static nsresult |  | ||||||
|  nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID, |  | ||||||
|                           void **aResult) |  | ||||||
| @@ -175,6 +197,9 @@ NS_DEFINE_NAMED_CID(NS_CHILD_CID);
 |  | ||||||
|  NS_DEFINE_NAMED_CID(NS_APPSHELL_CID); |  | ||||||
|  NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID); |  | ||||||
|  NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID); |  | ||||||
| +#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +NS_DEFINE_NAMED_CID(NS_APPLICATIONCHOOSER_CID);
 |  | ||||||
| +#endif
 |  | ||||||
|  NS_DEFINE_NAMED_CID(NS_SOUND_CID); |  | ||||||
|  NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID); |  | ||||||
|  #ifdef MOZ_X11 |  | ||||||
| @@ -206,6 +231,9 @@ static const mozilla::Module::CIDEntry k
 |  | ||||||
|      { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor }, |  | ||||||
|      { &kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor, Module::MAIN_PROCESS_ONLY }, |  | ||||||
|      { &kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor, Module::MAIN_PROCESS_ONLY }, |  | ||||||
| +#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +    { &kNS_APPLICATIONCHOOSER_CID, false, nullptr, nsApplicationChooserConstructor, Module::MAIN_PROCESS_ONLY },
 |  | ||||||
| +#endif
 |  | ||||||
|      { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY }, |  | ||||||
|      { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor }, |  | ||||||
|  #ifdef MOZ_X11 |  | ||||||
| @@ -239,6 +267,9 @@ static const mozilla::Module::ContractID
 |  | ||||||
|      { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID }, |  | ||||||
|      { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY }, |  | ||||||
|      { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY }, |  | ||||||
| +#if (MOZ_WIDGET_GTK == 3)
 |  | ||||||
| +    { "@mozilla.org/applicationchooser;1", &kNS_APPLICATIONCHOOSER_CID, Module::MAIN_PROCESS_ONLY },
 |  | ||||||
| +#endif
 |  | ||||||
|      { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY }, |  | ||||||
|      { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID }, |  | ||||||
|  #ifdef MOZ_X11 |  | ||||||
| diff -up mozilla-release/widget/moz.build.1129873-apppicker mozilla-release/widget/moz.build
 |  | ||||||
| --- mozilla-release/widget/moz.build.1129873-apppicker	2015-05-25 23:28:56.000000000 +0200
 |  | ||||||
| +++ mozilla-release/widget/moz.build	2015-06-09 09:36:01.000000000 +0200
 |  | ||||||
| @@ -207,6 +207,10 @@ if toolkit in ('qt', 'gtk2', 'gtk3', 'wi
 |  | ||||||
|      UNIFIED_SOURCES += [ |  | ||||||
|          'nsNativeTheme.cpp', |  | ||||||
|      ] |  | ||||||
| +if toolkit == 'gtk3':
 |  | ||||||
| +    XPIDL_SOURCES += [
 |  | ||||||
| +        'nsIApplicationChooser.idl',
 |  | ||||||
| +    ]
 |  | ||||||
|   |  | ||||||
|  if not CONFIG['MOZ_B2G']: |  | ||||||
|      DEFINES['MOZ_CROSS_PROCESS_IME'] = True |  | ||||||
| diff -up mozilla-release/widget/nsIApplicationChooser.idl.1129873-apppicker mozilla-release/widget/nsIApplicationChooser.idl
 |  | ||||||
| --- mozilla-release/widget/nsIApplicationChooser.idl.1129873-apppicker	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| +++ mozilla-release/widget/nsIApplicationChooser.idl	2015-06-09 09:37:35.314305558 +0200
 |  | ||||||
| @@ -0,0 +1,39 @@
 |  | ||||||
| +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 |  | ||||||
| + *
 |  | ||||||
| + * This Source Code Form is subject to the terms of the Mozilla Public
 |  | ||||||
| + * License, v. 2.0. If a copy of the MPL was not distributed with this
 |  | ||||||
| + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 |  | ||||||
| +
 |  | ||||||
| +#include "nsISupports.idl"
 |  | ||||||
| +#include "nsIMIMEInfo.idl"
 |  | ||||||
| +interface nsIDOMWindow;
 |  | ||||||
| +
 |  | ||||||
| +[scriptable, function, uuid(8144404d-e6c7-4861-bcca-47de912ee811)]
 |  | ||||||
| +interface nsIApplicationChooserFinishedCallback : nsISupports
 |  | ||||||
| +{
 |  | ||||||
| +  void done(in nsIHandlerApp handlerApp);
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +[scriptable, uuid(8413fc42-d6c4-4d78-bf70-64cd78ebcc5c)]
 |  | ||||||
| +interface nsIApplicationChooser : nsISupports
 |  | ||||||
| +{
 |  | ||||||
| + /**
 |  | ||||||
| +  * Initialize the application chooser picker widget.  The application chooser
 |  | ||||||
| +  * is not valid until this method is called.
 |  | ||||||
| +  *
 |  | ||||||
| +  * @param      parent   nsIDOMWindow parent.  This dialog will be dependent
 |  | ||||||
| +  *                      on this parent. parent must be non-null.
 |  | ||||||
| +  * @param      title    The title for the file widget
 |  | ||||||
| +  *
 |  | ||||||
| +  */
 |  | ||||||
| +  void init(in nsIDOMWindow parent, in ACString title);
 |  | ||||||
| +
 |  | ||||||
| +  /**
 |  | ||||||
| +   * Open application chooser dialog.
 |  | ||||||
| +   *
 |  | ||||||
| +   * @param    contentType   content type of file to open
 |  | ||||||
| +   * @param    applicationChooserFinishedCallback  callback fuction to run when dialog is closed
 |  | ||||||
| +   */
 |  | ||||||
| +  void open(in ACString contentType, in nsIApplicationChooserFinishedCallback applicationChooserFinishedCallback);
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| diff -up mozilla-release/widget/nsWidgetsCID.h.1129873-apppicker mozilla-release/widget/nsWidgetsCID.h
 |  | ||||||
| --- mozilla-release/widget/nsWidgetsCID.h.1129873-apppicker	2015-05-25 23:28:56.000000000 +0200
 |  | ||||||
| +++ mozilla-release/widget/nsWidgetsCID.h	2015-06-09 09:37:35.315305554 +0200
 |  | ||||||
| @@ -24,6 +24,11 @@
 |  | ||||||
|  { 0xbd57cee8, 0x1dd1, 0x11b2, \ |  | ||||||
|      {0x9f, 0xe7, 0x95, 0xcf, 0x47, 0x09, 0xae, 0xa3} } |  | ||||||
|   |  | ||||||
| +/* e221df9b-3d66-4045-9a66-5720949f8d10 */
 |  | ||||||
| +#define NS_APPLICATIONCHOOSER_CID \
 |  | ||||||
| +{ 0xe221df9b, 0x3d66, 0x4045, \
 |  | ||||||
| +    {0x9a, 0x66, 0x57, 0x20, 0x94, 0x9f, 0x8d, 0x10} }
 |  | ||||||
| +
 |  | ||||||
|  /* 0f872c8c-3ee6-46bd-92a2-69652c6b474e */ |  | ||||||
|  #define NS_COLORPICKER_CID \ |  | ||||||
|  { 0x0f872c8c, 0x3ee6, 0x46bd, \ |  | ||||||
| @ -1,31 +0,0 @@ | |||||||
| # HG changeset patch |  | ||||||
| # User Martin Stransky <stransky@redhat.com> |  | ||||||
| # Parent  e0299ad29b855f798ee5db8257cbb459894c1b29 |  | ||||||
| Bug 1144745 - scale border returned by GetWidgetBorder(), r=?karlt |  | ||||||
| 
 |  | ||||||
| diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp
 |  | ||||||
| --- a/widget/gtk/nsNativeThemeGTK.cpp
 |  | ||||||
| +++ b/widget/gtk/nsNativeThemeGTK.cpp
 |  | ||||||
| @@ -990,16 +990,22 @@ nsNativeThemeGTK::GetWidgetBorder(nsDevi
 |  | ||||||
|        if (GetGtkWidgetAndState(aWidgetType, aFrame, gtkWidgetType, nullptr, |  | ||||||
|                                 nullptr)) { |  | ||||||
|          moz_gtk_get_widget_border(gtkWidgetType, &aResult->left, &aResult->top, |  | ||||||
|                                    &aResult->right, &aResult->bottom, direction, |  | ||||||
|                                    IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML)); |  | ||||||
|        } |  | ||||||
|      } |  | ||||||
|    } |  | ||||||
| +
 |  | ||||||
| +  gint scale = nsScreenGtk::GetGtkMonitorScaleFactor();
 |  | ||||||
| +  aResult->top *= scale;
 |  | ||||||
| +  aResult->right *= scale;
 |  | ||||||
| +  aResult->bottom *= scale;
 |  | ||||||
| +  aResult->left *= scale;
 |  | ||||||
|    return NS_OK; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  bool |  | ||||||
|  nsNativeThemeGTK::GetWidgetPadding(nsDeviceContext* aContext, |  | ||||||
|                                     nsIFrame* aFrame, uint8_t aWidgetType, |  | ||||||
|                                     nsIntMargin* aResult) |  | ||||||
|  { |  | ||||||
| @ -1,27 +0,0 @@ | |||||||
| # HG changeset patch |  | ||||||
| # User Lee Salzman <lsalzman@mozilla.com> |  | ||||||
| # Date 1432140511 14400 |  | ||||||
| #      Wed May 20 12:48:31 2015 -0400 |  | ||||||
| # Node ID 283e513fa1c3b2300efb359a8da1d5519c3f74f5 |  | ||||||
| # Parent  4fb7ff694bf5944b76c20b2240fb3abdc55f9a4e |  | ||||||
| always export HelpersCairo.h |  | ||||||
| 
 |  | ||||||
| diff -r 4fb7ff694bf5 -r 283e513fa1c3 gfx/2d/moz.build
 |  | ||||||
| --- a/gfx/2d/moz.build	Tue May 19 11:58:45 2015 +0200
 |  | ||||||
| +++ b/gfx/2d/moz.build	Wed May 20 12:48:31 2015 -0400
 |  | ||||||
| @@ -24,6 +24,7 @@
 |  | ||||||
|      'DrawTargetTiled.h', |  | ||||||
|      'Filters.h', |  | ||||||
|      'Helpers.h', |  | ||||||
| +    'HelpersCairo.h',
 |  | ||||||
|      'Logging.h', |  | ||||||
|      'Matrix.h', |  | ||||||
|      'NumericTools.h', |  | ||||||
| @@ -79,7 +80,6 @@
 |  | ||||||
|          'image_operations.cpp', # Uses _USE_MATH_DEFINES |  | ||||||
|      ] |  | ||||||
|      EXPORTS.mozilla.gfx += [ |  | ||||||
| -        'HelpersCairo.h',
 |  | ||||||
|          'HelpersSkia.h', |  | ||||||
|      ] |  | ||||||
|   |  | ||||||
| @ -1,27 +0,0 @@ | |||||||
| # HG changeset patch |  | ||||||
| # User Martin Stransky <stransky@redhat.com> |  | ||||||
| # Parent  f8d21278244bc0531513131f85a45e5736207ae1 |  | ||||||
| Bug 1169232 - [gtk3] add background class to tooltip window |  | ||||||
|               to get correct background color. r=?karlt |  | ||||||
| 
 |  | ||||||
| diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| --- a/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| +++ b/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| @@ -1004,16 +1004,17 @@ nsLookAndFeel::Init()
 |  | ||||||
|      gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
|      gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
|      gtk_style_context_restore(style); |  | ||||||
|   |  | ||||||
|      // tooltip foreground and background |  | ||||||
|      gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); |  | ||||||
| +    gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND);
 |  | ||||||
|      gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sInfoBackground = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
|      gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sInfoText = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
|      g_object_unref(style); |  | ||||||
|   |  | ||||||
|      // menu foreground & menu background |  | ||||||
|      GtkWidget *accel_label = gtk_accel_label_new("M"); |  | ||||||
| @ -1,71 +0,0 @@ | |||||||
| # HG changeset patch |  | ||||||
| # User Martin Stransky <stransky@redhat.com> |  | ||||||
| # Parent  f986e55c4e0b41c6b50bd74d287614b564d7895f |  | ||||||
| Bug 1169233 - Get grey (inactive) text color from menu labels, r=?karlt |  | ||||||
| 
 |  | ||||||
| diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| --- a/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| +++ b/widget/gtk/nsLookAndFeel.cpp
 |  | ||||||
| @@ -237,20 +237,18 @@ nsLookAndFeel::NativeGetColor(ColorID aI
 |  | ||||||
|      case eColorID_inactiveborder: |  | ||||||
|          // inactive window border |  | ||||||
|          gtk_style_context_get_border_color(mBackgroundStyle,  |  | ||||||
|                                             GTK_STATE_FLAG_INSENSITIVE,  |  | ||||||
|                                             &gdk_color); |  | ||||||
|          aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); |  | ||||||
|          break; |  | ||||||
|      case eColorID_graytext: // disabled text in windows, menus, etc. |  | ||||||
| -    case eColorID_inactivecaptiontext: // text in inactive window caption
 |  | ||||||
| -        gtk_style_context_get_color(mBackgroundStyle, 
 |  | ||||||
| -                                    GTK_STATE_FLAG_INSENSITIVE, &gdk_color);
 |  | ||||||
| -        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
 |  | ||||||
| +    case eColorID_inactivecaptiontext: // text in inactive window caption
 |  | ||||||
| +        aColor = sMenuTextInactive;
 |  | ||||||
|          break; |  | ||||||
|      case eColorID_inactivecaption: |  | ||||||
|          // inactive window caption |  | ||||||
|          gtk_style_context_get_background_color(mBackgroundStyle,  |  | ||||||
|                                                 GTK_STATE_FLAG_INSENSITIVE,  |  | ||||||
|                                                 &gdk_color); |  | ||||||
|          aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); |  | ||||||
|          break; |  | ||||||
| @@ -1023,16 +1021,18 @@ nsLookAndFeel::Init()
 |  | ||||||
|      g_object_ref_sink(menu); |  | ||||||
|   |  | ||||||
|      gtk_container_add(GTK_CONTAINER(menuitem), accel_label); |  | ||||||
|      gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |  | ||||||
|   |  | ||||||
|      style = gtk_widget_get_style_context(accel_label); |  | ||||||
|      gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sMenuText = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
| +    gtk_style_context_get_color(style, GTK_STATE_FLAG_INSENSITIVE, &color);
 |  | ||||||
| +    sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color);
 |  | ||||||
|   |  | ||||||
|      style = gtk_widget_get_style_context(menu); |  | ||||||
|      gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); |  | ||||||
|      sMenuBackground = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
|   |  | ||||||
|      style = gtk_widget_get_style_context(menuitem); |  | ||||||
|      gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT, &color); |  | ||||||
|      sMenuHover = GDK_RGBA_TO_NS_RGBA(color); |  | ||||||
| diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h
 |  | ||||||
| --- a/widget/gtk/nsLookAndFeel.h
 |  | ||||||
| +++ b/widget/gtk/nsLookAndFeel.h
 |  | ||||||
| @@ -54,16 +54,17 @@ protected:
 |  | ||||||
|   |  | ||||||
|      // Cached colors |  | ||||||
|      nscolor sInfoBackground; |  | ||||||
|      nscolor sInfoText; |  | ||||||
|      nscolor sMenuBackground; |  | ||||||
|      nscolor sMenuBarText; |  | ||||||
|      nscolor sMenuBarHoverText; |  | ||||||
|      nscolor sMenuText; |  | ||||||
| +    nscolor sMenuTextInactive;
 |  | ||||||
|      nscolor sMenuHover; |  | ||||||
|      nscolor sMenuHoverText; |  | ||||||
|      nscolor sButtonText; |  | ||||||
|      nscolor sButtonHoverText; |  | ||||||
|      nscolor sButtonBackground; |  | ||||||
|      nscolor sFrameOuterLightBorder; |  | ||||||
|      nscolor sFrameInnerDarkBorder; |  | ||||||
|      nscolor sOddCellBackground; |  | ||||||
| @ -1,17 +0,0 @@ | |||||||
| diff -up firefox-40.0/mozilla-release/widget/gtk/gtk3drawing.c.old firefox-40.0/mozilla-release/widget/gtk/gtk3drawing.c
 |  | ||||||
| --- firefox-40.0/mozilla-release/widget/gtk/gtk3drawing.c.old	2015-08-07 13:50:18.000000000 +0200
 |  | ||||||
| +++ firefox-40.0/mozilla-release/widget/gtk/gtk3drawing.c	2015-08-07 13:53:05.920824588 +0200
 |  | ||||||
| @@ -2643,13 +2643,6 @@ moz_gtk_get_widget_border(GtkThemeWidget
 |  | ||||||
|              ensure_entry_widget(); |  | ||||||
|              style = gtk_widget_get_style_context(gEntryWidget); |  | ||||||
|              moz_gtk_add_style_border(style, left, top, right, bottom); |  | ||||||
| -
 |  | ||||||
| -            /* Use the document padding in HTML
 |  | ||||||
| -               and GTK style padding in XUL. */
 |  | ||||||
| -            if (!inhtml) {
 |  | ||||||
| -                moz_gtk_add_style_padding(style, left, top, right, bottom);
 |  | ||||||
| -            }
 |  | ||||||
| -
 |  | ||||||
|              return MOZ_GTK_SUCCESS; |  | ||||||
|          } |  | ||||||
|      case MOZ_GTK_TREEVIEW: |  | ||||||
							
								
								
									
										4
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sources
									
									
									
									
									
								
							| @ -1,2 +1,2 @@ | |||||||
| 26a64a80cbd5b77d3b0d9734bff5bbad  firefox-40.0.3.source.tar.bz2 | 07a5ca853de78278a8bc13bcd3dcf063  firefox-41.0.source.tar.xz | ||||||
| d3c2c9b65aba9b3d159466ea6df522e0  firefox-langpacks-40.0.3-20150827.tar.xz | 0795572ee46b57a9b1e51de9cede3021  firefox-langpacks-41.0-20150915.tar.xz | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user