@@ -64,18 +64,35 @@ List<ElementProbe> _findAllProbesInTree(dom.Node node) {
64
64
*
65
65
* The node parameter could be:
66
66
* * a [dom.Node] ,
67
- * * a CSS selector for this node.
67
+ * * a CSS selector to look for a matching node inside the [root] or the dom.document.
68
+ *
69
+ * Specifying a [root] element allows querying a node that is not attached to the DOM. It is an
70
+ * error to pass a [root] element that is already attached to the DOM.
68
71
*
69
72
* **NOTE:** This global method is here to make it easier to debug Angular
70
73
* application from the browser's REPL, unit or end-to-end tests. The
71
74
* function is not intended to be called from Angular application.
72
75
*/
73
- ElementProbe ngProbe (nodeOrSelector) {
74
- if (nodeOrSelector == null ) throw "ngProbe called without node" ;
76
+ ElementProbe ngProbe (nodeOrSelector, [dom. Node root] ) {
77
+ if (nodeOrSelector == null ) throw "ngProbe called without node/selector " ;
75
78
var node = nodeOrSelector;
76
79
if (nodeOrSelector is String ) {
77
- var nodes = ngQuery (dom.document, nodeOrSelector);
78
- node = (nodes.isNotEmpty) ? nodes.first : null ;
80
+ if (root == null ) {
81
+ root = dom.document;
82
+ } else {
83
+ var attached = false ;
84
+ for (var parent = root.parentNode; parent != null ; parent = parent.parentNode) {
85
+ if (parent == dom.document) {
86
+ attached = true ;
87
+ break ;
88
+ }
89
+ }
90
+ if (attached) throw "The root element must not be attached to the DOM" ;
91
+ root = new dom.DivElement ()..append (root);
92
+ }
93
+ var nodes = ngQuery (root, nodeOrSelector);
94
+ if (nodes.isEmpty) throw "The '$nodeOrSelector ' selector does not match any node" ;
95
+ node = nodes.first;
79
96
}
80
97
var probe = _findProbeWalkingUp (node);
81
98
if (probe != null ) {
@@ -93,7 +110,8 @@ ElementProbe ngProbe(nodeOrSelector) {
93
110
* application from the browser's REPL, unit or end-to-end tests. The function
94
111
* is not intended to be called from Angular application.
95
112
*/
96
- DirectiveInjector ngInjector (nodeOrSelector) => ngProbe (nodeOrSelector).injector;
113
+ DirectiveInjector ngInjector (nodeOrSelector, [dom.Node root]) =>
114
+ ngProbe (nodeOrSelector, root).injector;
97
115
98
116
99
117
/**
@@ -103,11 +121,10 @@ DirectiveInjector ngInjector(nodeOrSelector) => ngProbe(nodeOrSelector).injector
103
121
* application from the browser's REPL, unit or end-to-end tests. The function
104
122
* is not intended to be called from Angular application.
105
123
*/
106
- Scope ngScope (nodeOrSelector) => ngProbe (nodeOrSelector).scope;
124
+ Scope ngScope (nodeOrSelector, [dom. Node root] ) => ngProbe (nodeOrSelector, root ).scope;
107
125
108
126
109
- List <dom.Element > ngQuery (dom.Node element, String selector,
110
- [String containsText]) {
127
+ List <dom.Element > ngQuery (dom.Node element, String selector, [String containsText]) {
111
128
var list = [];
112
129
var children = [element];
113
130
if ((element is dom.Element ) && element.shadowRoot != null ) {
0 commit comments