refactor(ivy): remove all old styling code prior to refactor (#31193)
In the previous patch () all the existing styling code was turned off in favor of using the new refactored ivy styling code. This patch is a follow up patch to that and removes all old, unused styling code from the render3 directory. PR Close #31193
This commit is contained in:

committed by
Kara Erickson

parent
0e68c7edf9
commit
f50dede8f7
File diff suppressed because it is too large
Load Diff
@ -1,24 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {PlayState, Player, PlayerHandler} from '../interfaces/player';
|
||||
|
||||
export class CorePlayerHandler implements PlayerHandler {
|
||||
private _players: Player[] = [];
|
||||
|
||||
flushPlayers() {
|
||||
for (let i = 0; i < this._players.length; i++) {
|
||||
const player = this._players[i];
|
||||
if (!player.parent && player.state === PlayState.Pending) {
|
||||
player.play();
|
||||
}
|
||||
}
|
||||
this._players.length = 0;
|
||||
}
|
||||
|
||||
queuePlayer(player: Player) { this._players.push(player); }
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {HostInstructionsQueue, HostInstructionsQueueIndex, StylingContext, StylingIndex} from '../interfaces/styling';
|
||||
import {DEFAULT_TEMPLATE_DIRECTIVE_INDEX} from '../styling/shared';
|
||||
|
||||
/*
|
||||
* This file contains the logic to defer all hostBindings-related styling code to run
|
||||
* at a later point, instead of immediately (as is the case with how template-level
|
||||
* styling instructions are run).
|
||||
*
|
||||
* Certain styling instructions, present within directives, components and sub-classed
|
||||
* directives, are evaluated at different points (depending on priority) and will therefore
|
||||
* not be applied to the styling context of an element immediately. They are instead
|
||||
* designed to be applied just before styling is applied to an element.
|
||||
*
|
||||
* (The priority for when certain host-related styling operations are executed is discussed
|
||||
* more within `interfaces/styling.ts`.)
|
||||
*/
|
||||
|
||||
export function registerHostDirective(context: StylingContext, directiveIndex: number) {
|
||||
let buffer = context[StylingIndex.HostInstructionsQueue];
|
||||
if (!buffer) {
|
||||
buffer = context[StylingIndex.HostInstructionsQueue] = [DEFAULT_TEMPLATE_DIRECTIVE_INDEX];
|
||||
}
|
||||
buffer[HostInstructionsQueueIndex.LastRegisteredDirectiveIndexPosition] = directiveIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Queues a styling instruction to be run just before `renderStyling()` is executed.
|
||||
*/
|
||||
export function enqueueHostInstruction<T extends Function>(
|
||||
context: StylingContext, priority: number, instructionFn: T, instructionFnArgs: ParamsOf<T>) {
|
||||
const buffer: HostInstructionsQueue|null = context[StylingIndex.HostInstructionsQueue];
|
||||
// Buffer may be null if host element is a template node. In this case, just ignore the style.
|
||||
if (buffer != null) {
|
||||
const index = findNextInsertionIndex(buffer, priority);
|
||||
buffer.splice(index, 0, priority, instructionFn, instructionFnArgs);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Figures out where exactly to to insert the next host instruction queue entry.
|
||||
*/
|
||||
function findNextInsertionIndex(buffer: HostInstructionsQueue, priority: number): number {
|
||||
for (let i = HostInstructionsQueueIndex.ValuesStartPosition; i < buffer.length;
|
||||
i += HostInstructionsQueueIndex.Size) {
|
||||
const p = buffer[i + HostInstructionsQueueIndex.DirectiveIndexOffset] as number;
|
||||
if (p > priority) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return buffer.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates through the host instructions queue (if present within the provided
|
||||
* context) and executes each queued instruction entry.
|
||||
*/
|
||||
export function flushQueue(this: unknown, context: StylingContext): void {
|
||||
const buffer = context[StylingIndex.HostInstructionsQueue];
|
||||
if (buffer) {
|
||||
for (let i = HostInstructionsQueueIndex.ValuesStartPosition; i < buffer.length;
|
||||
i += HostInstructionsQueueIndex.Size) {
|
||||
const fn = buffer[i + HostInstructionsQueueIndex.InstructionFnOffset] as Function;
|
||||
const args = buffer[i + HostInstructionsQueueIndex.ParamsOffset] as any[];
|
||||
fn.apply(this, args);
|
||||
}
|
||||
buffer.length = HostInstructionsQueueIndex.ValuesStartPosition;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether or not to allow the host instructions queue to be flushed or not.
|
||||
*
|
||||
* Because the hostBindings function code is unaware of the presence of other host bindings
|
||||
* (as well as the template function) then styling is evaluated multiple times per element.
|
||||
* To prevent style and class values from being applied to the element multiple times, a
|
||||
* flush is only allowed when the last directive (the directive that was registered into
|
||||
* the styling context) attempts to render its styling.
|
||||
*/
|
||||
export function allowFlush(context: StylingContext, directiveIndex: number): boolean {
|
||||
const buffer = context[StylingIndex.HostInstructionsQueue];
|
||||
if (buffer) {
|
||||
return buffer[HostInstructionsQueueIndex.LastRegisteredDirectiveIndexPosition] ===
|
||||
directiveIndex;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Infers the parameters of a given function into a typed array.
|
||||
*/
|
||||
export type ParamsOf<T> = T extends(...args: infer T) => any ? T : never;
|
@ -1,33 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {PlayerFactory, PlayerFactoryBuildFn} from '../interfaces/player';
|
||||
|
||||
/**
|
||||
* Combines the binding value and a factory for an animation player.
|
||||
*
|
||||
* Used to bind a player to an element template binding (currently only
|
||||
* `[style]`, `[style.prop]`, `[class]` and `[class.name]` bindings
|
||||
* supported). The provided `factoryFn` function will be run once all
|
||||
* the associated bindings have been evaluated on the element and is
|
||||
* designed to return a player which will then be placed on the element.
|
||||
*
|
||||
* @param factoryFn The function that is used to create a player
|
||||
* once all the rendering-related (styling values) have been
|
||||
* processed for the element binding.
|
||||
* @param value The raw value that will be exposed to the binding
|
||||
* so that the binding can update its internal values when
|
||||
* any changes are evaluated.
|
||||
*/
|
||||
export function bindPlayerFactory<T>(factoryFn: PlayerFactoryBuildFn, value: T): PlayerFactory {
|
||||
return new BoundPlayerFactory(factoryFn, value) as any;
|
||||
}
|
||||
|
||||
export class BoundPlayerFactory<T> {
|
||||
'__brand__': 'Brand for PlayerFactory that nothing will match';
|
||||
constructor(public fn: PlayerFactoryBuildFn, public value: T) {}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* The default directive styling index value for template-based bindings.
|
||||
*
|
||||
* All host-level bindings (e.g. `hostStyleProp` and `hostStyleMap`) are
|
||||
* assigned a directive styling index value based on the current directive
|
||||
* uniqueId and the directive super-class inheritance depth. But for template
|
||||
* bindings they always have the same directive styling index value.
|
||||
*/
|
||||
export const DEFAULT_TEMPLATE_DIRECTIVE_INDEX = 0;
|
@ -1,30 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {StylingContext} from '../interfaces/styling';
|
||||
|
||||
let stylingContext: StylingContext|null = null;
|
||||
|
||||
/**
|
||||
* Gets the most recent styling context value.
|
||||
*
|
||||
* Note that only one styling context is stored at a given time.
|
||||
*/
|
||||
export function getCachedStylingContext() {
|
||||
return stylingContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the most recent styling context value.
|
||||
*
|
||||
* Note that only one styling context is stored at a given time.
|
||||
*
|
||||
* @param context The styling context value that will be stored
|
||||
*/
|
||||
export function setCachedStylingContext(context: StylingContext | null) {
|
||||
stylingContext = context;
|
||||
}
|
@ -1,263 +0,0 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import '../../util/ng_dev_mode';
|
||||
|
||||
import {StyleSanitizeFn} from '../../sanitization/style_sanitizer';
|
||||
import {getLContext} from '../context_discovery';
|
||||
import {LContainer} from '../interfaces/container';
|
||||
import {LContext} from '../interfaces/context';
|
||||
import {TNode, TNodeFlags} from '../interfaces/node';
|
||||
import {PlayState, Player, PlayerContext, PlayerIndex} from '../interfaces/player';
|
||||
import {RElement} from '../interfaces/renderer';
|
||||
import {DirectiveRegistryValuesIndex, InitialStylingValues, StylingContext, StylingFlags, StylingIndex} from '../interfaces/styling';
|
||||
import {isStylingContext} from '../interfaces/type_checks';
|
||||
import {HEADER_OFFSET, HOST, LView, RootContext} from '../interfaces/view';
|
||||
import {getTNode} from '../util/view_utils';
|
||||
|
||||
import {CorePlayerHandler} from './core_player_handler';
|
||||
import {DEFAULT_TEMPLATE_DIRECTIVE_INDEX} from './shared';
|
||||
|
||||
export const ANIMATION_PROP_PREFIX = '@';
|
||||
|
||||
export function createEmptyStylingContext(
|
||||
wrappedElement?: LContainer | LView | RElement | null, sanitizer?: StyleSanitizeFn | null,
|
||||
initialStyles?: InitialStylingValues | null,
|
||||
initialClasses?: InitialStylingValues | null): StylingContext {
|
||||
const context: StylingContext = [
|
||||
wrappedElement || null, // Element
|
||||
0, // MasterFlags
|
||||
[] as any, // DirectiveRefs (this gets filled below)
|
||||
initialStyles || [null, null], // InitialStyles
|
||||
initialClasses || [null, null], // InitialClasses
|
||||
[0, 0], // SinglePropOffsets
|
||||
[0], // CachedMultiClassValue
|
||||
[0], // CachedMultiStyleValue
|
||||
null, // HostBuffer
|
||||
null, // PlayerContext
|
||||
];
|
||||
|
||||
// whenever a context is created there is always a `null` directive
|
||||
// that is registered (which is a placeholder for the "template").
|
||||
allocateOrUpdateDirectiveIntoContext(context, DEFAULT_TEMPLATE_DIRECTIVE_INDEX);
|
||||
return context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocates (registers) a directive into the directive registry within the provided styling
|
||||
* context.
|
||||
*
|
||||
* For each and every `[style]`, `[style.prop]`, `[class]`, `[class.name]` binding
|
||||
* (as well as static style and class attributes) a directive, component or template
|
||||
* is marked as the owner. When an owner is determined (this happens when the template
|
||||
* is first passed over) the directive owner is allocated into the styling context. When
|
||||
* this happens, each owner gets its own index value. This then ensures that once any
|
||||
* style and/or class binding are assigned into the context then they are marked to
|
||||
* that directive's index value.
|
||||
*
|
||||
* @param context the target StylingContext
|
||||
* @param directiveRef the directive that will be allocated into the context
|
||||
* @returns the index where the directive was inserted into
|
||||
*/
|
||||
export function allocateOrUpdateDirectiveIntoContext(
|
||||
context: StylingContext, directiveIndex: number, singlePropValuesIndex: number = -1,
|
||||
styleSanitizer?: StyleSanitizeFn | null | undefined): void {
|
||||
const directiveRegistry = context[StylingIndex.DirectiveRegistryPosition];
|
||||
|
||||
const index = directiveIndex * DirectiveRegistryValuesIndex.Size;
|
||||
// we preemptively make space into the directives array and then
|
||||
// assign values slot-by-slot to ensure that if the directive ordering
|
||||
// changes then it will still function
|
||||
const limit = index + DirectiveRegistryValuesIndex.Size;
|
||||
for (let i = directiveRegistry.length; i < limit; i += DirectiveRegistryValuesIndex.Size) {
|
||||
// -1 is used to signal that the directive has been allocated, but
|
||||
// no actual style or class bindings have been registered yet...
|
||||
directiveRegistry.push(-1, null);
|
||||
}
|
||||
|
||||
const propValuesStartPosition = index + DirectiveRegistryValuesIndex.SinglePropValuesIndexOffset;
|
||||
if (singlePropValuesIndex >= 0 && directiveRegistry[propValuesStartPosition] === -1) {
|
||||
directiveRegistry[propValuesStartPosition] = singlePropValuesIndex;
|
||||
directiveRegistry[index + DirectiveRegistryValuesIndex.StyleSanitizerOffset] =
|
||||
styleSanitizer || null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used clone a copy of a pre-computed template of a styling context.
|
||||
*
|
||||
* A pre-computed template is designed to be computed once for a given element
|
||||
* (instructions.ts has logic for caching this).
|
||||
*/
|
||||
export function allocStylingContext(
|
||||
element: RElement | null, templateStyleContext: StylingContext): StylingContext {
|
||||
// each instance gets a copy
|
||||
const context = templateStyleContext.slice() as any as StylingContext;
|
||||
|
||||
// the HEADER values contain arrays which also need
|
||||
// to be copied over into the new context
|
||||
for (let i = 0; i < StylingIndex.SingleStylesStartPosition; i++) {
|
||||
const value = templateStyleContext[i];
|
||||
if (Array.isArray(value)) {
|
||||
context[i] = value.slice();
|
||||
}
|
||||
}
|
||||
|
||||
context[StylingIndex.ElementPosition] = element;
|
||||
|
||||
// this will prevent any other directives from extending the context
|
||||
context[StylingIndex.MasterFlagPosition] |= StylingFlags.BindingAllocationLocked;
|
||||
return context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the `StylingContext` at a given index.
|
||||
*
|
||||
* This method lazily creates the `StylingContext`. This is because in most cases
|
||||
* we have styling without any bindings. Creating `StylingContext` eagerly would mean that
|
||||
* every style declaration such as `<div style="color: red">` would result `StyleContext`
|
||||
* which would create unnecessary memory pressure.
|
||||
*
|
||||
* @param index Index of the style allocation. See: `styling`.
|
||||
* @param viewData The view to search for the styling context
|
||||
*/
|
||||
export function getStylingContextFromLView(index: number, viewData: LView): StylingContext {
|
||||
let storageIndex = index;
|
||||
let slotValue: LContainer|LView|StylingContext|RElement = viewData[storageIndex];
|
||||
let wrapper: LContainer|LView|StylingContext = viewData;
|
||||
|
||||
while (Array.isArray(slotValue)) {
|
||||
wrapper = slotValue;
|
||||
slotValue = slotValue[HOST] as LView | StylingContext | RElement;
|
||||
}
|
||||
|
||||
if (isStylingContext(wrapper)) {
|
||||
return wrapper;
|
||||
} else {
|
||||
// This is an LView or an LContainer
|
||||
const stylingTemplate = getTNode(index - HEADER_OFFSET, viewData).stylingTemplate;
|
||||
|
||||
if (wrapper !== viewData) {
|
||||
storageIndex = HOST;
|
||||
}
|
||||
|
||||
return wrapper[storageIndex] = stylingTemplate ?
|
||||
allocStylingContext(slotValue, stylingTemplate) :
|
||||
createEmptyStylingContext(slotValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export function isAnimationProp(name: string): boolean {
|
||||
return name[0] === ANIMATION_PROP_PREFIX;
|
||||
}
|
||||
|
||||
export function forceClassesAsString(classes: string | {[key: string]: any} | null | undefined):
|
||||
string {
|
||||
if (classes && typeof classes !== 'string') {
|
||||
classes = Object.keys(classes).join(' ');
|
||||
}
|
||||
return (classes as string) || '';
|
||||
}
|
||||
|
||||
export function forceStylesAsString(styles: {[key: string]: any} | null | undefined): string {
|
||||
let str = '';
|
||||
if (styles) {
|
||||
const props = Object.keys(styles);
|
||||
for (let i = 0; i < props.length; i++) {
|
||||
const prop = props[i];
|
||||
str += (i ? ';' : '') + `${prop}:${styles[prop]}`;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
export function addPlayerInternal(
|
||||
playerContext: PlayerContext, rootContext: RootContext, element: HTMLElement,
|
||||
player: Player | null, playerContextIndex: number, ref?: any): boolean {
|
||||
ref = ref || element;
|
||||
if (playerContextIndex) {
|
||||
playerContext[playerContextIndex] = player;
|
||||
} else {
|
||||
playerContext.push(player);
|
||||
}
|
||||
|
||||
if (player) {
|
||||
player.addEventListener(PlayState.Destroyed, () => {
|
||||
const index = playerContext.indexOf(player);
|
||||
const nonFactoryPlayerIndex = playerContext[PlayerIndex.NonBuilderPlayersStart];
|
||||
|
||||
// if the player is being removed from the factory side of the context
|
||||
// (which is where the [style] and [class] bindings do their thing) then
|
||||
// that side of the array cannot be resized since the respective bindings
|
||||
// have pointer index values that point to the associated factory instance
|
||||
if (index) {
|
||||
if (index < nonFactoryPlayerIndex) {
|
||||
playerContext[index] = null;
|
||||
} else {
|
||||
playerContext.splice(index, 1);
|
||||
}
|
||||
}
|
||||
player.destroy();
|
||||
});
|
||||
|
||||
const playerHandler =
|
||||
rootContext.playerHandler || (rootContext.playerHandler = new CorePlayerHandler());
|
||||
playerHandler.queuePlayer(player, ref);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
export function getPlayersInternal(playerContext: PlayerContext): Player[] {
|
||||
const players: Player[] = [];
|
||||
const nonFactoryPlayersStart = playerContext[PlayerIndex.NonBuilderPlayersStart];
|
||||
|
||||
// add all factory-based players (which are a part of [style] and [class] bindings)
|
||||
for (let i = PlayerIndex.PlayerBuildersStartPosition + PlayerIndex.PlayerOffsetPosition;
|
||||
i < nonFactoryPlayersStart; i += PlayerIndex.PlayerAndPlayerBuildersTupleSize) {
|
||||
const player = playerContext[i] as Player | null;
|
||||
if (player) {
|
||||
players.push(player);
|
||||
}
|
||||
}
|
||||
|
||||
// add all custom players (not a part of [style] and [class] bindings)
|
||||
for (let i = nonFactoryPlayersStart; i < playerContext.length; i++) {
|
||||
players.push(playerContext[i] as Player);
|
||||
}
|
||||
|
||||
return players;
|
||||
}
|
||||
|
||||
|
||||
export function getOrCreatePlayerContext(target: {}, context?: LContext | null): PlayerContext|
|
||||
null {
|
||||
context = context || getLContext(target) !;
|
||||
if (!context) {
|
||||
ngDevMode && throwInvalidRefError();
|
||||
return null;
|
||||
}
|
||||
|
||||
const {lView, nodeIndex} = context;
|
||||
const stylingContext = getStylingContextFromLView(nodeIndex, lView);
|
||||
return getPlayerContext(stylingContext) || allocPlayerContext(stylingContext);
|
||||
}
|
||||
|
||||
export function getPlayerContext(stylingContext: StylingContext): PlayerContext|null {
|
||||
return stylingContext[StylingIndex.PlayerContext];
|
||||
}
|
||||
|
||||
export function allocPlayerContext(data: StylingContext): PlayerContext {
|
||||
return data[StylingIndex.PlayerContext] =
|
||||
[PlayerIndex.SinglePlayerBuildersStartPosition, null, null, null, null];
|
||||
}
|
||||
|
||||
export function throwInvalidRefError() {
|
||||
throw new Error('Only elements that exist in an Angular application can be used for animations');
|
||||
}
|
Reference in New Issue
Block a user