mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-15 11:01:21 +08:00
feat: Scoped Packages (#7911)
* chore: move tns-core-modules to nativescript-core * chore: preparing compat generate script * chore: add missing definitions * chore: no need for http-request to be private * chore: packages chore * test: generate tests for tns-core-modules * chore: add anroid module for consistency * chore: add .npmignore * chore: added privateModulesWhitelist * chore(webpack): added bundle-entry-points * chore: scripts * chore: tests changed to use @ns/core * test: add scoped-packages test project * test: fix types * test: update test project * chore: build scripts * chore: update build script * chore: npm scripts cleanup * chore: make the compat pgk work with old wp config * test: generate diff friendly tests * chore: create barrel exports * chore: move files after rebase * chore: typedoc config * chore: compat mode * chore: review of barrels * chore: remove tns-core-modules import after rebase * chore: dev workflow setup * chore: update developer-workflow * docs: experiment with API extractor * chore: api-extractor and barrel exports * chore: api-extractor configs * chore: generate d.ts rollup with api-extractor * refactor: move methods inside Frame * chore: fic tests to use Frame static methods * refactor: create Builder class * refactor: use Builder class in tests * refactor: include Style in ui barrel * chore: separate compat build script * chore: fix tslint errors * chore: update NATIVESCRIPT_CORE_ARGS * chore: fix compat pack * chore: fix ui-test-app build with linked modules * chore: Application, ApplicationSettings, Connectivity and Http * chore: export Trace, Profiling and Utils * refactor: Static create methods for ImageSource * chore: fix deprecated usages of ImageSource * chore: move Span and FormattedString to ui * chore: add events-args and ImageSource to index files * chore: check for CLI >= 6.2 when building for IOS * chore: update travis build * chore: copy Pod file to compat package * chore: update error msg ui-tests-app * refactor: Apply suggestions from code review Co-Authored-By: Martin Yankov <m.i.yankov@gmail.com> * chore: typings and refs * chore: add missing d.ts files for public API * chore: adress code review FB * chore: update api-report * chore: dev-workflow for other apps * chore: api update * chore: update api-report
This commit is contained in:

committed by
GitHub

parent
6c7139477e
commit
cc97a16800
220
nativescript-core/debugger/dom-node.ts
Normal file
220
nativescript-core/debugger/dom-node.ts
Normal file
@ -0,0 +1,220 @@
|
||||
import { CSSComputedStyleProperty } from "./css-agent";
|
||||
import { InspectorEvents } from "./devtools-elements";
|
||||
|
||||
// Needed for typings only
|
||||
import { ViewBase } from "../ui/core/view";
|
||||
|
||||
const registeredDomNodes = {};
|
||||
const ELEMENT_NODE_TYPE = 1;
|
||||
const ROOT_NODE_TYPE = 9;
|
||||
const propertyBlacklist = [
|
||||
"effectivePaddingLeft",
|
||||
"effectivePaddingBottom",
|
||||
"effectivePaddingRight",
|
||||
"effectivePaddingTop",
|
||||
"effectiveBorderTopWidth",
|
||||
"effectiveBorderRightWidth",
|
||||
"effectiveBorderBottomWidth",
|
||||
"effectiveBorderLeftWidth",
|
||||
"effectiveMinWidth",
|
||||
"effectiveMinHeight",
|
||||
"effectiveWidth",
|
||||
"effectiveHeight",
|
||||
"effectiveMarginLeft",
|
||||
"effectiveMarginTop",
|
||||
"effectiveMarginRight",
|
||||
"effectiveMarginBottom",
|
||||
"nodeName",
|
||||
"nodeType",
|
||||
"decodeWidth",
|
||||
"decodeHeight",
|
||||
"ng-reflect-items",
|
||||
"domNode",
|
||||
"touchListenerIsSet",
|
||||
"bindingContext",
|
||||
"nativeView"
|
||||
];
|
||||
|
||||
function lazy<T>(action: () => T): () => T {
|
||||
let _value: T;
|
||||
|
||||
return () => _value || (_value = action());
|
||||
}
|
||||
const percentLengthToStringLazy = lazy<(length) => string>(() => require("../ui/styling/style-properties").PercentLength.convertToString);
|
||||
const getSetPropertiesLazy = lazy<(view: ViewBase) => [string, any][]>(() => require("../ui/core/properties").getSetProperties);
|
||||
const getComputedCssValuesLazy = lazy<(view: ViewBase) => [string, any][]>(() => require("../ui/core/properties").getComputedCssValues);
|
||||
|
||||
export function registerInspectorEvents(inspector: InspectorEvents) {
|
||||
inspectorFrontendInstance = inspector;
|
||||
}
|
||||
|
||||
let inspectorFrontendInstance: any;
|
||||
function notifyInspector(callback: (inspector: InspectorEvents) => void) {
|
||||
if (inspectorFrontendInstance) {
|
||||
callback(inspectorFrontendInstance);
|
||||
}
|
||||
}
|
||||
|
||||
function valueToString(value: any): string {
|
||||
if (typeof value === "undefined" || value === null) {
|
||||
return "";
|
||||
} else if (typeof value === "object" && value.unit) {
|
||||
return percentLengthToStringLazy()(value);
|
||||
} else {
|
||||
return value + "";
|
||||
}
|
||||
}
|
||||
|
||||
function propertyFilter([name, value]: [string, any]): boolean {
|
||||
if (name[0] === "_") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value !== null && typeof value === "object") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (propertyBlacklist.indexOf(name) >= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function registerNode(domNode: DOMNode) {
|
||||
registeredDomNodes[domNode.nodeId] = domNode;
|
||||
}
|
||||
|
||||
function unregisterNode(domNode: DOMNode) {
|
||||
delete registeredDomNodes[domNode.nodeId];
|
||||
}
|
||||
|
||||
export function getNodeById(id: number): DOMNode {
|
||||
return registeredDomNodes[id];
|
||||
}
|
||||
|
||||
export class DOMNode {
|
||||
nodeId;
|
||||
nodeType;
|
||||
nodeName;
|
||||
localName;
|
||||
nodeValue = "";
|
||||
attributes: string[] = [];
|
||||
viewRef: WeakRef<ViewBase>;
|
||||
|
||||
constructor(view: ViewBase) {
|
||||
this.viewRef = new WeakRef(view);
|
||||
this.nodeType = view.typeName === "Frame" ? ROOT_NODE_TYPE : ELEMENT_NODE_TYPE;
|
||||
this.nodeId = view._domId;
|
||||
this.nodeName = view.typeName;
|
||||
this.localName = this.nodeName;
|
||||
|
||||
// Load all attributes
|
||||
this.loadAttributes();
|
||||
|
||||
registerNode(this);
|
||||
}
|
||||
|
||||
public loadAttributes() {
|
||||
this.attributes = [];
|
||||
getSetPropertiesLazy()(this.viewRef.get())
|
||||
.filter(propertyFilter)
|
||||
.forEach(pair => this.attributes.push(pair[0], pair[1] + ""));
|
||||
|
||||
}
|
||||
|
||||
get children(): DOMNode[] {
|
||||
const view = this.viewRef.get();
|
||||
if (!view) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const res = [];
|
||||
|
||||
view.eachChild((child) => {
|
||||
child.ensureDomNode();
|
||||
res.push(child.domNode);
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
onChildAdded(childView: ViewBase): void {
|
||||
notifyInspector((ins) => {
|
||||
const view = this.viewRef.get();
|
||||
|
||||
let previousChild: ViewBase;
|
||||
view.eachChild((child) => {
|
||||
if (child === childView) {
|
||||
return false;
|
||||
}
|
||||
|
||||
previousChild = child;
|
||||
|
||||
return true;
|
||||
});
|
||||
const index = !!previousChild ? previousChild._domId : 0;
|
||||
|
||||
childView.ensureDomNode();
|
||||
ins.childNodeInserted(this.nodeId, index, childView.domNode);
|
||||
});
|
||||
}
|
||||
|
||||
onChildRemoved(view: ViewBase): void {
|
||||
notifyInspector((ins) => {
|
||||
ins.childNodeRemoved(this.nodeId, view._domId);
|
||||
});
|
||||
}
|
||||
|
||||
attributeModified(name: string, value: any) {
|
||||
notifyInspector((ins) => {
|
||||
if (propertyBlacklist.indexOf(name) < 0) {
|
||||
ins.attributeModified(this.nodeId, name, valueToString(value));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
attributeRemoved(name: string) {
|
||||
notifyInspector((ins) => {
|
||||
ins.attributeRemoved(this.nodeId, name);
|
||||
});
|
||||
}
|
||||
|
||||
getComputedProperties(): CSSComputedStyleProperty[] {
|
||||
const view = this.viewRef.get();
|
||||
if (!view) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const result = getComputedCssValuesLazy()(view)
|
||||
.filter(pair => pair[0][0] !== "_")
|
||||
.map((pair) => {
|
||||
return {
|
||||
name: pair[0],
|
||||
value: valueToString(pair[1])
|
||||
};
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
dispose() {
|
||||
unregisterNode(this);
|
||||
this.viewRef.clear();
|
||||
}
|
||||
|
||||
public toObject() {
|
||||
return {
|
||||
nodeId: this.nodeId,
|
||||
nodeType: this.nodeType,
|
||||
nodeName: this.nodeName,
|
||||
localName: this.localName,
|
||||
nodeValue: this.nodeValue,
|
||||
children: this.children.map(c => c.toObject()),
|
||||
attributes: this.attributes,
|
||||
backendNodeId: 0
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user