refactor(ivy): make styling instructions use the new styling algorithm (#30742)
This commit is the final patch of the ivy styling algorithm refactor. This patch swaps functionality from the old styling mechanism to the new refactored code by changing the instruction code the compiler generates and by pointing the runtime instruction code to the new styling algorithm. PR Close #30742
This commit is contained in:

committed by
Kara Erickson

parent
f14693b9a4
commit
9c954ebc62
@ -10,11 +10,12 @@ import {Injector} from '../di';
|
||||
import {getViewComponent} from '../render3/global_utils_api';
|
||||
import {CONTAINER_HEADER_OFFSET, LContainer, NATIVE} from '../render3/interfaces/container';
|
||||
import {TElementNode, TNode, TNodeFlags, TNodeType} from '../render3/interfaces/node';
|
||||
import {StylingIndex} from '../render3/interfaces/styling';
|
||||
import {isComponent, isLContainer} from '../render3/interfaces/type_checks';
|
||||
import {LView, PARENT, TData, TVIEW, T_HOST} from '../render3/interfaces/view';
|
||||
import {getProp, getValue, isClassBasedValue} from '../render3/styling/class_and_style_bindings';
|
||||
import {getStylingContextFromLView} from '../render3/styling/util';
|
||||
import {TStylingContext} from '../render3/styling_next/interfaces';
|
||||
import {stylingMapToStringMap} from '../render3/styling_next/map_based_bindings';
|
||||
import {NodeStylingDebug} from '../render3/styling_next/styling_debug';
|
||||
import {isStylingContext} from '../render3/styling_next/util';
|
||||
import {getComponent, getContext, getInjectionTokens, getInjector, getListeners, getLocalRefs, isBrowserEvents, loadLContext, loadLContextFromNode} from '../render3/util/discovery_utils';
|
||||
import {INTERPOLATION_DELIMITER, isPropMetadataString, renderStringify} from '../render3/util/misc_utils';
|
||||
import {findComponentView} from '../render3/util/view_traversal_utils';
|
||||
@ -328,63 +329,12 @@ class DebugElement__POST_R3__ extends DebugNode__POST_R3__ implements DebugEleme
|
||||
return attributes;
|
||||
}
|
||||
|
||||
get classes(): {[key: string]: boolean;} {
|
||||
const classes: {[key: string]: boolean;} = {};
|
||||
const element = this.nativeElement;
|
||||
if (element) {
|
||||
const lContext = loadLContextFromNode(element);
|
||||
const stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView);
|
||||
if (stylingContext) {
|
||||
for (let i = StylingIndex.SingleStylesStartPosition; i < stylingContext.length;
|
||||
i += StylingIndex.Size) {
|
||||
if (isClassBasedValue(stylingContext, i)) {
|
||||
const className = getProp(stylingContext, i);
|
||||
const value = getValue(stylingContext, i);
|
||||
if (typeof value == 'boolean') {
|
||||
// we want to ignore `null` since those don't overwrite the values.
|
||||
classes[className] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Fallback, just read DOM.
|
||||
const eClasses = element.classList;
|
||||
for (let i = 0; i < eClasses.length; i++) {
|
||||
classes[eClasses[i]] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return classes;
|
||||
get styles(): {[key: string]: string | null;} {
|
||||
return _getStylingDebugInfo(this.nativeElement, false);
|
||||
}
|
||||
|
||||
get styles(): {[key: string]: string | null;} {
|
||||
const styles: {[key: string]: string | null;} = {};
|
||||
const element = this.nativeElement;
|
||||
if (element) {
|
||||
const lContext = loadLContextFromNode(element);
|
||||
const stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView);
|
||||
if (stylingContext) {
|
||||
for (let i = StylingIndex.SingleStylesStartPosition; i < stylingContext.length;
|
||||
i += StylingIndex.Size) {
|
||||
if (!isClassBasedValue(stylingContext, i)) {
|
||||
const styleName = getProp(stylingContext, i);
|
||||
const value = getValue(stylingContext, i) as string | null;
|
||||
if (value !== null) {
|
||||
// we want to ignore `null` since those don't overwrite the values.
|
||||
styles[styleName] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Fallback, just read DOM.
|
||||
const eStyles = (element as HTMLElement).style;
|
||||
for (let i = 0; i < eStyles.length; i++) {
|
||||
const name = eStyles.item(i);
|
||||
styles[name] = eStyles.getPropertyValue(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return styles;
|
||||
get classes(): {[key: string]: boolean;} {
|
||||
return _getStylingDebugInfo(this.nativeElement, true);
|
||||
}
|
||||
|
||||
get childNodes(): DebugNode[] {
|
||||
@ -435,6 +385,25 @@ class DebugElement__POST_R3__ extends DebugNode__POST_R3__ implements DebugEleme
|
||||
}
|
||||
}
|
||||
|
||||
function _getStylingDebugInfo(element: any, isClassBased: boolean) {
|
||||
if (element) {
|
||||
const context = loadLContextFromNode(element);
|
||||
const lView = context.lView;
|
||||
const tData = lView[TVIEW].data;
|
||||
const tNode = tData[context.nodeIndex] as TNode;
|
||||
if (isClassBased) {
|
||||
return isStylingContext(tNode.classes) ?
|
||||
new NodeStylingDebug(tNode.classes as TStylingContext, lView, true).values :
|
||||
stylingMapToStringMap(tNode.classes);
|
||||
} else {
|
||||
return isStylingContext(tNode.styles) ?
|
||||
new NodeStylingDebug(tNode.styles as TStylingContext, lView, false).values :
|
||||
stylingMapToStringMap(tNode.styles);
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Walk the TNode tree to find matches for the predicate.
|
||||
*
|
||||
|
Reference in New Issue
Block a user