aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js436
1 files changed, 0 insertions, 436 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js b/contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js
deleted file mode 100644
index e374cbc..0000000
--- a/contexts/data/lib/closure-library/closure/goog/debug/devcss/devcss.js
+++ /dev/null
@@ -1,436 +0,0 @@
-// Copyright 2008 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-goog.provide('goog.debug.DevCss');
-goog.provide('goog.debug.DevCss.UserAgent');
-
-goog.require('goog.cssom');
-goog.require('goog.dom.classes');
-goog.require('goog.events');
-goog.require('goog.events.EventType');
-goog.require('goog.string');
-goog.require('goog.userAgent');
-
-
-
-/**
- * A class for solving development CSS issues/emulating the CSS Compiler.
- * @param {goog.debug.DevCss.UserAgent=} opt_userAgent The user agent, if not
- * passed in, will be determined using goog.userAgent.
- * @param {number|string=} opt_userAgentVersion The user agent's version.
- * If not passed in, will be determined using goog.userAgent.
- * @throws {Error} When userAgent detection fails.
- * @constructor
- */
-goog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) {
- if (!opt_userAgent) {
- // Walks through the known goog.userAgents.
- if (goog.userAgent.IE) {
- opt_userAgent = goog.debug.DevCss.UserAgent.IE;
- } else if (goog.userAgent.GECKO) {
- opt_userAgent = goog.debug.DevCss.UserAgent.GECKO;
- } else if (goog.userAgent.WEBKIT) {
- opt_userAgent = goog.debug.DevCss.UserAgent.WEBKIT;
- } else if (goog.userAgent.MOBILE) {
- opt_userAgent = goog.debug.DevCss.UserAgent.MOBILE;
- } else if (goog.userAgent.OPERA) {
- opt_userAgent = goog.debug.DevCss.UserAgent.OPERA;
- }
- }
- switch (opt_userAgent) {
- case goog.debug.DevCss.UserAgent.OPERA:
- case goog.debug.DevCss.UserAgent.IE:
- case goog.debug.DevCss.UserAgent.GECKO:
- case goog.debug.DevCss.UserAgent.FIREFOX:
- case goog.debug.DevCss.UserAgent.WEBKIT:
- case goog.debug.DevCss.UserAgent.SAFARI:
- case goog.debug.DevCss.UserAgent.MOBILE:
- break;
- default:
- throw Error('Could not determine the user agent from known UserAgents');
- }
-
- /**
- * One of goog.debug.DevCss.UserAgent.
- * @type {string}
- * @private
- */
- this.userAgent_ = opt_userAgent;
-
- /**
- * @type {number|string}
- * @private
- */
- this.userAgentVersion_ = opt_userAgentVersion || goog.userAgent.VERSION;
- this.generateUserAgentTokens_();
-
- /**
- * @type {boolean}
- * @private
- */
- this.isIe6OrLess_ = this.userAgent_ == goog.debug.DevCss.UserAgent.IE &&
- goog.string.compareVersions('7', this.userAgentVersion_) > 0;
-
- if (this.isIe6OrLess_) {
- /**
- * @type {Array.<{classNames,combinedClassName,els}>}
- * @private
- */
- this.ie6CombinedMatches_ = [];
- }
-};
-
-
-/**
- * Rewrites the CSSOM as needed to activate any useragent-specific selectors.
- * @param {boolean=} opt_enableIe6ReadyHandler If true(the default), and the
- * userAgent is ie6, we set a document "ready" event handler to walk the DOM
- * and make combined selector className changes. Having this parameter also
- * aids unit testing.
- */
-goog.debug.DevCss.prototype.activateBrowserSpecificCssRules = function(
- opt_enableIe6ReadyHandler) {
- var enableIe6EventHandler = goog.isDef(opt_enableIe6ReadyHandler) ?
- opt_enableIe6ReadyHandler : true;
- var cssRules = goog.cssom.getAllCssStyleRules();
-
- for (var i = 0, cssRule; cssRule = cssRules[i]; i++) {
- this.replaceBrowserSpecificClassNames_(cssRule);
- }
-
- // Since we may have manipulated the rules above, we'll have to do a
- // complete sweep again if we're in IE6. Luckily performance doesn't
- // matter for this tool.
- if (this.isIe6OrLess_) {
- cssRules = goog.cssom.getAllCssStyleRules();
- for (var i = 0, cssRule; cssRule = cssRules[i]; i++) {
- this.replaceIe6CombinedSelectors_(cssRule);
- }
- }
-
- // Add an event listener for document ready to rewrite any necessary
- // combined classnames in IE6.
- if (this.isIe6OrLess_ && enableIe6EventHandler) {
- goog.events.listen(document, goog.events.EventType.LOAD, goog.bind(
- this.addIe6CombinedClassNames_, this));
- }
-};
-
-
-/**
- * @type {Object}
- * @private
- */
-goog.debug.DevCss.prototype.userAgentTokens_ = {};
-
-
-/**
- * A list of possible user agent strings.
- * @enum {string}
- */
-goog.debug.DevCss.UserAgent = {
- OPERA: 'OPERA',
- IE: 'IE',
- GECKO: 'GECKO',
- FIREFOX: 'GECKO',
- WEBKIT: 'WEBKIT',
- SAFARI: 'WEBKIT',
- MOBILE: 'MOBILE'
-};
-
-
-/**
- * A list of strings that may be used for matching in CSS files/development.
- * @enum {string}
- * @private
- */
-goog.debug.DevCss.CssToken_ = {
- USERAGENT: 'USERAGENT',
- SEPARATOR: '-',
- LESS_THAN: 'LT',
- GREATER_THAN: 'GT',
- LESS_THAN_OR_EQUAL: 'LTE',
- GREATER_THAN_OR_EQUAL: 'GTE',
- IE6_SELECTOR_TEXT: 'goog-ie6-selector',
- IE6_COMBINED_GLUE: '_'
-};
-
-
-/**
- * Generates user agent token match strings with comparison and version bits.
- * For example:
- * userAgentTokens_.ANY will be like 'GECKO'
- * userAgentTokens_.LESS_THAN will be like 'GECKO-LT3' etc...
- * @private
- */
-goog.debug.DevCss.prototype.generateUserAgentTokens_ = function() {
- this.userAgentTokens_.ANY = goog.debug.DevCss.CssToken_.USERAGENT +
- goog.debug.DevCss.CssToken_.SEPARATOR + this.userAgent_;
- this.userAgentTokens_.EQUALS = this.userAgentTokens_.ANY +
- goog.debug.DevCss.CssToken_.SEPARATOR;
- this.userAgentTokens_.LESS_THAN = this.userAgentTokens_.ANY +
- goog.debug.DevCss.CssToken_.SEPARATOR +
- goog.debug.DevCss.CssToken_.LESS_THAN;
- this.userAgentTokens_.LESS_THAN_OR_EQUAL = this.userAgentTokens_.ANY +
- goog.debug.DevCss.CssToken_.SEPARATOR +
- goog.debug.DevCss.CssToken_.LESS_THAN_OR_EQUAL;
- this.userAgentTokens_.GREATER_THAN = this.userAgentTokens_.ANY +
- goog.debug.DevCss.CssToken_.SEPARATOR +
- goog.debug.DevCss.CssToken_.GREATER_THAN;
- this.userAgentTokens_.GREATER_THAN_OR_EQUAL = this.userAgentTokens_.ANY +
- goog.debug.DevCss.CssToken_.SEPARATOR +
- goog.debug.DevCss.CssToken_.GREATER_THAN_OR_EQUAL;
-};
-
-
-/**
- * Gets the version number bit from a selector matching userAgentToken.
- * @param {string} selectorText The selector text of a CSS rule.
- * @param {string} userAgentToken Includes the LTE/GTE bit to see if it matches.
- * @return {string|undefined} The version number.
- * @private
- */
-goog.debug.DevCss.prototype.getVersionNumberFromSelectorText_ = function(
- selectorText, userAgentToken) {
- var regex = new RegExp(userAgentToken + '([\\d\\.]+)');
- var matches = regex.exec(selectorText);
- if (matches && matches.length == 2) {
- return matches[1];
- }
-};
-
-
-/**
- * Extracts a rule version from the selector text, and if it finds one, calls
- * compareVersions against it and the passed in token string to provide the
- * value needed to determine if we have a match or not.
- * @param {CSSRule} cssRule The rule to test against.
- * @param {string} token The match token to test against the rule.
- * @return {Array|undefined} A tuple with the result of the compareVersions call
- * and the matched ruleVersion.
- * @private
- */
-goog.debug.DevCss.prototype.getRuleVersionAndCompare_ = function(cssRule,
- token) {
- if (!cssRule.selectorText.match(token)) {
- return;
- }
- var ruleVersion = this.getVersionNumberFromSelectorText_(
- cssRule.selectorText, token);
- if (!ruleVersion) {
- return;
- }
-
- var comparison = goog.string.compareVersions(this.userAgentVersion_,
- ruleVersion);
- return [comparison, ruleVersion];
-};
-
-
-/**
- * Replaces a CSS selector if we have matches based on our useragent/version.
- * Example: With a selector like ".USERAGENT-IE-LTE6 .class { prop: value }" if
- * we are running IE6 we'll end up with ".class { prop: value }", thereby
- * "activating" the selector.
- * @param {CSSRule} cssRule The cssRule to potentially replace.
- * @private
- */
-goog.debug.DevCss.prototype.replaceBrowserSpecificClassNames_ = function(
- cssRule) {
-
- // If we don't match the browser token, we can stop now.
- if (!cssRule.selectorText.match(this.userAgentTokens_.ANY)) {
- return;
- }
-
- // We know it will begin as a classname.
- var additionalRegexString;
-
- // Tests "Less than or equals".
- var compared = this.getRuleVersionAndCompare_(cssRule,
- this.userAgentTokens_.LESS_THAN_OR_EQUAL);
- if (compared && compared.length) {
- if (compared[0] > 0) {
- return;
- }
- additionalRegexString = this.userAgentTokens_.LESS_THAN_OR_EQUAL +
- compared[1];
- }
-
- // Tests "Less than".
- compared = this.getRuleVersionAndCompare_(cssRule,
- this.userAgentTokens_.LESS_THAN);
- if (compared && compared.length) {
- if (compared[0] > -1) {
- return;
- }
- additionalRegexString = this.userAgentTokens_.LESS_THAN + compared[1];
- }
-
- // Tests "Greater than or equals".
- compared = this.getRuleVersionAndCompare_(cssRule,
- this.userAgentTokens_.GREATER_THAN_OR_EQUAL);
- if (compared && compared.length) {
- if (compared[0] < 0) {
- return;
- }
- additionalRegexString = this.userAgentTokens_.GREATER_THAN_OR_EQUAL +
- compared[1];
- }
-
- // Tests "Greater than".
- compared = this.getRuleVersionAndCompare_(cssRule,
- this.userAgentTokens_.GREATER_THAN);
- if (compared && compared.length) {
- if (compared[0] < 1) {
- return;
- }
- additionalRegexString = this.userAgentTokens_.GREATER_THAN + compared[1];
- }
-
- // Tests "Equals".
- compared = this.getRuleVersionAndCompare_(cssRule,
- this.userAgentTokens_.EQUALS);
- if (compared && compared.length) {
- if (compared[0] != 0) {
- return;
- }
- additionalRegexString = this.userAgentTokens_.EQUALS + compared[1];
- }
-
- // If we got to here without generating the additionalRegexString, then
- // we did not match any of our comparison token strings, and we want a
- // general browser token replacement.
- if (!additionalRegexString) {
- additionalRegexString = this.userAgentTokens_.ANY;
- }
-
- // We need to match at least a single whitespace character to know that
- // we are matching the entire useragent string token.
- var regexString = '\\.' + additionalRegexString + '\\s+';
- var re = new RegExp(regexString, 'g');
-
- var currentCssText = goog.cssom.getCssTextFromCssRule(cssRule);
-
- // Replacing the token with '' activates the selector for this useragent.
- var newCssText = currentCssText.replace(re, '');
-
- if (newCssText != currentCssText) {
- goog.cssom.replaceCssRule(cssRule, newCssText);
- }
-};
-
-
-/**
- * Replaces IE6 combined selector rules with a workable development alternative.
- * IE6 actually parses .class1.class2 {} to simply .class2 {} which is nasty.
- * To fully support combined selectors in IE6 this function needs to be paired
- * with a call to replace the relevant DOM elements classNames as well.
- * @see {this.addIe6CombinedClassNames_}
- * @param {CSSRule} cssRule The rule to potentially fix.
- * @private
- */
-goog.debug.DevCss.prototype.replaceIe6CombinedSelectors_ = function(cssRule) {
- // This match only ever works in IE because other UA's won't have our
- // IE6_SELECTOR_TEXT in the cssText property.
- if (cssRule.style.cssText &&
- cssRule.style.cssText.match(
- goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT)) {
- var cssText = goog.cssom.getCssTextFromCssRule(cssRule);
- var combinedSelectorText = this.getIe6CombinedSelectorText_(cssText);
- if (combinedSelectorText) {
- var newCssText = combinedSelectorText + '{' + cssRule.style.cssText + '}';
- goog.cssom.replaceCssRule(cssRule, newCssText);
- }
- }
-};
-
-
-/**
- * Gets the appropriate new combined selector text for IE6.
- * Also adds an entry onto ie6CombinedMatches_ with relevant info for the
- * likely following call to walk the DOM and rewrite the class attribute.
- * Example: With a selector like
- * ".class2 { -goog-ie6-selector: .class1.class2; prop: value }".
- * this function will return:
- * ".class1_class2 { prop: value }".
- * @param {string} cssText The CSS selector text and css rule text combined.
- * @return {?string} The rewritten css rule text.
- * @private
- */
-goog.debug.DevCss.prototype.getIe6CombinedSelectorText_ = function(cssText) {
- var regex = new RegExp(goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT +
- '\\s*:\\s*\\"([^\\"]+)\\"', 'gi');
- var matches = regex.exec(cssText);
- if (matches) {
- var combinedSelectorText = matches[1];
- // To aid in later fixing the DOM, we need to split up the possible
- // selector groups by commas.
- var groupedSelectors = combinedSelectorText.split(/\s*\,\s*/);
- for (var i = 0, selector; selector = groupedSelectors[i]; i++) {
- // Strips off the leading ".".
- var combinedClassName = selector.substr(1);
- var classNames = combinedClassName.split(
- goog.debug.DevCss.CssToken_.IE6_COMBINED_GLUE);
- var entry = {
- classNames: classNames,
- combinedClassName: combinedClassName,
- els: []
- };
- this.ie6CombinedMatches_.push(entry);
- }
- return combinedSelectorText;
- }
- return null;
-};
-
-
-/**
- * Adds combined selectors with underscores to make them "work" in IE6.
- * @see {this.replaceIe6CombinedSelectors_}
- * @private
- */
-goog.debug.DevCss.prototype.addIe6CombinedClassNames_ = function() {
- if (!this.ie6CombinedMatches_.length) {
- return;
- }
- var allEls = document.getElementsByTagName('*');
- var matches = [];
- // Match nodes for all classNames.
- for (var i = 0, classNameEntry; classNameEntry =
- this.ie6CombinedMatches_[i]; i++) {
- for (var j = 0, el; el = allEls[j]; j++) {
- var classNamesLength = classNameEntry.classNames.length;
- for (var k = 0, className; className = classNameEntry.classNames[k];
- k++) {
- if (!goog.dom.classes.has(el, className)) {
- break;
- }
- if (k == classNamesLength - 1) {
- classNameEntry.els.push(el);
- }
- }
- }
- // Walks over our matching nodes and fixes them.
- if (classNameEntry.els.length) {
- for (var j = 0, el; el = classNameEntry.els[j]; j++) {
- if (!goog.dom.classes.has(el, classNameEntry.combinedClassName)) {
- goog.dom.classes.add(el, classNameEntry.combinedClassName);
- }
- }
- }
- }
-};
-