Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 0199075

Browse files
vicbjbdeboer
authored andcommitted
feat(debug): Make ngProbe accept a CSS selector
Closes #970
1 parent 1633521 commit 0199075

File tree

4 files changed

+45
-20
lines changed

4 files changed

+45
-20
lines changed

lib/application.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ class AngularModule extends Module {
126126
*/
127127
abstract class Application {
128128
static _find(String selector, [dom.Element defaultElement]) {
129-
var element = dom.window.document.querySelector(selector);
129+
var element = dom.document.querySelector(selector);
130130
if (element == null) element = defaultElement;
131131
if (element == null) {
132132
throw "Could not find application element '$selector'.";

lib/introspection.dart

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,44 @@ import 'package:angular/core/module_internal.dart';
1010
import 'package:angular/core_dom/module_internal.dart';
1111

1212
/**
13-
* Return the closest [ElementProbe] object for a given [Element].
13+
* Return the [ElementProbe] object for the closest [Element] in the hierarchy.
14+
*
15+
* The node parameter could be:
16+
* * a [dom.Node],
17+
* * a CSS selector for this node.
1418
*
1519
* **NOTE:** This global method is here to make it easier to debug Angular
1620
* application from the browser's REPL, unit or end-to-end tests. The
1721
* function is not intended to be called from Angular application.
1822
*/
19-
ElementProbe ngProbe(dom.Node node) {
20-
if (node == null) {
21-
throw "ngProbe called without node";
23+
ElementProbe ngProbe(nodeOrSelector) {
24+
var errorMsg;
25+
var node;
26+
if (nodeOrSelector == null) throw "ngProbe called without node";
27+
if (nodeOrSelector is String) {
28+
var nodes = ngQuery(dom.document, nodeOrSelector);
29+
if (nodes.isNotEmpty) node = nodes.first;
30+
errorMsg = "Could not find a probe for the selector '$nodeOrSelector' nor its parents";
31+
} else {
32+
node = nodeOrSelector;
33+
errorMsg = "Could not find a probe for the node '$node' nor its parents";
2234
}
23-
var origNode = node;
2435
while (node != null) {
2536
var probe = elementExpando[node];
2637
if (probe != null) return probe;
2738
node = node.parent;
2839
}
29-
throw "Could not find a probe for [$origNode]";
40+
throw errorMsg;
3041
}
3142

32-
3343
/**
3444
* Return the [Injector] associated with a current [Element].
3545
*
3646
* **NOTE**: This global method is here to make it easier to debug Angular
3747
* application from the browser's REPL, unit or end-to-end tests. The function
3848
* is not intended to be called from Angular application.
3949
*/
40-
Injector ngInjector(dom.Node node) => ngProbe(node).injector;
50+
Injector ngInjector(nodeOrSelector) => ngProbe(nodeOrSelector).injector;
4151

4252

4353
/**
@@ -47,7 +57,7 @@ Injector ngInjector(dom.Node node) => ngProbe(node).injector;
4757
* application from the browser's REPL, unit or end-to-end tests. The function
4858
* is not intended to be called from Angular application.
4959
*/
50-
Scope ngScope(dom.Node node) => ngProbe(node).scope;
60+
Scope ngScope(nodeOrSelector) => ngProbe(nodeOrSelector).scope;
5161

5262

5363
List<dom.Element> ngQuery(dom.Node element, String selector,
@@ -70,14 +80,11 @@ List<dom.Element> ngQuery(dom.Node element, String selector,
7080
}
7181

7282
/**
73-
* Return a List of directive controllers associated with a current [Element].
83+
* Return a List of directives associated with a current [Element].
7484
*
7585
* **NOTE**: This global method is here to make it easier to debug Angular
7686
* application from the browser's REPL, unit or end-to-end tests. The function
7787
* is not intended to be called from Angular application.
7888
*/
79-
List<Object> ngDirectives(dom.Node node) {
80-
ElementProbe probe = elementExpando[node];
81-
return probe == null ? [] : probe.directives;
82-
}
89+
List<Object> ngDirectives(nodeOrSelector) => ngProbe(nodeOrSelector).directives;
8390

lib/introspection_js.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ var elementExpando = new Expando('element');
1717

1818
publishToJavaScript() {
1919
js.context
20-
..['ngProbe'] = new js.JsFunction.withThis((_, dom.Node node) => _jsProbe(ngProbe(node)))
21-
..['ngInjector'] = new js.JsFunction.withThis((_, dom.Node node) => _jsInjector(ngInjector(node)))
22-
..['ngScope'] = new js.JsFunction.withThis((_, dom.Node node) => _jsScope(ngScope(node), ngProbe(node).injector.get(ScopeStatsConfig)))
20+
..['ngProbe'] = new js.JsFunction.withThis((_, nodeOrSelector) =>
21+
_jsProbe(ngProbe(nodeOrSelector)))
22+
..['ngInjector'] = new js.JsFunction.withThis((_, nodeOrSelector) =>
23+
_jsInjector(ngInjector(nodeOrSelector)))
24+
..['ngScope'] = new js.JsFunction.withThis((_, nodeOrSelector) =>
25+
_jsScope(ngScope(nodeOrSelector), ngProbe(nodeOrSelector).injector.get(ScopeStatsConfig)))
2326
..['ngQuery'] = new js.JsFunction.withThis((_, dom.Node node, String selector, [String containsText]) =>
24-
new js.JsArray.from(ngQuery(node, selector, containsText)));
27+
new js.JsArray.from(ngQuery(node, selector, containsText)));
2528
}
2629

2730
js.JsObject _jsProbe(ElementProbe probe) {
@@ -34,7 +37,7 @@ js.JsObject _jsProbe(ElementProbe probe) {
3437
}
3538

3639
js.JsObject _jsInjector(Injector injector) =>
37-
new js.JsObject.jsify({"get": injector.get})..['_dart_'] = injector;
40+
new js.JsObject.jsify({"get": injector.get})..['_dart_'] = injector;
3841

3942
js.JsObject _jsScope(Scope scope, ScopeStatsConfig config) {
4043
return new js.JsObject.jsify({

test/introspection_spec.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ library introspection_spec;
33
import '_specs.dart';
44
import 'dart:js' as js;
55
import 'package:angular/application_factory.dart';
6+
import 'dart:html';
67

78
void main() {
89
describe('introspection', () {
@@ -31,6 +32,20 @@ void main() {
3132
expect(toHtml(ngQuery(div, 'li', 'xxx'))).toEqual('');
3233
});
3334

35+
it('should select probe using CSS selector', (TestBed _) {
36+
_.compile('<div ng-show="true">WORKS</div>');
37+
document.body.append(_.rootElement);
38+
var div = new Element.html('<div><p><span></span></p></div>');
39+
var span = div.querySelector('span');
40+
var shadowRoot = span.createShadowRoot();
41+
shadowRoot.innerHtml = '<ul><li>stash</li><li>secret</li><ul>';
42+
43+
ElementProbe probe = ngProbe('[ng-show]');
44+
expect(probe).toBeDefined();
45+
expect(probe.injector.get(NgShow) is NgShow).toEqual(true);
46+
_.rootElement.remove();
47+
});
48+
3449
it('should select elements in the root shadow root', () {
3550
var div = new Element.html('<div></div>');
3651
var shadowRoot = div.createShadowRoot();

0 commit comments

Comments
 (0)