Module: Angular::ClientScript
- Defined in:
- lib/angular/client_script.rb
Constant Summary collapse
- FN_waitForAngular =
*/
"function(selector, callback) {\n var el = document.querySelector(selector);\n return el;\n try {\n if (angular.getTestability) {\n angular.getTestability(el).whenStable(callback);\n } else {\n angular.element(el).injector().get('$browser').\n notifyWhenNoOutstandingRequests(callback);\n }\n } catch (e) {\n callback(e);\n }\n};\n"- FN_findBindings =
/**
* Find a list of elements in the page by their angular binding. * * @param {string} binding The binding, e.g. {{cat.name}}. * @param {boolean} exactMatch Whether the binding needs to be matched exactly * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The elements containing the binding. */ "function(binding, exactMatch, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n if (angular.getTestability) {\n return angular.getTestability(using).\n findBindings(using, binding, exactMatch);\n }\n\n var bindings = using.getElementsByClassName('ng-binding');\n var matches = [];\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if(dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (exactMatch) {\n var matcher = new RegExp('({|\\\\\\\\s|$|\\\\\\\\|)' + binding + '(}|\\\\\\\\s|^|\\\\\\\\|)');\n if (matcher.test(bindingName)) {\n matches.push(bindings[i]);\n }\n } else {\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n\n }\n }\n return matches; /* Return the whole array for webdriver.findElements. */\n};\n"- FN_findBindingsIds =
/**
* Find a list of element Ids in the page by their angular binding. * * @param {string} binding The binding, e.g. {{cat.name}}. * @param {boolean} exactMatch Whether the binding needs to be matched exactly * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The elements containing the binding. */ "function(binding, exactMatch, using, rootSelector) {\n var elements = findBindings(binding, exactMatch, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findRepeaterRows =
/**
* Find an array of elements matching a row within an ng-repeat. * Always returns an array of only one element for plain old ng-repeat. * Returns an array of all the elements in one segment for ng-repeat-start. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {number} index The row index. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The row of the repeater, or an array of elements * in the first row in the case of ng-repeat-start. */ "function(repeater, index, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n var rows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 ||\n elem.nodeValue.indexOf(repeater) == -1) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n return [rows[index]].concat(multiRows[index]);\n};\n"- FN_findRepeaterRowsIds =
/**
* Find an array of element ids matching a row within an ng-repeat. * Always returns an array of only one element for plain old ng-repeat. * Returns an array of all the elements in one segment for ng-repeat-start. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {number} index The row index. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The row of the repeater, or an array of elements * in the first row in the case of ng-repeat-start. */ "function(repeater, index, using, rootSelector) {\n var elements = findRepeaterRows(repeater, index, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findAllRepeaterRows =
/**
-
Find all rows of an ng-repeat.
*
-
@param string repeater The text of the repeater, e.g. ‘cat in cats’.
-
@param Element using The scope of the search.
-
@param string rootSelector The selector to use for the root app element.
*
-
@return Array.<Element> All rows of the repeater.
*/
-
"function(repeater, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n rows.push(repeatElems[i]);\n }\n }\n }\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n var elem = repeatElems[i];\n while (elem.nodeType != 8 ||\n elem.nodeValue.indexOf(repeater) == -1) {\n if (elem.nodeType == 1) {\n rows.push(elem);\n }\n elem = elem.nextSibling;\n }\n }\n }\n }\n return rows;\n};\n"- FN_findAllRepeaterRowsIds =
/**
-
Find all rows ids of an ng-repeat.
*
-
@param string repeater The text of the repeater, e.g. ‘cat in cats’.
-
@param Element using The scope of the search.
-
@param string rootSelector The selector to use for the root app element.
*
-
@return Array.<Element> All rows of the repeater.
*/
-
"function(repeater, using, rootSelector) {\n var elements = findAllRepeaterRows(repeater, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findRepeaterElement =
/**
* Find an element within an ng-repeat by its row and column. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {number} index The row index. * @param {string} binding The column binding, e.g. '{{cat.name}}'. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The element in an array. */ "function(repeater, index, binding, using, rootSelector) {\n var matches = [];\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 ||\n (elem.nodeValue && elem.nodeValue.indexOf(repeater) == -1)) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var row = rows[index];\n var multiRow = multiRows[index];\n var bindings = [];\n if (row) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(using).findBindings(row, binding));\n } else {\n if (row.className.indexOf('ng-binding') != -1) {\n bindings.push(row);\n }\n var childBindings = row.getElementsByClassName('ng-binding');\n for (var i = 0; i < childBindings.length; ++i) {\n bindings.push(childBindings[i]);\n }\n }\n }\n if (multiRow) {\n for (var i = 0; i < multiRow.length; ++i) {\n var rowElem = multiRow[i];\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(using).findBindings(rowElem, binding));\n } else {\n if (rowElem.className.indexOf('ng-binding') != -1) {\n bindings.push(rowElem);\n }\n var childBindings = rowElem.getElementsByClassName('ng-binding');\n for (var j = 0; j < childBindings.length; ++j) {\n bindings.push(childBindings[j]);\n }\n }\n }\n }\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if(dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n }\n return matches;\n};\n"- FN_findRepeaterElementIds =
/**
* Find an element ids within an ng-repeat by its row and column. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {number} index The row index. * @param {string} binding The column binding, e.g. '{{cat.name}}'. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The element in an array. */ "function(repeater, index, binding, using, rootSelector) {\n var elements = findRepeaterElement(repeater, index, binding, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findRepeaterColumn =
/**
* Find the elements in a column of an ng-repeat. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {string} binding The column binding, e.g. '{{cat.name}}'. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The elements in the column. */ "function(repeater, binding, using, rootSelector) {\n var matches = [];\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 ||\n (elem.nodeValue && elem.nodeValue.indexOf(repeater) == -1)) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var bindings = [];\n for (var i = 0; i < rows.length; ++i) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(using).findBindings(rows[i], binding));\n } else {\n if (rows[i].className.indexOf('ng-binding') != -1) {\n bindings.push(rows[i]);\n }\n var childBindings = rows[i].getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n for (var i = 0; i < multiRows.length; ++i) {\n for (var j = 0; j < multiRows[i].length; ++j) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(using).findBindings(multiRows[i][j], binding));\n } else {\n var elem = multiRows[i][j];\n if (elem.className.indexOf('ng-binding') != -1) {\n bindings.push(elem);\n }\n var childBindings = elem.getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n }\n for (var j = 0; j < bindings.length; ++j) {\n var dataBinding = angular.element(bindings[j]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[j]);\n }\n }\n }\n return matches;\n};\n"- FN_findRepeaterColumnIds =
/**
* Find the elements in a column of an ng-repeat. * * @param {string} repeater The text of the repeater, e.g. 'cat in cats'. * @param {string} binding The column binding, e.g. '{{cat.name}}'. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The elements in the column. */ "function(repeater, binding, using, rootSelector) {\n var elements = findRepeaterColumn(repeater, binding, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findByModel =
/**
* Find elements by model name. * * @param {string} model The model name. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(model, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n if (angular.getTestability) {\n return angular.getTestability(using).\n findModels(using, model, true);\n }\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'model=\"' + model + '\"]';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n};\n"- FN_findByModelIds =
/**
* Find element ids by model name. * * @param {string} model The model name. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(model, using, rootSelector) {\n var elements = findByModel(model, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findByOptions =
/**
* Find elements by . * * @param {string} The descriptor for the option * (i.e. fruit for fruit in fruits). * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(optionsDescriptor, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'options=\"' + optionsDescriptor + '\"] option';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n};\n"- FN_findByOptionsIds =
/**
* Find elements by . * * @param {string} The descriptor for the option * (i.e. fruit for fruit in fruits). * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(optionsDescriptor, using, rootSelector) {\n var elements = findByOptions(optionsDescriptor, using, rootSelector);\n return createCapybaraNgMatches(elements);\n};\n"- FN_findByButtonText =
/**
* Find by textual content. * * @param {string} searchText The exact text to match. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(searchText, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.innerText || element.textContent;\n } else {\n elementText = element.value;\n }\n if (elementText.trim() === searchText) {\n matches.push(element);\n }\n }\n\n return matches;\n};\n"- FN_findByPartialButtonText =
/**
* Find by textual content. * * @param {string} searchText The exact text to match. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} The matching elements. */ "function(searchText, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.innerText || element.textContent;\n } else {\n elementText = element.value;\n }\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n\n return matches;\n};\n"- FN_findByCssContainingText =
/**
* Find elements by css selector and textual content. * * @param {string} cssSelector The css selector to match. * @param {string} searchText The exact text to match. * @param {Element} using The scope of the search. * @param {string} rootSelector The selector to use for the root app element. * * @return {Array.<Element>} An array of matching elements. */ "function(cssSelector, searchText, using, rootSelector) {\n rootSelector = rootSelector || 'body';\n using = using || document.querySelector(rootSelector);\n\n var elements = using.querySelectorAll(cssSelector);\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText = element.innerText || element.textContent;\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n return matches;\n};\n"- FN_testForAngular =
/**
* Tests whether the angular global variable is present on a page. Retries * in case the page is just loading slowly. * * Asynchronous. * * @param {number} attempts Number of times to retry. * @param {function} asyncCallback callback */ "function(attempts, asyncCallback) {\n var callback = function(args) {\n setTimeout(function() {\n asyncCallback(args);\n }, 0);\n };\n var check = function(n) {\n try {\n if (window.angular && window.angular.resumeBootstrap) {\n callback([true, null]);\n } else if (n < 1) {\n if (window.angular) {\n callback([false, 'angular never provided resumeBootstrap']);\n } else {\n callback([false, 'retries looking for angular exceeded']);\n }\n } else {\n window.setTimeout(function() {check(n - 1);}, 1000);\n }\n } catch (e) {\n callback([false, e]);\n }\n };\n check(attempts);\n};\n"- FN_evaluate =
/**
* Evalute an Angular expression in the context of a given element. * * @param {Element} element The element in whose scope to evaluate. * @param {string} expression The expression to evaluate. * * @return {?Object} The result of the evaluation. */ "function(element, expression) {\n return angular.element(element).scope().$eval(expression);\n};\n"- FN_allowAnimations =
"function(element, value) {\n var ngElement = angular.element(element);\n if (ngElement.allowAnimations) {\n // AngularDart: $testability API.\n return ngElement.allowAnimations(value);\n } else {\n // AngularJS\n var enabledFn = ngElement.injector().get('$animate').enabled;\n return (value == null) ? enabledFn() : enabledFn(value);\n }\n};\n"- FN_getLocationAbsUrl =
/**
* Return the current url using $location.absUrl(). * * @param {string} selector The selector housing an ng-app */ "function(selector) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n getLocation();\n }\n return angular.element(el).injector().get('$location').absUrl();\n};\n"- FN_getLocation =
/**
* Get current location * * @param {string} selector The selector housing an ng-app * @param {string} url In page URL using the same syntax as $location.url(), * /path?search=a&b=c#hash */ "function(selector) {\n var el = document.querySelector(selector);\n var $injector = angular.element(el).injector();\n var $location = $injector.get('$location');\n return $location.url();\n};\n"- FN_setLocation =
/**
* Browse to another page using in-page . * * @param {string} selector The selector housing an ng-app * @param {string} url In page URL using the same syntax as $location.url(), * /path?search=a&b=c#hash */ "function(selector, url) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n setLocation(url);\n }\n var $injector = angular.element(el).injector();\n var $location = $injector.get('$location');\n var $rootScope = $injector.get('$rootScope');\n\n if (url !== $location.url()) {\n $location.url(url);\n $rootScope.$digest();\n }\n return $location.url();\n};\n"
Class Method Summary collapse
- .format_script(name, fn) ⇒ Object
- .format_scripts ⇒ Object
- .functions ⇒ Object
- .window_scripts ⇒ Object
Class Method Details
.format_script(name, fn) ⇒ Object
774 775 776 777 |
# File 'lib/angular/client_script.rb', line 774 def self.format_script(name, fn) "try { return (#{fn}).apply(this, arguments); }\n" + "catch(e) { throw (e instanceof Error) ? e : new Error(e); }" end |
.format_scripts ⇒ Object
779 780 781 782 783 784 785 |
# File 'lib/angular/client_script.rb', line 779 def self.format_scripts Hash[ functions.map do |name, fn| [name, format_script(name,fn)] end ] end |
.functions ⇒ Object
766 767 768 769 770 771 772 |
# File 'lib/angular/client_script.rb', line 766 def self.functions Hash[ self.constants.map do |cn| [cn[3, cn.size].to_sym, self.const_get(cn)] end ] end |
.window_scripts ⇒ Object
787 788 789 790 |
# File 'lib/angular/client_script.rb', line 787 def self.window_scripts functions .map { |name, fn| "window.#{name} = #{fn};" } end |