Index: chrome/common/extensions/docs/examples/apps/hello-php/popuplib.js |
=================================================================== |
--- chrome/common/extensions/docs/examples/apps/hello-php/popuplib.js (revision 0) |
+++ chrome/common/extensions/docs/examples/apps/hello-php/popuplib.js (revision 0) |
@@ -0,0 +1,279 @@ |
+// Copyright 2009 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. |
+ |
+ |
+// PopupManager is a library to facilitate integration with OpenID |
+// identity providers (OP)s that support a pop-up authentication interface. |
+// To create a popup window, you first construct a popupOpener customized |
+// for your site and a particular identity provider, E.g.: |
+// |
+// var googleOpener = popupManager.createOpener(openidParams); |
+// |
+// where 'openidParams' are customized for Google in this instance. |
+// (typically you just change the openidpoint, the version number |
+// (the openid.ns parameter) and the extensions based on what |
+// the OP supports. |
+// OpenID libraries can often discover these properties |
+// automatically from the location of an XRD document. |
+// |
+// Then, you can either directly call |
+// googleOpener.popup(width, height), where 'width' and 'height' are your choices |
+// for popup size, or you can display a button 'Sign in with Google' and set the |
+//..'onclick' handler of the button to googleOpener.popup() |
+ |
+var popupManager = {}; |
+ |
+// Library constants |
+ |
+popupManager.constants = { |
+ 'darkCover' : 'popupManager_darkCover_div', |
+ 'darkCoverStyle' : ['position:absolute;', |
+ 'top:0px;', |
+ 'left:0px;', |
+ 'padding-right:0px;', |
+ 'padding-bottom:0px;', |
+ 'background-color:#000000;', |
+ 'opacity:0.5;', //standard-compliant browsers |
+ '-moz-opacity:0.5;', // old Mozilla |
+ 'filter:alpha(opacity=0.5);', // IE |
+ 'z-index:10000;', |
+ 'width:100%;', |
+ 'height:100%;' |
+ ].join(''), |
+ 'openidSpec' : { |
+ 'identifier_select' : 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select', |
+ 'namespace2' : 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0' |
+ } }; |
+ |
+// Computes the size of the window contents. Returns a pair of |
+// coordinates [width, height] which can be [0, 0] if it was not possible |
+// to compute the values. |
+popupManager.getWindowInnerSize = function() { |
+ var width = 0; |
+ var height = 0; |
+ var elem = null; |
+ if ('innerWidth' in window) { |
+ // For non-IE |
+ width = window.innerWidth; |
+ height = window.innerHeight; |
+ } else { |
+ // For IE, |
+ if (('BackCompat' === window.document.compatMode) |
+ && ('body' in window.document)) { |
+ elem = window.document.body; |
+ } else if ('documentElement' in window.document) { |
+ elem = window.document.documentElement; |
+ } |
+ if (elem !== null) { |
+ width = elem.offsetWidth; |
+ height = elem.offsetHeight; |
+ } |
+ } |
+ return [width, height]; |
+}; |
+ |
+// Computes the coordinates of the parent window. |
+// Gets the coordinates of the parent frame |
+popupManager.getParentCoords = function() { |
+ var width = 0; |
+ var height = 0; |
+ if ('screenLeft' in window) { |
+ // IE-compatible variants |
+ width = window.screenLeft; |
+ height = window.screenTop; |
+ } else if ('screenX' in window) { |
+ // Firefox-compatible |
+ width = window.screenX; |
+ height = window.screenY; |
+ } |
+ return [width, height]; |
+}; |
+ |
+// Computes the coordinates of the new window, so as to center it |
+// over the parent frame |
+popupManager.getCenteredCoords = function(width, height) { |
+ var parentSize = this.getWindowInnerSize(); |
+ var parentPos = this.getParentCoords(); |
+ var xPos = parentPos[0] + |
+ Math.max(0, Math.floor((parentSize[0] - width) / 2)); |
+ var yPos = parentPos[1] + |
+ Math.max(0, Math.floor((parentSize[1] - height) / 2)); |
+ return [xPos, yPos]; |
+}; |
+ |
+// A utility class, implements an onOpenHandler that darkens the screen |
+// by overlaying it with a semi-transparent black layer. To use, ensure that |
+// no screen element has a z-index at or above 10000. |
+// This layer will be suppressed automatically after the screen closes. |
+// |
+// Note: If you want to perform other operations before opening the popup, but |
+// also would like the screen to darken, you can define a custom handler |
+// as such: |
+// var myOnOpenHandler = function(inputs) { |
+// .. do something |
+// popupManager.darkenScreen(); |
+// .. something else |
+// }; |
+// Then you pass myOnOpenHandler as input to the opener, as in: |
+// var openidParams = {}; |
+// openidParams.onOpenHandler = myOnOpenHandler; |
+// ... other customizations |
+// var myOpener = popupManager.createOpener(openidParams); |
+popupManager.darkenScreen = function() { |
+ var darkCover = window.document.getElementById(window.popupManager.constants['darkCover']); |
+ if (!darkCover) { |
+ darkCover = window.document.createElement('div'); |
+ darkCover['id'] = window.popupManager.constants['darkCover']; |
+ darkCover.setAttribute('style', window.popupManager.constants['darkCoverStyle']); |
+ window.document.body.appendChild(darkCover); |
+ } |
+ darkCover.style.visibility = 'visible'; |
+}; |
+ |
+// Returns a an object that can open a popup window customized for an OP & RP. |
+// to use you call var opener = popupManager.cretePopupOpener(openidParams); |
+// and then you can assign the 'onclick' handler of a button to |
+// opener.popup(width, height), where width and height are the values of the popup size; |
+// |
+// To use it, you would typically have code such as: |
+// var myLoginCheckFunction = ... some AJAXy call or page refresh operation |
+// that will cause the user to see the logged-in experience in the current page. |
+// var openidParams = { realm : 'openid.realm', returnToUrl : 'openid.return_to', |
+// opEndpoint : 'openid.op_endpoint', onCloseHandler : myLoginCheckFunction, |
+// shouldEncodeUrls : 'true' (default) or 'false', extensions : myOpenIDExtensions }; |
+// |
+// Here extensions include any OpenID extensions that you support. For instance, |
+// if you support Attribute Exchange v.1.0, you can say: |
+// (Example for attribute exchange request for email and name, |
+// assuming that shouldEncodeUrls = 'true':) |
+// var myOpenIDExtensions = { |
+// 'openid.ax.ns' : 'http://openid.net/srv/ax/1.0', |
+// 'openid.ax.type.email' : 'http://axschema.org/contact/email', |
+// 'openid.ax.type.name1' : 'http://axschema.org/namePerson/first', |
+// 'openid.ax.type.name2' : 'http://axschema.org/namePerson/last', |
+// 'openid.ax.required' : 'email,name1,name2' }; |
+// Note that the 'ui' namespace is reserved by this library for the OpenID |
+// UI extension, and that the mode 'popup' is automatically applied. |
+// If you wish to make use of the 'language' feature of the OpenID UI extension |
+// simply add the following entry (example assumes the language requested |
+// is Swiss French: |
+// var my OpenIDExtensions = { |
+// ... // other extension parameters |
+// 'openid.ui.language' : 'fr_CH', |
+// ... }; |
+popupManager.createPopupOpener = (function(openidParams) { |
+ var interval_ = null; |
+ var popupWindow_ = null; |
+ var that = this; |
+ var shouldEscape_ = ('shouldEncodeUrls' in openidParams) ? openidParams.shouldEncodeUrls : true; |
+ var encodeIfRequested_ = function(url) { |
+ return (shouldEscape_ ? encodeURIComponent(url) : url); |
+ }; |
+ var identifier_ = ('identifier' in openidParams) ? encodeIfRequested_(openidParams.identifier) : |
+ this.constants.openidSpec.identifier_select; |
+ var identity_ = ('identity' in openidParams) ? encodeIfRequested_(openidParams.identity) : |
+ this.constants.openidSpec.identifier_select; |
+ var openidNs_ = ('namespace' in openidParams) ? encodeIfRequested_(openidParams.namespace) : |
+ this.constants.openidSpec.namespace2; |
+ var onOpenHandler_ = (('onOpenHandler' in openidParams) && |
+ ('function' === typeof(openidParams.onOpenHandler))) ? |
+ openidParams.onOpenHandler : this.darkenScreen; |
+ var onCloseHandler_ = (('onCloseHandler' in openidParams) && |
+ ('function' === typeof(openidParams.onCloseHandler))) ? |
+ openidParams.onCloseHandler : null; |
+ var returnToUrl_ = ('returnToUrl' in openidParams) ? openidParams.returnToUrl : null; |
+ var realm_ = ('realm' in openidParams) ? openidParams.realm : null; |
+ var endpoint_ = ('opEndpoint' in openidParams) ? openidParams.opEndpoint : null; |
+ var extensions_ = ('extensions' in openidParams) ? openidParams.extensions : null; |
+ |
+ // processes key value pairs, escaping any input; |
+ var keyValueConcat_ = function(keyValuePairs) { |
+ var result = ""; |
+ for (key in keyValuePairs) { |
+ result += ['&', key, '=', encodeIfRequested_(keyValuePairs[key])].join(''); |
+ } |
+ return result; |
+ }; |
+ |
+ //Assembles the OpenID request from customizable parameters |
+ var buildUrlToOpen_ = function() { |
+ var connector = '&'; |
+ var encodedUrl = null; |
+ var urlToOpen = null; |
+ if ((null === endpoint_) || (null === returnToUrl_)) { |
+ return; |
+ } |
+ if (endpoint_.indexOf('?') === -1) { |
+ connector = '?'; |
+ } |
+ encodedUrl = encodeIfRequested_(returnToUrl_); |
+ urlToOpen = [ endpoint_, connector, |
+ 'openid.ns=', openidNs_, |
+ '&openid.mode=checkid_setup', |
+ '&openid.claimed_id=', identifier_, |
+ '&openid.identity=', identity_, |
+ '&openid.return_to=', encodedUrl ].join(''); |
+ if (realm_ !== null) { |
+ urlToOpen += "&openid.realm=" + encodeIfRequested_(realm_); |
+ } |
+ if (extensions_ !== null) { |
+ urlToOpen += keyValueConcat_(extensions_); |
+ } |
+ urlToOpen += '&openid.ns.ui=' + encodeURIComponent( |
+ 'http://specs.openid.net/extensions/ui/1.0'); |
+ urlToOpen += '&openid.ui.mode=popup'; |
+ return urlToOpen; |
+ }; |
+ |
+ // Tests that the popup window has closed |
+ var isPopupClosed_ = function() { |
+ return (!popupWindow_ || popupWindow_.closed); |
+ }; |
+ |
+ // Check to perform at each execution of the timed loop. It also triggers |
+ // the action that follows the closing of the popup |
+ var waitForPopupClose_ = function() { |
+ if (isPopupClosed_()) { |
+ popupWindow_ = null; |
+ var darkCover = window.document.getElementById(window.popupManager.constants['darkCover']); |
+ if (darkCover) { |
+ darkCover.style.visibility = 'hidden'; |
+ } |
+ if (onCloseHandler_ !== null) { |
+ onCloseHandler_(); |
+ } |
+ if ((null !== interval_)) { |
+ window.clearInterval(interval_); |
+ interval_ = null; |
+ } |
+ } |
+ }; |
+ |
+ return { |
+ // Function that opens the window. |
+ popup: function(width, height) { |
+ var urlToOpen = buildUrlToOpen_(); |
+ if (onOpenHandler_ !== null) { |
+ onOpenHandler_(); |
+ } |
+ var coordinates = that.getCenteredCoords(width, height); |
+ popupWindow_ = window.open(urlToOpen, "", |
+ "width=" + width + ",height=" + height + |
+ ",status=1,location=1,resizable=yes" + |
+ ",left=" + coordinates[0] +",top=" + coordinates[1]); |
+ interval_ = window.setInterval(waitForPopupClose_, 80); |
+ return true; |
+ } |
+ }; |
+}); |
Property changes on: chrome/common/extensions/docs/examples/apps/hello-php/popuplib.js |
___________________________________________________________________ |
Added: svn:executable |
+ * |
Added: svn:eol-style |
+ LF |