| /* |
| * Copyright 2012 Google Inc. |
| * |
| * 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. |
| */ |
| |
| /** |
| * @fileoverview Rewrites url domains on the client side. Clicks and enter key |
| * presses get intercepted. If the target url domain is a part of the mapped |
| * domains, the target url domain gets rewritten. |
| * |
| * @author rahulbansal@google.com (Rahul Bansal) |
| */ |
| |
| var ENTER_KEY_CODE = 13; |
| |
| // Exporting functions using quoted attributes to prevent Closure Compiler from |
| // renaming them. |
| // See http://code.google.com/closure/compiler/docs/api-tutorial3.html#dangers |
| window['pagespeed'] = window['pagespeed'] || {}; |
| var pagespeed = window['pagespeed']; |
| |
| /** |
| * @constructor |
| * @param {string} mappedDomainNames for which the url is to be rewritten. |
| */ |
| pagespeed.ClientDomainRewriter = function(mappedDomainNames) { |
| /** |
| * @private |
| */ |
| this.mappedDomainNames_ = mappedDomainNames; |
| }; |
| |
| /** |
| * Listener for events on anchor tags. Since we are listening at the body, |
| * checks if the event is for an anchor. Also checks that if a keypress |
| * resulted in this event, it should have been due to pressing enter. |
| * Processes the event only when these conditions are met. |
| * @param {Object} event which triggered this listener. |
| */ |
| pagespeed.ClientDomainRewriter.prototype.anchorListener = function(event) { |
| // We are interested only in ENTER on a LINK keypress events |
| // IE has window.event instead of event. |
| // TODO(rahulbansal): Fix the keyup, keydown handling. |
| event = event || window.event; |
| if (event.type == 'keypress' && event.keyCode != ENTER_KEY_CODE) { |
| return; |
| } |
| |
| for (var target = event.target; target != null; target = target.parentNode) { |
| if (target.tagName == 'A') { |
| this.processEvent(target.href, event); |
| return; |
| } |
| } |
| }; |
| |
| /** |
| * Adds anchor listeners to the body. |
| */ |
| pagespeed.ClientDomainRewriter.prototype.addEventListeners = function() { |
| var me = this; |
| // TODO(rahulbansal): This could potentially override existing event |
| // listeners. Fix that. |
| document.body.onclick = function(event) { me.anchorListener(event); }; |
| document.body.onkeypress = function(event) { me.anchorListener(event); }; |
| }; |
| |
| /** |
| * If url should be rewritten, sets window.location to the rewritten url and |
| * prevents default event propagation. |
| * @param {string} url for which the event is triggered. |
| * @param {Object} event to be processed. |
| */ |
| pagespeed.ClientDomainRewriter.prototype.processEvent = function(url, event) { |
| for (var i = 0; i < this.mappedDomainNames_.length; i++) { |
| if (url.indexOf(this.mappedDomainNames_[i]) == 0) { |
| window.location = window.location.protocol + '//' + |
| window.location.hostname + '/' + |
| url.substr(this.mappedDomainNames_[i].length); |
| event.preventDefault(); |
| return; |
| } |
| } |
| }; |
| |
| /** |
| * Initializes the client domain rewriter. |
| * @param {string} mappedDomainNames for which the url is to be rewritten. |
| */ |
| pagespeed.clientDomainRewriterInit = function(mappedDomainNames) { |
| var clientDomainRewriter = new pagespeed.ClientDomainRewriter( |
| mappedDomainNames); |
| pagespeed['clientDomainRewriter'] = clientDomainRewriter; |
| clientDomainRewriter.addEventListeners(); |
| }; |
| pagespeed['clientDomainRewriterInit'] = pagespeed.clientDomainRewriterInit; |