Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BREAKING(Object Stacking): 🔙 refactor logic to support Group 🔝 #8461

Merged
merged 52 commits into from
Dec 29, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
4b46dd6
init
ShaMan123 Nov 21, 2022
4fc4319
Update collection.mixin.ts
ShaMan123 Nov 21, 2022
84a75de
types
ShaMan123 Nov 21, 2022
339e8c1
Update object_interactivity.mixin.ts
ShaMan123 Nov 21, 2022
76f26d6
Update object.class.ts
ShaMan123 Nov 21, 2022
82ded9b
Update collection.mixin.ts
ShaMan123 Nov 21, 2022
a97d170
Update group.class.ts
ShaMan123 Nov 21, 2022
b4e85c2
Update group.js
ShaMan123 Nov 21, 2022
305e9bd
Update CHANGELOG.md
ShaMan123 Nov 21, 2022
07fbc40
Update group.class.ts
ShaMan123 Nov 21, 2022
9f187cb
Squashed commit of the following:
ShaMan123 Nov 21, 2022
4fe445f
Update group.class.ts
ShaMan123 Nov 21, 2022
c36121d
migrate AS
ShaMan123 Nov 21, 2022
9ac6ec3
Update active_selection.class.ts
ShaMan123 Nov 21, 2022
a77f803
Update activeselection.js
ShaMan123 Nov 21, 2022
69f5c38
Update active_selection.class.ts
ShaMan123 Nov 21, 2022
4e8db1a
remove redundant deep clone
ShaMan123 Nov 21, 2022
2061e5b
Revert "Squashed commit of the following:"
ShaMan123 Nov 21, 2022
3523a0b
rename
ShaMan123 Nov 21, 2022
7510e6c
Update active_selection.class.ts
ShaMan123 Nov 21, 2022
05b7968
init
ShaMan123 Nov 23, 2022
099489c
typo
ShaMan123 Nov 23, 2022
18b85b3
Squashed commit of the following:
ShaMan123 Nov 23, 2022
45abc34
TS complaining
ShaMan123 Nov 23, 2022
806b6e7
fix(): `_onAfterObjectsChange`
ShaMan123 Nov 23, 2022
13f6613
port group changes from #7878
ShaMan123 Nov 23, 2022
2205224
Update CHANGELOG.md
ShaMan123 Nov 23, 2022
b3fb13e
Merge branch 'master' into ts-group
ShaMan123 Nov 25, 2022
68d2280
fix merge conflict
ShaMan123 Nov 25, 2022
7b33323
more cleanup
ShaMan123 Nov 25, 2022
971c4d3
cleanup
ShaMan123 Nov 25, 2022
6525025
Merge branch 'ts-group' into collection-stacking
ShaMan123 Nov 25, 2022
cf82a83
temporary fix
ShaMan123 Nov 25, 2022
e1cb367
checkout patternBrush
ShaMan123 Nov 25, 2022
c8b15fb
Merge branch 'ts-group' into collection-stacking
ShaMan123 Nov 25, 2022
e3de06a
Merge branch 'master' into collection-stacking
ShaMan123 Nov 26, 2022
da869a9
Merge branch 'master' into collection-stacking
ShaMan123 Nov 27, 2022
dac93c4
adapt tests
ShaMan123 Nov 27, 2022
3971f4f
not private
ShaMan123 Nov 27, 2022
c490d23
stupid TS
ShaMan123 Nov 27, 2022
ff8f040
Merge branch 'master' into collection-stacking
ShaMan123 Nov 29, 2022
aa63f84
dep(): object stacking
ShaMan123 Nov 29, 2022
53693f7
Merge branch 'master' into collection-stacking
ShaMan123 Dec 5, 2022
97195e7
cleanup merge
ShaMan123 Dec 5, 2022
b9fecd1
Merge branch 'master' into collection-stacking
ShaMan123 Dec 9, 2022
3ff4106
Merge branch 'master' into collection-stacking
ShaMan123 Dec 12, 2022
f39ae71
Merge branch 'master' into collection-stacking
ShaMan123 Dec 18, 2022
a766702
fix conflict
ShaMan123 Dec 18, 2022
098c9d7
fix typo that wasn't found by tests
ShaMan123 Dec 18, 2022
a5035fc
test intersecting
ShaMan123 Dec 18, 2022
1dc1b34
Merge branch 'master' into collection-stacking
ShaMan123 Dec 19, 2022
044d619
fixed conflicts
asturur Dec 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'master' into collection-stacking
  • Loading branch information
ShaMan123 committed Dec 18, 2022
commit f39ae71c501aeb263f23fb0684786b07a5a29029
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- fix(Object Stacking): 🔙 refactor logic to support Group 🔝
- chore(TS): migrate Group/ActiveSelection [#8455](https://github.com/fabricjs/fabric.js/pull/8455)
- chore(TS): Move object classes #8511
- chore(TS): polish text [#8489](https://github.com/fabricjs/fabric.js/pull/8489)
- chore(TS): fix import cycle, extract `groupSVGElements` [#8506](https://github.com/fabricjs/fabric.js/pull/8506)
- chore(TS): permissive `Point` typings [#8434](https://github.com/fabricjs/fabric.js/pull/8434)
Expand Down
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import './src/mixins/canvas_gestures.mixin'; // optional gestures
import './src/mixins/canvas_animation.mixin'; // optional animation
import './src/mixins/canvas_straightening.mixin'; // optional animation
import './src/shapes/fabricObject.class';
import './src/shapes/Object/FabricObject';
import './src/mixins/stateful.mixin'; // will die soon
import './src/shapes/line.class';
import './src/shapes/circle.class';
Expand Down
2 changes: 1 addition & 1 deletion src/EventTypeDefs.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Control } from './controls/control.class';
import type { Point } from './point.class';
import type { FabricObject } from './shapes/fabricObject.class';
import type { FabricObject } from './shapes/Object/FabricObject';
import type { Group } from './shapes/group.class';
import type { TOriginX, TOriginY, TRadian } from './typedefs';
import type { saveObjectTransform } from './util/misc/objectTransforms';
Expand Down
2 changes: 1 addition & 1 deletion src/__types__.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CanvasEvents, ModifierKey, StaticCanvasEvents } from './EventTypeDefs';
import type { Observable } from './mixins/observable.mixin';
import type { Point } from './point.class';
import type { FabricObject } from './shapes/fabricObject.class';
import type { FabricObject } from './shapes/Object/FabricObject';
import { TMat2D } from './typedefs';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/canvas.class.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//@ts-nocheck
import { dragHandler, getActionFromCorner } from './controls/actions';
import { Point } from './point.class';
import { FabricObject } from './shapes/fabricObject.class';
import { FabricObject } from './shapes/Object/FabricObject';
import { Transform } from './EventTypeDefs';
import { saveObjectTransform } from './util/misc/objectTransforms';

Expand Down
2 changes: 1 addition & 1 deletion src/controls/control.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
TransformActionHandler,
} from '../EventTypeDefs';
import { Point } from '../point.class';
import type { FabricObject } from '../shapes/object.class';
import type { FabricObject } from '../shapes/Object/Object';
import { TDegree, TMat2D } from '../typedefs';
import { cos } from '../util/misc/cos';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
Expand Down
2 changes: 1 addition & 1 deletion src/controls/controls.render.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PiBy180, twoMathPi } from '../constants';
import type { FabricObject } from '../shapes/object.class';
import type { FabricObject } from '../shapes/Object/Object';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
import type { Control } from './control.class';

Expand Down
2 changes: 1 addition & 1 deletion src/controls/default_controls.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// @ts-nocheck
import { fabric } from '../../HEADER';
import { FabricObject } from '../shapes/fabricObject.class';
import { FabricObject } from '../shapes/Object/FabricObject';
import {
changeWidth,
rotationStyleHandler,
Expand Down
2 changes: 1 addition & 1 deletion src/controls/scale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
Transform,
TransformActionHandler,
} from '../EventTypeDefs';
import type { FabricObject } from '../shapes/fabricObject.class';
import type { FabricObject } from '../shapes/Object/FabricObject';
import { TAxis } from '../typedefs';
import { Canvas } from '../__types__';
import {
Expand Down
2 changes: 1 addition & 1 deletion src/controls/scaleSkew.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
TPointerEvent,
TransformActionHandler,
} from '../EventTypeDefs';
import type { FabricObject } from '../shapes/object.class';
import type { FabricObject } from '../shapes/Object/Object';
import { TAxisKey } from '../typedefs';
import { Canvas } from '../__types__';
import { scaleCursorStyleHandler, scalingX, scalingY } from './scale';
Expand Down
2 changes: 1 addition & 1 deletion src/controls/skew.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
Transform,
TransformActionHandler,
} from '../EventTypeDefs';
import { resolveOrigin } from '../mixins/object_origin.mixin';
import { resolveOrigin } from '../util/misc/resolveOrigin';
import { Point } from '../point.class';
import { TAxis, TAxisKey } from '../typedefs';
import {
Expand Down
4 changes: 2 additions & 2 deletions src/controls/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import {
TransformAction,
BasicTransformEvent,
} from '../EventTypeDefs';
import { resolveOrigin } from '../mixins/object_origin.mixin';
import { resolveOrigin } from '../util/misc/resolveOrigin';
import { Point } from '../point.class';
import type { FabricObject } from '../shapes/fabricObject.class';
import type { FabricObject } from '../shapes/Object/FabricObject';
import { TOriginX, TOriginY } from '../typedefs';
import {
degreesToRadians,
Expand Down
2 changes: 1 addition & 1 deletion src/gradient/gradient.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { fabric } from '../../HEADER';
import { Color } from '../color';
import { iMatrix } from '../constants';
import { parseTransformAttribute } from '../parser/parseTransformAttribute';
import type { FabricObject } from '../shapes/fabricObject.class';
import type { FabricObject } from '../shapes/Object/FabricObject';
import { TMat2D } from '../typedefs';
import { uid } from '../util/internals/uid';
import { pick } from '../util/misc/pick';
Expand Down
2 changes: 1 addition & 1 deletion src/mixins/canvas_straightening.mixin.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// @ts-nocheck
import { fabric } from '../../HEADER';
import type { FabricObject } from '../shapes/fabricObject.class';
import type { FabricObject } from '../shapes/Object/FabricObject';

fabric.util.object.extend(
fabric.StaticCanvas.prototype,
Expand Down
2 changes: 1 addition & 1 deletion src/mixins/collection.mixin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { fabric } from '../../HEADER';
import type { FabricObject } from '../shapes/fabricObject.class';
import type { FabricObject } from '../shapes/Object/FabricObject';
import type { Constructor } from '../typedefs';
import { removeFromArray } from '../util/internals';

Expand Down
2 changes: 1 addition & 1 deletion src/mixins/itext.svg_export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { Color } from '../color';
import { config } from '../config';
import { FabricObject } from '../shapes/fabricObject.class';
import { FabricObject } from '../shapes/Object/FabricObject';

/* _TO_SVG_START_ */
(function (global) {
Expand Down
2 changes: 1 addition & 1 deletion src/mixins/text_style.mixin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ObjectEvents } from '../EventTypeDefs';
import { FabricObject } from '../shapes/fabricObject.class';
import { FabricObject } from '../shapes/Object/FabricObject';

export type TextStyleDeclaration = Record<string, any>;

Expand Down
2 changes: 1 addition & 1 deletion src/parser/setStrokeFillOpacity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { Color } from '../color';
import { toFixed } from '../util/misc/toFixed';
import { colorAttributes } from './constants';
import { FabricObject } from '../shapes/fabricObject.class';
import { FabricObject } from '../shapes/Object/FabricObject';

/**
* @private
Expand Down
2 changes: 1 addition & 1 deletion src/shadow.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { fabric } from '../HEADER';
import { Color } from './color';
import { config } from './config';
import { Point } from './point.class';
import type { FabricObject } from './shapes/fabricObject.class';
import type { FabricObject } from './shapes/Object/FabricObject';
import { TClassProperties } from './typedefs';
import { uid } from './util/internals/uid';
import { degreesToRadians } from './util/misc/radiansDegreesConversion';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// @ts-nocheck
import { noop } from '../constants';
import { ObjectEvents } from '../EventTypeDefs';
import { TDegree } from '../typedefs';
import { animate } from '../util/animate';
import { animateColor } from '../util/animate_color';
import { StackedObject } from './object_ancestry.mixin';
import { noop } from '../../constants';
import { ObjectEvents } from '../../EventTypeDefs';
import { TDegree } from '../../typedefs';
import { animate } from '../../util/animate';
import { animateColor } from '../../util/animate_color';
import { StackedObject } from './StackedObject';

/**
* TODO remove transient
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { fabric } from '../../HEADER';
import { ObjectEvents } from '../EventTypeDefs';
import { FabricObjectSVGExportMixin } from '../mixins/object.svg_export';
import { InteractiveFabricObject } from '../mixins/object_interactivity.mixin';
import { applyMixins } from '../util/applyMixins';
import { fabric } from '../../../HEADER';
import { ObjectEvents } from '../../EventTypeDefs';
import { FabricObjectSVGExportMixin } from '../../mixins/object.svg_export';
import { InteractiveFabricObject } from './InteractiveObject';
import { applyMixins } from '../../util/applyMixins';

// TODO somehow we have to make a tree-shakeable import

Expand All @@ -16,6 +16,6 @@ export class FabricObject<

applyMixins(FabricObject, [FabricObjectSVGExportMixin]);

export { fabricObjectDefaultValues } from './object.class';
export { fabricObjectDefaultValues } from './Object';

fabric.Object = FabricObject;
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { IPoint, Point } from '../point.class';
import type { TCornerPoint, TDegree, TMat2D } from '../typedefs';
import { FabricObject } from '../shapes/object.class';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
import { IPoint, Point } from '../../point.class';
import type { TCornerPoint, TDegree, TMat2D } from '../../typedefs';
import { FabricObject } from './Object';
import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
import {
calcRotateMatrix,
multiplyTransformMatrices,
qrDecompose,
TQrDecomposeOut,
} from '../util/misc/matrix';
import { ObjectGeometry } from './object_geometry.mixin';
import type { Control } from '../controls/control.class';
import { sizeAfterTransform } from '../util/misc/objectTransforms';
import { ObjectEvents } from '../EventTypeDefs';
} from '../../util/misc/matrix';
import { ObjectGeometry } from './ObjectGeometry';
import type { Control } from '../../controls/control.class';
import { sizeAfterTransform } from '../../util/misc/objectTransforms';
import { ObjectEvents } from '../../EventTypeDefs';

type TOCoord = IPoint & {
corner: TCornerPoint;
Expand Down
40 changes: 20 additions & 20 deletions src/shapes/object.class.ts → src/shapes/Object/Object.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
// @ts-nocheck
import { fabric } from '../../HEADER';
import { cache } from '../cache';
import { config } from '../config';
import { ALIASING_LIMIT, iMatrix, VERSION } from '../constants';
import { ObjectEvents } from '../EventTypeDefs';
import { AnimatableObject } from '../mixins/object_animation.mixin';
import { Point } from '../point.class';
import { Shadow } from '../shadow.class';
import { fabric } from '../../../HEADER';
import { cache } from '../../cache';
import { config } from '../../config';
import { ALIASING_LIMIT, iMatrix, VERSION } from '../../constants';
import { ObjectEvents } from '../../EventTypeDefs';
import { AnimatableObject } from './AnimatableObject';
import { Point } from '../../point.class';
import { Shadow } from '../../shadow.class';
import type {
TClassProperties,
TDegree,
TFiller,
TSize,
TCacheCanvasDimensions,
} from '../typedefs';
import { runningAnimations } from '../util/animation_registry';
import { clone } from '../util/lang_object';
import { capitalize } from '../util/lang_string';
import { capValue } from '../util/misc/capValue';
import { createCanvasElement, toDataURL } from '../util/misc/dom';
} from '../../typedefs';
import { runningAnimations } from '../../util/animation_registry';
import { clone } from '../../util/lang_object';
import { capitalize } from '../../util/lang_string';
import { capValue } from '../../util/misc/capValue';
import { createCanvasElement, toDataURL } from '../../util/misc/dom';
import {
invertTransform,
qrDecompose,
transformPoint,
} from '../util/misc/matrix';
import { enlivenObjectEnlivables } from '../util/misc/objectEnlive';
} from '../../util/misc/matrix';
import { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';
import {
resetObjectTransform,
saveObjectTransform,
} from '../util/misc/objectTransforms';
import { pick } from '../util/misc/pick';
import { toFixed } from '../util/misc/toFixed';
import type { Group } from './group.class';
} from '../../util/misc/objectTransforms';
import { pick } from '../../util/misc/pick';
import { toFixed } from '../../util/misc/toFixed';
import type { Group } from '../group.class';

export type TCachedFabricObject = FabricObject &
Required<
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,25 @@ import type {
TMat2D,
TOriginX,
TOriginY,
} from '../typedefs';
import { iMatrix } from '../constants';
import { Intersection } from '../intersection.class';
import { Point } from '../point.class';
import { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';
import { cos } from '../util/misc/cos';
} from '../../typedefs';
import { iMatrix } from '../../constants';
import { Intersection } from '../../intersection.class';
import { Point } from '../../point.class';
import { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';
import { cos } from '../../util/misc/cos';
import {
calcRotateMatrix,
composeMatrix,
invertTransform,
multiplyTransformMatrices,
qrDecompose,
transformPoint,
} from '../util/misc/matrix';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
import { sin } from '../util/misc/sin';
import { Canvas, StaticCanvas } from '../__types__';
import { ObjectOrigin } from './object_origin.mixin';
import { ObjectEvents } from '../EventTypeDefs';
} from '../../util/misc/matrix';
import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
import { sin } from '../../util/misc/sin';
import { Canvas, StaticCanvas } from '../../__types__';
import { ObjectOrigin } from './ObjectOrigin';
import { ObjectEvents } from '../../EventTypeDefs';

type TLineDescriptor = {
o: Point;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,11 @@
import { Point } from '../point.class';
import type { Group } from '../shapes/group.class';
import { TDegree, TOriginX, TOriginY } from '../typedefs';
import { transformPoint } from '../util/misc/matrix';
import { sizeAfterTransform } from '../util/misc/objectTransforms';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
import { CommonMethods } from './shared_methods.mixin';

const originOffset = {
left: -0.5,
top: -0.5,
center: 0,
bottom: 0.5,
right: 0.5,
};

/**
* Resolves origin value relative to center
* @private
* @param {TOriginX | TOriginY} originValue originX / originY
* @returns number
*/
export const resolveOrigin = (
originValue: TOriginX | TOriginY | number
): number =>
typeof originValue === 'string'
? originOffset[originValue]
: originValue - 0.5;
import { Point } from '../../point.class';
import type { Group } from '../group.class';
import { TDegree, TOriginX, TOriginY } from '../../typedefs';
import { transformPoint } from '../../util/misc/matrix';
import { sizeAfterTransform } from '../../util/misc/objectTransforms';
import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
import { CommonMethods } from '../../mixins/shared_methods.mixin';
import { resolveOrigin } from '../../util/misc/resolveOrigin';

export class ObjectOrigin<EventSpec> extends CommonMethods<EventSpec> {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { fabric } from '../../HEADER';
import { ObjectEvents } from '../EventTypeDefs';
import type { Group } from '../shapes/group.class';
import type { Canvas, StaticCanvas } from '../__types__';
import { ObjectGeometry } from './object_geometry.mixin';
import { fabric } from '../../../HEADER';
import { ObjectEvents } from '../../EventTypeDefs';
import type { Group } from '../group.class';
import type { Canvas, StaticCanvas } from '../../__types__';
import { ObjectGeometry } from './ObjectGeometry';

type TAncestor = StackedObject | Canvas | StaticCanvas;
type TCollection = Group | Canvas | StaticCanvas;
Expand Down
2 changes: 1 addition & 1 deletion src/shapes/active_selection.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { fabric } from '../../HEADER';
import { ControlRenderingStyleOverride } from '../controls';
import { TClassProperties } from '../typedefs';
import { enlivenObjects } from '../util/misc/objectEnlive';
import { FabricObject } from './fabricObject.class';
import { FabricObject } from './Object/FabricObject';
import { Group, groupDefaultValues } from './group.class';

export class ActiveSelection extends Group {
Expand Down
3 changes: 1 addition & 2 deletions src/shapes/circle.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import { TClassProperties } from '../typedefs';
import { cos } from '../util/misc/cos';
import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
import { sin } from '../util/misc/sin';
import { FabricObject } from './fabricObject.class';
import { fabricObjectDefaultValues } from './object.class';
import { FabricObject, fabricObjectDefaultValues } from './Object/FabricObject';

export class Circle extends FabricObject {
/**
Expand Down
Loading
You are viewing a condensed version of this merge commit. You can view the full changes here.