Core-Gadget - OAuth Popup

This is a DRAFT

    <section title="The OAuth Popup Feature (gadgets.oauth.Popup)" anchor="gadgets.oauth.Popup">

     <t>When a gadget attempts to access remote resources that are 
     protected using either the OAuth 1.0a or 2.0 protocol, the 
     container is required to first determine if the gadget has 
     received appropriate authorization in the form of an "Access Token".
     If a token is not available, the container must ask the gadget 
     to first acquire the appropriate authorization.</t>
     
     <t>With most scenarios, this is achieved by redirecting the user
     to the third party OAuth Authorization Service and asking them to 
     approve access. While gadget developers are responsible for determining 
     how such redirection occurs, they can use the OAuth Popup Feature to 
     simplify the process and to promote consistent, familiar behavior.</t>
     
     <t>The feature works by generating a hyperlink within the gadget's 
     user interface that, when clicked, opens a window that displays the
     third party OAuth Authoriation Service's interface. When opened, the
     gadget is notified via a callback function that the window is open. 
     The user will either approve or deny the request and then dismiss the 
     window, returning the user back to the gadget's user interface. The 
     gadget can either then automatically proceed with processing the 
     request or wait for the user to notify it when it continue.</t>
     
     <t>Use of the OAuth Popup Feature is enabled within a gadget by using
     feature="oauthpopup" in either a &lt;Require&gt; or &lt;Optional&gt;
     element with the &lt;ModulePrefs&gt;. Once enabled, the 
     <spanx style="verb">gadgets.oauth.Popup</spanx> object will become 
     available for use within the JavaScript of a gadget view.</t>
     
     <figure><preamble>The example below illustrates the basic operation of
     the OAuth Popup Feature:</preamble><artwork>
  &lt;Module>
    &lt;ModulePrefs>
      &lt;Require feature="oauthpopup" />
      &lt;OAuth>
        &lt;Service>...&lt;/Service>
      &lt;/OAuth>
    &lt;/ModulePrefs>
    &lt;Content type="html">&lt;![CDATA[
      &lt;div>
        &lt;a href="#" id="personalize">Personalize this gadget&lt;/a>
      &lt;/div>
  
      &lt;div>Please click
        &lt;a href="#" id="approvaldone">I've approved access&lt;/a>
        once you've approved access to your data.
      &lt;/div>
  
      &lt;script type="text/javascript">
        function $(x) {
          return document.getElementById(x);
        }
  
        function fetchData() {
          var url = "http://localhost:8080/social/rest/people/@me/@self";
          var params = {};
          params[gadgets.io.RequestParameters.CONTENT_TYPE] =
            gadgets.io.ContentType.TEXT;
          params[gadgets.io.RequestParameters.AUTHORIZATION] =
            gadgets.io.AuthorizationType.OAUTH;
          params[gadgets.io.RequestParameters.METHOD] =
            gadgets.io.MethodType.GET;
          params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] =
            "shindig";
  
          gadgets.io.makeRequest(url, function (response) {
            if (response.oauthApprovalUrl) {
              var onOpen = function() {};
              var onClose = function() {
                fetchData();
              };
              var popup = new gadgets.oauth.Popup(
                response.oauthApprovalUrl,
                null, onOpen, onClose);
              $('personalize').onclick = popup.createOpenerOnClick();
              $('approvaldone').onclick = popup.createApprovedOnClick();
            } else if (response.data) {
              ...
            } else {
              ...
            }
          }, params);
        }
  
        gadgets.util.registerOnLoadHandler(fetchData);
      &lt;/script>
    ]]&gt;&lt;/Content>
  &lt;/Module>
     </artwork></figure>

     <t>Once the <spanx style="verb">gadgets.oauth.Popup</spanx> object 
     is created, the calls to <spanx style="verb">popup.createOpenerOnClick</spanx>
     and <spanx style="verb">popup.createApprovedOnClick</spanx> generate the 
     appropriate hyperlink targets for acquiring and completing the authorization.</t>

     <section title="JavaScript API">
     
       <t>When the OAuth Popup Feature is enabled for a gadget, the 
       <spanx style="verb">gadgets.oauth.Popup</spanx> object becomes 
       available for use within the gadget's JavaScript code.</t>
     
       <section title="The gadgets.oauth.Popup Object" anchor="gadgets.oauth.Popup.ctor">
       
         <t>The <spanx style="verb">gadets.oauth.Popup</spanx> object 
         is used to manage a window that is displayed and used to acquire
         OAuth Authorization from a third party. Instances of the object
         are created using the JavaScript new keyword.</t>
         
         <figure><preamble>For instance:</preamble><artwork>
  var popup = new gadgets.oauth.Popup(
    destination, 
    windowOptions, 
    openCallback, 
    closeCallback);
         </artwork></figure>
       
         <t>The constructor accepts the following input parameters:
          <texttable align="left">
          <ttcol>Name</ttcol>
          <ttcol>Type</ttcol>
          <ttcol>Description</ttcol>
          <c>destination</c>
          <c>String</c>
          <c>Target URL to display when the window opens.</c>
          <c>windowOptions</c>
          <c>String</c>
          <c>Options for window.open, used to specify look and feel of the
          window.</c>
          <c>openCallback</c>
          <c>Function</c>
          <c>Function to call when the window is opened.</c>
          <c>closeCallback</c>
          <c>Function</c>
          <c>Function to call when the window is closed.</c>
          </texttable>
         </t>
       
         <t>The <spanx style="verb">gadgets.oauth.Popup</spanx>
         object exposes two methods: <spanx style="verb">createOpenerOnClick</spanx>
         and createApprovedOnClick.</t>
         
         <section title="gadgets.oauth.Popup.createOpenerOnClick" anchor="gadgets.oauth.Popup.createOpenerOnClick">      
           <t>Generates a function that is intended to be assigned to either
           a hyperlink (e.g. the onclick event of the HTML anchor tag) or
           similar mechanism (e.g. an HTML button) that when invoked, will 
           display the OAuth Authorization window. The method accepts no 
           input parameters and returns a JavaScript Function object.</t>
           
           <figure><artwork>
  &lt;Function&gt; createOpenerOnClick()
           </artwork></figure>
         </section>
         
         <section title="gadgets.oauth.Popup.createApprovedOnClick" anchor="gadgets.oauth.Popup.createApprovedOnClick">
         
           <t>Generates a function that is intended to be assigned to either
           a hyperlink (e.g. the onclick event of the HTML anchor tag) or
           similar mechanism (e.g. an HTML button) that when invoked, will 
           notify the container that OAuth authorization is complete.</t>
           
           <t>Typically, when the OAuth Popup window closes, the container 
           will be able to automatically detect that authorization is complete
           and it will attempt to continue with the original request that 
           triggered the authorization step in the first place. However, some
           containers are unable to detect when the Popup is closed. For those
           cases, the <spanx style="verb">createdApprovedOnClick</spanx> method
           provides a alternative. In most typical scenarios, however, the 
           "Approved" function returned by this method will never be invoked.</t>
           
           <t>The method accepts no input parameters and returns a JavaScript
           Function object.</t>
        
           <figure><artwork>
  &lt;Function&gt; createApprovedOnClick()
           </artwork></figure>
         </section>
       </section> 
     </section>    
   </section>