From 04b49588cc0b77df19c85dc42eef63d16c1a3f58 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Mon, 16 Jan 2017 08:38:46 +0100 Subject: [PATCH] See #290 - reworks `border` overriding. Why: * Border is a complex case where both `border` and all its components: `border-color`, `border-style`, and `border-width` are components. Also `border-(bottom|left|right|top)` are shorthands too. * this commit restores aggressive merging shorthand overriding right inside shorthand compacting code. --- lib/optimizer/level-2/compactable.js | 284 +++++++++++++++--- .../level-2/compacting/find-component-in.js | 40 +++ .../level-2/compacting/is-component-of.js | 22 ++ lib/optimizer/level-2/compacting/optimize.js | 43 +-- .../level-2/compacting/override-compactor.js | 70 +++-- .../overrides-non-component-shorthand.js | 9 + .../level-2/compacting/populate-components.js | 10 + .../level-2/compacting/shorthand-compactor.js | 21 +- lib/optimizer/level-2/merge-adjacent.js | 7 +- .../level-2/merge-non-adjacent-by-selector.js | 7 +- lib/optimizer/level-2/optimize.js | 7 +- lib/optimizer/level-2/reduce-non-adjacent.js | 7 +- test/fixtures/big-min.css | 12 +- test/optimizer/level-2/break-up-test.js | 126 ++++++-- .../compacting/find-component-in-test.js | 93 ++++++ .../compacting/is-component-of-test.js | 127 ++++++++ .../compacting/longhand-overriding-test.js | 12 +- .../level-2/compacting/optimize-test.js | 74 +++-- .../compacting/override-compacting-test.js | 9 +- .../overrides-non-component-shorthand-test.js | 95 ++++++ .../compacting/populate-components-test.js | 87 +++++- .../compacting/shorthand-compacting-test.js | 9 +- .../level-2/reduce-non-adjacent-test.js | 8 + 23 files changed, 1014 insertions(+), 165 deletions(-) create mode 100644 lib/optimizer/level-2/compacting/find-component-in.js create mode 100644 lib/optimizer/level-2/compacting/is-component-of.js create mode 100644 lib/optimizer/level-2/compacting/overrides-non-component-shorthand.js create mode 100644 test/optimizer/level-2/compacting/find-component-in-test.js create mode 100644 test/optimizer/level-2/compacting/is-component-of-test.js create mode 100644 test/optimizer/level-2/compacting/overrides-non-component-shorthand-test.js diff --git a/lib/optimizer/level-2/compactable.js b/lib/optimizer/level-2/compactable.js index 88c3ea19f..e77c635d2 100644 --- a/lib/optimizer/level-2/compactable.js +++ b/lib/optimizer/level-2/compactable.js @@ -57,11 +57,17 @@ var compactable = { }, 'background-clip': { canOverride: canOverride.always, + componentOf: [ + 'background' + ], defaultValue: 'border-box', shortestValue: 'border-box' }, 'background-color': { canOverride: canOverride.color, + componentOf: [ + 'background' + ], defaultValue: 'transparent', multiplexLastOnly: true, nonMergeableValue: 'none', @@ -69,32 +75,50 @@ var compactable = { }, 'background-image': { canOverride: canOverride.backgroundImage, + componentOf: [ + 'background' + ], defaultValue: 'none' }, 'background-origin': { canOverride: canOverride.always, + componentOf: [ + 'background' + ], defaultValue: 'padding-box', shortestValue: 'border-box' }, 'background-repeat': { canOverride: canOverride.always, + componentOf: [ + 'background' + ], defaultValue: ['repeat'], doubleValues: true }, 'background-position': { canOverride: canOverride.alwaysButIntoFunction, + componentOf: [ + 'background' + ], defaultValue: ['0', '0'], doubleValues: true, shortestValue: '0' }, 'background-size': { canOverride: canOverride.alwaysButIntoFunction, + componentOf: [ + 'background' + ], defaultValue: ['auto'], doubleValues: true, shortestValue: '0 0' }, 'background-attachment': { canOverride: canOverride.always, + componentOf: [ + 'background' + ], defaultValue: 'scroll' }, 'border': { @@ -106,22 +130,206 @@ var compactable = { 'border-color' ], defaultValue: 'none', + overridesShorthands: [ + 'border-bottom', + 'border-left', + 'border-right', + 'border-top' + ], + restore: restore.withoutDefaults, + shorthand: true, + shorthandComponents: true + }, + 'border-bottom': { + breakUp: breakUp.border, + canOverride: canOverride.border, + components: [ + 'border-bottom-width', + 'border-bottom-style', + 'border-bottom-color' + ], + defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true }, + 'border-bottom-color': { + canOverride: canOverride.color, + componentOf: [ + 'border-bottom', + 'border-color' + ], + defaultValue: 'none' + }, + 'border-bottom-style': { + canOverride: canOverride.always, + componentOf: [ + 'border-bottom', + 'border-style' + ], + defaultValue: 'none' + }, + 'border-bottom-width': { + canOverride: canOverride.unit, + componentOf: [ + 'border-bottom', + 'border-width' + ], + defaultValue: 'medium', + shortestValue: '0' + }, 'border-color': { + breakUp: breakUp.fourValues, + canOverride: canOverride.color, + componentOf: ['border'], + components: [ + 'border-top-color', + 'border-right-color', + 'border-bottom-color', + 'border-left-color' + ], + defaultValue: 'none', + restore: restore.fourValues, + shortestValue: 'red', + shorthand: true + }, + 'border-left': { + breakUp: breakUp.border, + canOverride: canOverride.border, + components: [ + 'border-left-width', + 'border-left-style', + 'border-left-color' + ], + defaultValue: 'none', + restore: restore.withoutDefaults, + shorthand: true + }, + 'border-left-color': { canOverride: canOverride.color, + componentOf: [ + 'border-color', + 'border-left' + ], + defaultValue: 'none' + }, + 'border-left-style': { + canOverride: canOverride.always, + componentOf: [ + 'border-left', + 'border-style' + ], + defaultValue: 'none' + }, + 'border-left-width': { + canOverride: canOverride.unit, + componentOf: [ + 'border-left', + 'border-width' + ], + defaultValue: 'medium', + shortestValue: '0' + }, + 'border-right': { + breakUp: breakUp.border, + canOverride: canOverride.border, + components: [ + 'border-right-width', + 'border-right-style', + 'border-right-color' + ], defaultValue: 'none', + restore: restore.withoutDefaults, shorthand: true }, + 'border-right-color': { + canOverride: canOverride.color, + componentOf: [ + 'border-color', + 'border-right' + ], + defaultValue: 'none' + }, + 'border-right-style': { + canOverride: canOverride.always, + componentOf: [ + 'border-right', + 'border-style' + ], + defaultValue: 'none' + }, + 'border-right-width': { + canOverride: canOverride.unit, + componentOf: [ + 'border-right', + 'border-width' + ], + defaultValue: 'medium', + shortestValue: '0' + }, 'border-style': { + breakUp: breakUp.fourValues, canOverride: canOverride.always, + componentOf: [ + 'border' + ], + components: [ + 'border-top-style', + 'border-right-style', + 'border-bottom-style', + 'border-left-style' + ], defaultValue: 'none', + restore: restore.fourValues, shorthand: true }, + 'border-top': { + breakUp: breakUp.border, + canOverride: canOverride.border, + components: [ + 'border-top-width', + 'border-top-style', + 'border-top-color' + ], + defaultValue: 'none', + restore: restore.withoutDefaults, + shorthand: true + }, + 'border-top-color': { + canOverride: canOverride.color, + componentOf: [ + 'border-color', + 'border-top' + ], + defaultValue: 'none' + }, + 'border-top-style': { + canOverride: canOverride.always, + componentOf: [ + 'border-style', + 'border-top' + ], + defaultValue: 'none' + }, + 'border-top-width': { + canOverride: canOverride.unit, + componentOf: [ + 'border-top', + 'border-width' + ], + defaultValue: 'medium', + shortestValue: '0' + }, 'border-width': { + breakUp: breakUp.fourValues, canOverride: canOverride.unit, + components: [ + 'border-top-width', + 'border-right-width', + 'border-bottom-width', + 'border-left-width' + ], defaultValue: 'medium', + restore: restore.fourValues, shortestValue: '0', shorthand: true }, @@ -150,6 +358,9 @@ var compactable = { }, 'list-style-type' : { canOverride: canOverride.always, + componentOf: [ + 'list-style' + ], defaultValue: '__hack', // NOTE: we can't tell the real default value here, it's 'disc' for