diff --git a/src/ng/compile.js b/src/ng/compile.js index 51a8f652e8b5..7a6366f9f29b 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -2960,7 +2960,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!value) { var dataName = '$' + name + 'Controller'; - value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + + if (inheritType === '^^' && $element[0] && $element[0].nodeType === NODE_TYPE_DOCUMENT) { + // inheritedData() uses the documentElement when it finds the document, so we would + // require from the element itself. + value = null; + } else { + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } } if (!value && !optional) { diff --git a/test/e2e/fixtures/directive-require-html/index.html b/test/e2e/fixtures/directive-require-html/index.html new file mode 100644 index 000000000000..023d292f8575 --- /dev/null +++ b/test/e2e/fixtures/directive-require-html/index.html @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/test/e2e/fixtures/directive-require-html/script.js b/test/e2e/fixtures/directive-require-html/script.js new file mode 100644 index 000000000000..6035f4a0bf62 --- /dev/null +++ b/test/e2e/fixtures/directive-require-html/script.js @@ -0,0 +1,28 @@ +'use strict'; + +angular. + module('test', []). + provider('$exceptionHandler', /** @this */ function() { + this.$get = [function() { + return function(error) { + window.document.querySelector('#container').textContent = error && error.message; + }; + }]; + }). + + directive('requireDirective', function() { + return { + require: '^^requireTargetDirective', + link: function(scope, element, attrs, ctrl) { + window.document.querySelector('#container').textContent = ctrl.content; + } + }; + }). + directive('requireTargetDirective', function() { + return { + controller: function() { + this.content = 'requiredContent'; + } + }; + }); + diff --git a/test/e2e/tests/directive-require-html.spec.js b/test/e2e/tests/directive-require-html.spec.js new file mode 100644 index 000000000000..be85fdf478fb --- /dev/null +++ b/test/e2e/tests/directive-require-html.spec.js @@ -0,0 +1,10 @@ +'use strict'; + +describe('require parent controller on html element', function() { + it('should not use the html element as the parent element', function() { + + loadFixture('directive-require-html'); + + expect(element(by.id('container')).getText()).toContain('Controller \'requireTargetDirective\', required by directive \'requireDirective\', can\'t be found!'); + }); +});