Core-Gadget - Document Structure

This is a DRAFT rewrite of the basic document structure for gadgets... it is ONLY A DRAFT

     <section title="Document Structure">
 
      <section title="The &lt;Module&gt; Element"
      <t>The root of the Gadget Specification Document is the &lt;Module&gt;
      element. It's children MUST consist of no more than one &lt;ModulePrefs&gt;
      element, no more than one &lt;UserPref&gt; element, and one or more 
      &lt;Content&gt; elements.</t>
 
      <figure><artwork>
 Module = element Module {
   attribute specificationVersion { text },
   undefinedAttribute*,
   ModulePrefs?,
   UserPref*,
   Content+,
   extensionElement*
 }
      </artwork></figure>
 
      <t>The "specificationVersion" attribute identifies the version of the 
      OpenSocial specification the container MUST use to process and render
      the Gadget Specification. The value is a string conforming to the 
      version identifier described in <xref target="Versioning"/>. If absense,
      the default value is "1.0".</t>
 
      <t>Text nodes included as children of the &lt;Module&gt; element 
      SHOULD be ignored.</t>
 
    </section>
 
      <section title="The &lt;ModulePrefs&gt; Element">
 
        <t>The &lt;ModulePrefs&gt; element serves as a container for all
        metadata, features and processing rules dealing with the gadget.
        The children of the element consist of a variety of optional 
        attributes and elements.</t>
 
        <figure><artwork>
  ModulePrefs = element ModulePrefs {
    attribute title { text }?,
    attribute title_url { IRI }?,
    attribute description { text }?,
    attribute author { text }?,
    attribute author_email { text }?,
    attribute screenshot { IRI }?,
    attribute thumbnail { IRI }?,
    attribute height { text }?,
    attribute width { text }?,
    attribute doctype { "quirksmode" | text },
    undefinedAttribute*,
    (Require* 
     & Optional*
     & Preload*
     & Icon* 
     & Locale*
     & Link*
     & OAuth? 
     & OAuth2?,
     extensionElement*)
  }
        </artwork></figure>
 
        <t>The &lt;ModulePrefs&gt; element MAY contain zero or more &lt;Require&gt;,
        &lt;Optional&gt;, &lt;Preload&gt;, &lt;Icon&gt;, &lt;Locale&gt; and 
        &lt;Link&gt; elements and MAY contain no more than one each of the 
        &lt;OAuth&gt; and &lt;OAuth2&gt; elements.</t>
 
        <t>The "title" attribute specifies the gadget's title. If provided,
        A container SHOULD use this value in any situation where a title bar or 
        other identifying name for the gadget is required.</t>
 
        <t>If provided, containers SHOULD use the value of the "title_url" 
        attribute to provide a link target whenever the value of the "title"
        attribute is displayed.</t>
 
        <t>The "description" attribute provides an optional description of
        the gagdget. If provided, Container's SHOULD use this value to provide 
        a description of the gadget wherever appropriate.</t>
 
        <t>The "author" attribute optionally provides the name of the 
        author of the gadget. If provided, Container's SHOULD use this 
        value wherever appropriate.</t>
 
        <t>The "author_email" attribute optionally provides the an email
        address to serve as a point of contact for the author of the gadget. 
        Containers MAY display this value wherever appropriate.</t>
 
        <t>The "screenshot" attribute provides an optional IRI of a visual representation
        of the gadget, for instance, a screenshot. The referenced resource MUST 
        be an image on a publicly-accessible web site that is not blocked by 
        robots.txt. PNG is the preferred format, though GIF and JPG are also 
        acceptable. Gadget screenshots should be 280 pixels wide. The height of 
        the screenshot should be the "natural" height of the gadget when it is
        in use. Containers SHOULD display this image on wherever appropriate to 
        provide a preview of the gadget to Users.</t>
 
       <t>The "thumbnail" attribute provides an optional IRI of a gadget thumbnail. 
       The referenced resource MUST be an image on a publicly-accessible web site 
       that is not blocked by robots.txt. PNG is the preferred format, though GIF 
       and JPG are also acceptable. Gadget thumbnails SHOULD be 120x60 pixels and
       SHOULD be smaller than images referenced using the "screenshot" attribute
       but larger than any images linked to using
       <xref target="Icons">/ModulePrefs/Link/@rel="icon"</xref>elements.</t>
 
       <t>The optional "height" and "width" attributes respectively define, in pixes,
       the preferred default display height and width of the gadget. Container's
       SHOULD use this value to set the appropriate display dimensions for the 
       gadget.</t>
 
       <t>The optional "doctype" attribute is a string that identifies the 
       preferred rendering model for the gadget. When set to "quirksmode", 
       the gadget SHOULD be rendered using the so-called "browser quirks mode".
       Additional values can be used to support other rendering modes but 
       only "quirksmode" is defined by this specification.</t>
 
      </section>
 
      <section title="The &lt;Require&gt; and &lt;Optional&gt; Elements">
 
        <t>The &lt;Require&gt; and &lt;Optional&gt; elements share a 
        common structure and are each used to declare OpenSocial features
        that are either required or optional for the gadget to operate.
        Element element consists of a feature identifier, a version, a 
        list of specific gadget views the feature dependency applies to, 
        and zero or more &lt;Param&gt; elements that provide specific 
        feature-dependent detail.</t>
 
        <figure><artwork>
 
    dependency = 
    attribute feature { text },
    attribute version { text },
    attribute views { text },
    undefinedAttribute*,
    Param*,
    extensionElement,
 
  Optional = element Optional { dependency }
  Require = element Require { dependency }
 
  Param = element Param {
    attribute name { text },
    undefinedAttribute*,
    text
  }
 
        </artwork></figure>
 
        <t>Features are collections of processing instructions and JavaScript
        Library APIs that provide specific functionality to a gadget. A 
        feature might also place various constraints and rules on the container
        and gadget when in use. Containers MUST honor the constraints and rules
        of any feature it claims to support.</t>
 
        <t>The "feature" attribute on the &lt;Optiona&gt; and &lt;Require&gt;
        elements specifies the unique identifier of a feature.</t>
 
        <t>The "version" attribute specifies the specific version of the identified
        feature, using the syntax described in <xref target="Versioning"/>.</t>
 
        <t>The "views" attribute specifies a comma separated list of views 
        for which the feature is optional or required. Containers SHOULD only
        load features when an appropriate view is being rendered.</t>
 
        <t>For every feature identified using a &lt;Require&gt; element, 
        the container MUST provide an implementation that matches the 
        version specified by the "version" attribute. The container 
        MUST display an error if it is incapable of providing an appropriate
        implementation for a required feature.</t>
 
        <t>For every feature identified using a &lt;Optional&gt; element,
        the container MAY provide an implementation of the feature. If an
        implementation is provided, it MUST match the version specified by
        the "version" attribute.</t>
 
        <t>Containers MUST NOT substitute versions of features that do not 
        match that which is requested by the gadget.</t>
 
        <t>Containers SHOULD support as many versions of a feature as is 
        practical to facilitate backwards compatibility with existing gadgets.</t>
 
        <t>Containers MAY refuse to support features or specific versions of features
       that are known or assumed to be incompatible with the specification version
       required by the Gadget, or that are known to be incompatible with other
       Features or versions of Features required by the Gadget. For example, a
       Container MAY not support the combination of @specificationVersion="1.0"
       and &lt;Require feature="opensocial" version="2.0"&gt;, or the combination
       of &lt;Require feature="opensocial" version="1.0"&gt; and
       &lt;Require feature="opensocial-data" version="1.1"&gt;. In cases where such
       combinations are requested, the Features are said to be conflicting.
       Conflicting Features SHOULD be treated by Containers as if they were
       unsupported. Containers SHOULD provide an error message describing conflicts
       to Developers when a conflict is detected.  If one or more of the conflicting
       Features is specified as Optional by a Gadget, and the set of Required
       features and specification version do not conflict, Containers SHOULD attempt
       to render the Gadget by removing the conflicting optional Features, returning
       false from
       <xref target="gadgets.util.hasFeature">gadgets.util.hasFeature</xref>
       for the features that have been removed.  Containers SHOULD include the
       largest set of Optional Features that does not produce conflicts.</t>
       <t>It is possible for there to be feature version conflicts when two valid
       feature dependencies exist for the same feature.  This situation can occur
       when the same feature is declared at a global scope (no @views specified)
       and at a view scope (@views specified) but with differing @version values.
       For example, if we are rendering a Gadget's "default" view and with
       &lt;Require feature="myfeature" version="1"&gt; and
       &lt;Require feature="myfeature" version="2" views="default"&gt; declared.
       In such cases, Containers SHOULD use the Feature version from the Feature
       declaration that explicitly matches the current View (See
       /ModulePrefs/Required/@views and /ModulePrefs/Optional/@views) over other
       Feature declarations. Developers can easily correct this conflict by always
       using the @views attribute for Features in Gadgets that use mixed Feature
       versions. <xref target="Issue-1133">Discussion</xref></t>
 
       <section title="The &lt;Param&gt; Element">
 
         <t>The &lt;Param&gt; element provides configuration details for a 
         feature dependency. When specified, these values will be made available
         by the container to the gadget developer using the <spanx style="verb">gadgets.util.getFeatureParameters</spanx>
         API, with the value of the "name" attribute serving as the parameter
         key and the text value of the element serving as the parameter value.</t>
 
         <t>When a feature dependency for a specific view has been defined, 
         the container SHOULD make only the parameters from the view-specific 
         dependency available to the gadget using the getFeatureParameters
         API.</t>
 
       </section>
 
      </section>
 
      <section title="The &lt;Preload&gt; Element">
 
        <t>The &lt;Preload&gt; element is used to identify resources that
        a container SHOULD load automatically when the gadget is processed
        and rendered.</t>
 
        <figure><artwork>
  Preload = element Preload {
    SignedFetch,
    attribute href { IRI },
    attribute views { text }?
  }
        </artwork></figure>
 
        <t>The processing semantics of the &lt;Preload&gt; are generally 
        identical to those of those defined for the <spanx style="verb">gadgets.io.makeRequest</spanx>
        API.</t>
 
        <t>The "href" attribute specifies the IRI of the resource to fetch. The 
        value of this attribute matches the "url" parameter of the 
        <spanx style="verb">gadgets.io.makeRequest</spanx> API.</t>
 
        <t>&lt;Preload&gt; elements MAY use the Signed Fetch mechanism defined
        by <xref target="SignedFetch"/> and MAY contain the same optional 
        attributes used to configure &lt;Content&gt; elements for signed 
        fetch as described in <xref target="signed-fetch"/>.</t>
 
        <t>The "views" attribute provides a comma-separated list of views 
        for which this &lt;Preload&gt; element applies. Containers SHOULD NOT
        preload resources that are not specified for the view being rendered.
        If no "views" attribute is specified, then the content SHOULD be 
        preloaded for all views.</t>
 
        <t>When processing the &lt;Preload&gt; element, the container 
        MUST sends an HTTP request to the IRI specified by the href 
        attribute. The results of that request MUST be converted into a 
        temporary object that is stored and accessed at runtime via 
        the <spanx style="verb">gadgets.io.makeRequest</spanx> API. The 
        container MUST NOT return a preloaded resource in response to 
        a call to <spanx style="verb">gadgets.io.makeRequest</spanx> unless:
        <list style="symbols">
          <t>The "url" parameter of the makeRequest call matches the 
          value of the &lt;Preload&gt; element's href attribute,</t>
          <t>The &lt;Preload&gt; element's authz attribute value matches
          one of the acceptable authorization types,</t>
          <t>The "sign_owner" parameter of the makeRequest call matches the
          value of the &lt;Preload&gt; element's sign_owner attribute,</t>
          <t>The "sign_viewer" parameter of the makeRequest call matches the
          value of the &lt;Preload&gt; element's sign_viewer attribute, and</t>
          <t>The views attribute on the &lt;Preload&gt; element is either 
          unspecified or contains the name of the current view.</t>
        </list>
        </t>
 
      </section>
 
      <section title="The &lt;Icon&gt; Element (deprecated)">
 
        <t>The &lt;Link&gt; Element is a currently deprecated mechanism
        that was used in previous versions of this specification for 
        to provide an image to serve as an icon for the gadget. The
        definition of the &lt;Link&gt; element is included here 
        for backwards compatibility purposes only and will be 
        permanently removed from future versions of this specification.</t>
 
        <figure><artwork>
  Icon = element Icon {
    attribute mode { "base64" }?,
    attribute type { mimeType }?,
    text
  }
        </artwork></figure>
 
        <t>Historically, &lt;Icon&gt; element was used in one of two ways:
        (1) to provide a link via a URL to the image resource or (2) to 
        directly embed the image into the gadget specification using a 
        Base64-encoding of the binary data. The "mode" attribute is used 
        to identify which method is being used. When specified, the value
        of "mode" MUST be "base64", in which case the text content of the 
        &lt;Icon&gt; element MUST be processed as Base64-encoded binary
        data. If the "mode" attribute is omitted, the text content of the
        element MUST be processed as a URL referencing an image document.
        The "type" attribute is used to specified the MIME media type of 
        the image resource in either case.</t>
 
        <figure><preamble>For example, to reference an icon by URL, it would be:</preamble>
        <artwork><![CDATA[
  <Icon type="image/png">http://www.example.org/images/icon.png</Icon>
        ]]></artwork></figure>
 
        <figure><preamble>To embed the icon directly, it would be:</preamble>
        <artwork><![CDATA[
  <Icon mode="base64" type="image/png>{base64 data}</Icon>
        ]]></artwork></figure>
 
        <t>Use of the &lt;Icon&gt; element has been deprecated in the current 
        version of this specification. Gadget developers SHOULD use the 
        &lt;Link&gt; element with a "rel" attribute value equal to "icon" 
        in place of the &lt;Icon&gt; element:</t>
 
        <figure><artwork><![CDATA[
  <Link href="http://www.example.org/images/icon.png" rel="icon" />
        ]]></artwork></figure>
 
      </section>
 
      <section title="The &lt;Link&gt; Element">
 
        <t>The &lt;Link&gt; element is used to associate a variety of additional
        resources with the gadget specification. At a minimum, the element MUST
        contain the "rel" and "href" attributes.</t>
 
        <figure><artwork>
  Link = element Link {
    attribute rel { text },
    attribute href { IRI },
    attribute method { "GET" | "POST" }?,
    undefinedAttribute*,
    text
  }
        </artwork></figure>
 
        <t>The "href" attribute specifies the IRI of the resource being linked
        to the gadget specification. The value MUST be usable for dereferencing
        and therefore MUST be mapped to a URL following the rules specified 
        in [TODO: RFC 3987].</t>
 
        <t>The specific relationship between the gadget specification and the 
        referenced resource is specified by the value of the "rel" attribute.
        The value of the rel attribute can be any string value. This specification
        defines a number of rel attribute values that are significant. 
        Implementations MUST NOT use any rel attribute value prefixed with 
        the characters "opensocial", "gadgets", or "events" that are not 
        defined by this specification.</t>
 
        <t>The optional "match" attribute can be used with certain links to 
        specify the HTTP method that is to be used when dereferencing the 
        Link href. The "match" attribute is primarily used when working with
        <xref target="gadget-lifecycle-events">Gadget Lifecycle Events</xref>.</t>
 
        <t>The "rel" attribute values currently defined by this specification
        are:</t>
 
        <texttable>
          <ttcol align="left" width="15%">"rel"</ttcol>
          <ttcol align="left">Description</ttcol>
 
          <c><spanx style="verb">icon</spanx></c>
          <c>Used to link an image resource to the gadget specification that 
          serves as a representative icon for the gadget.</c>
 
          <c><spanx style="verb">event</spanx></c>
          <c>Used to associate a remote endpoint to which 
          <xref target="gadget-lifecycle-events">Gadget Lifecycle Events</xref> 
          are to be delivered.</c>
 
          <c><spanx style="verb">event.addapp</spanx></c>
          <c>Used to associate a remote endpoint to which 
          <xref target="gadget-lifecycle-events">Gadget Lifecycle Events</xref> 
          matching the "event.addapp" event are to be delivered.</c>
 
          <c><spanx style="verb">event.removeapp</spanx></c>
          <c>Used to associate a remote endpoint to which 
          <xref target="gadget-lifecycle-events">Gadget Lifecycle Events</xref> 
          matching the "event.removeapp" event are to be delivered.</c>
 
          <c><spanx style="verb">event.app</spanx></c>
          <c>Used to associate a remote endpoint to which 
          <xref target="gadget-lifecycle-events">Gadget Lifecycle Events</xref> 
          matching the "event.app" event are are to be delivered.</c>
 
        </texttable>
      </section>
 
      <section title="The &lt;Locale&gt; Element">
 
        <t>The &lt;Locale&gt; element is used to provide localization 
        information for a gadget. Containers are required to honor 
        localization rules as specified in <xref target="Localization">
        Localization</xref>. Each Locale tag represents localization
        information for a single locale.</t>
 
        <figure><artwork>
  Msg = element msg {
    attribute name { text },
    undefinedAttribute*,
    text
  }
 
  Locale = element Locale {
    attribute lang { "all" | text }?,
    attribute country { "all" | text }?,
    attribute messages { IRI }?,
    attribute language_direction { "rtl" | "ltr" }?,
    attribute views { text },
    undefinedAttribute*,
    Msg*
  }
        </artwork></figure>
 
        <t>The "lang" attribute specifies the language for the locale specified
        as an ISO-639-1 Language Code, or the special value "all", which 
        containers MUST interpret as applying to all languages unless a more 
        specific match is found. If the lang attribute is not specified, the
        default is considered to be "all".</t>
 
        <t>The "country" attribute specifies the country code for the locale
        specified as an ISO-3166-1 Country code, or the special value "all", 
        which containers MUST interpret as applying to all countries unless 
        a more specific match is found. If the country attribute is not specified,
        the default is considered to be "all".</t>
 
        <t>The optional "language_direction" attribute is used to specify
        the default text rendering direction for the gadget. Valid values 
        are "ltr", to indicate "Left-to-Right" ordering, or "rtl" to indicate
        "Right-to-Left" ordering. Directional rendering of text is discussed
        in detail in <xref target="Localization"/>.</t>
 
        <t>The optional "views" attribute specifies a comma-separated list
        of gadget views for which the Locale information applies. Containers 
        SHOULD only use the information provided by the containing &lt;Locale&gt;
        element when an appropriate view is being rendered.</t>
 
        <t>The optional "messages" attribute specifies the IRI of an XML 
        document conforming to the <xref target="message-bundle-document">
        Message Bundle Document</xref> format. The IRI specified MUST be 
        suitable for dereferencing. The container processing the gadget 
        specification MUST fetch the referenced resource and treat all 
        child elements of the root XML element in the document as though
        they are child nodes of the containing &lt;Locale&gt; element.</t>
 
        <t>The &lt;Locale&gt; element MAY contain zero or more &lt;msg&gt;
        elements, each of which provide a singular localized value. The 
        key used to identify the value is specified using the "name" attribute.
        The text content of the &lt;msg&gt; element provides the localized
        value.</t>
 
        <figure><preamble>An example &lt;Locale&gt; that uses a referenced
        Message Bundle Document:</preamble><artwork><![CDATA[
  <Locale language="en" country="US"
    messages="http://example.org/i18n/en/messages.xml" />
        ]]></artwork></figure>
 
        <figure><preamble>An example &lt;Locale&gt; that uses contained
        &lt;msg&gt; elements:</preamble><artwork><![CDATA[
  <Locale language="en" country="US">
    <msg name="foo">This is the American English Version</msg>
    <msg name="bar">Hello From My Gadget</msg>
  </Locale>
        ]]></artwork></figure>
 
      </section>
 
      <section title="The &lt;OAuth&gt; Element">
 
        <t>The &lt;OAuth&gt; element supplies the container with OAuth 1.0
        specific configuration details for the gadget. For details see
        <xref target="OAuth"/>.</t>
 
        <figure><artwork>        
  OAuth = element OAuth {
    undefinedAttribute*,
    Service*,
    extensionElement*
  }
        </artwork></figure>
 
        <t>The &lt;OAuth&gt; element contains zero or more &lt;Service&gt;
        elements, each of which detail a specific OAuth 1.0 service associated
        with the gadget.</t>
 
        <figure><artwork>        
  Service = element Service {
    attribute name { text }?,
    undefinedAttribute*,
    element Request { OAuthResourceType }?,
    element Access { OAuthResourceType }?,
    element Authorization {
      attribute url { IRI },
      undefinedAttribute*,
      extensionElement*
    }?
  }
 
  OAuthResourceType = {
    attribute url { IRI },
    attribute method { "GET" | "POST" }?,
    attribute param_location { 
      "auth-header" | "uri-query" | "post-body" }?,
    extensionElement*
  }
        </artwork></figure>
 
        <t>The optional "name" attribute on the &lt;Service&gt; element specifies 
        a name used to reference the service at runtime. If unspecified, the 
        value is assumed to be an empty string. Gadget developers specify which
        OAuth Service they wish to use by passing the service name as a parameter
        to the <spanx style="verb">gadgets.io.makeRequest</spanx> API.</t>
 
        <t>The child elements of the &lt;Service&gt; element consist of the 
        &lt;Request&gt;, &lt;Access&gt; and &lt;Authorization&gt; elements,
        each of which are optional but MUST NOT appear more than once within
        a single &lt;Service&gt; element.</t>
 
        <t>The &lt;Request&gt; element identifies the endpoint for acquiring
        OAuth request tokens. The "url" attribute specifies the IRI of the 
        endpoint. This IRI MUST be suitable for dereferencing. The "method"
        attribute specifies the HTTP verb to use when sending the request, 
        valid values are either "GET" or "POST". If not specified, the value
        is assumed to be "POST". The "param_location" attributes specifies
        how OAuth parameters are to be passed in the request. Valid options 
        are either "uri-query", "auth-header", and "post-body", corresponding
        to the options described in <xref target="OAuth-Core">Section 5.2 
        of the OAuth specification</xref>. If not specified, the value is 
        assumed to be "auth-header".</t>
 
        <t>The &lt;Access&gt; element identifies the endpoint for acquiring
        OAuth access tokens. The &lt;Access&gt; element shares the same 
        attribute definitions as the &lt;Request&gt; element.</t>
 
        <t>The &lt;Authorization&gt; element is used to acquire authorization.
        The "url" attribute specifies the IRI of the endpoint. This IRI MUST
        be suitable for dereferencing. For details, refer to 
        <xref target="OAuth-Core">Section 6.2 of the OAuth specification.</xref></t>
 
      </section>
 
 
      <section title="The &lt;OAuth2&gt; Element">
 
        <t>The &lt;OAuth2&gt; element supplies the container with OAuth 2.0
        specific configuration details for the gadget. For details see
        <xref target="OAuth"/>.</t>
 
        <figure><artwork>        
  OAuth2 = element OAuth2 {
    undefinedAttribute*,
    Service*,
    extensionElement*
  }
        </artwork></figure>
 
        <t>The &lt;OAuth2&gt; element contains zero or more &lt;Service&gt;
        elements, each of which detail a specific OAuth 2.0 service associated
        with the gadget.</t>
 
        <figure><artwork>        
  Service = element Service {
    attribute name { text }?,
    attribute scope { text }?,
    undefinedAttribute*,
    element Authorization {
      attribute url { IRI },
      attribute method { "GET" | "POST" }?,
      undefinedAttribute*,
      extensionElement* 
    }?,
    element Token {
      attribute url {IRI},
      undefinedAttribute*
    }?
  }
        </artwork></figure>
 
        <t>The optional "name" attribute on the &lt;Service&gt; element specifies 
        a name used to reference the service at runtime. If unspecified, the 
        value is assumed to be an empty string. Gadget developers specify which
        OAuth Service they wish to use by passing the service name as a parameter
        to the <spanx style="verb">gadgets.io.makeRequest</spanx> API.</t>
 
        <t>OAuth2 Service elements MAY also specify an optional "scope" attribute
        providing the scope used by default in all requests. Access Token Scope
        is defined in Section 3.3 of the <xref target="OAuth2-Core">OAuth 2.0
        specification.</xref></t>
 
        <t>The child elements of the &lt;Service&gt; element consist of the 
        &lt;Authorization&gt;, &lt;Token&gt; elements,
        each of which are optional but MUST NOT appear more than once within
        a single &lt;Service&gt; element.</t>
 
        <t>The &lt;Authorization&gt; element identifies the endpoint for acquiring
        OAuth authorization tokens. The "url" attribute specifies the IRI of the 
        endpoint. This IRI MUST be suitable for dereferencing. The "method"
        attribute specifies the HTTP verb to use when sending the request, 
        valid values are either "GET" or "POST". If not specified, the value
        is assumed to be "GET".</t>
 
        <t>The &lt;Token&gt; element is used to acquire OAuth 2.0 access tokens.
        The "url" attribute specifies the IRI of the endpoint. This IRI MUST
        be suitable for dereferencing. For details, refer to 
        <xref target="OAuth2-Core">Section 3.2 of the OAuth 2.0 specification.</xref></t>
 
      </section>
 
      <section title="The &lt;UserPref&gt; Element">
 
        <t>The &lt;UserPref&gt; element is used within a gadget specification
        to define a "user preference" for use within instances of the gadget. 
        Each instance of the &lt;UserPref&gt; element defines exactly one 
        preference value. Multiple &lt;UserPref&gt; elements MAY be used within 
        a gadget specification.</t>
 
        <t>Containers MUST process each &lt;UserPref&gt; by making each 
        available to the gadget via the <spanx style="verb">gadgets.Prefs</spanx>
        API, using the value of &lt;UserPref&gt; element's required "name" attribute as the 
        index key for storing and retrieving preferences using the API.</t>
 
        <figure><artwork>
  BaseUserPref = {
    attribute name { text },
    attribute display_name { text }?,
    attribute default_value { text }?,
    attribute required { "true" | "false" }?,
    undefinedAttribute*,
    extensionElement*
  }
 
  SimpleUserPref = element UserPref {
    BaseUserPref,
    attribute datatype { 
      "string" | 
      "hidden" | 
      "bool" |
      "list" | 
      "number" }?
  }
 
  EnumUserPref = element UserPref {
    BaseUserPref,
    attribute datatype { "enum" },
    element EnumValue {
      attribute value { text },
      attribute display_value { text }?,
      undefinedAttribute*,
      extensionElement*
    }*,
    extensionElement*
  }
 
  EnumPref = element SimpleUserPref | EnumUserPref
        </artwork></figure>
 
        <t>The "datatype" attribute specifies the data type for the instances
        of the preference value at runtime. Valid values are "string", "hidden",
        "bool", "list" and "number". If not specified, the value is assumed
        to be "string". For more information on "datatype", refer to 
        <xref target="datatypes-values"/> below.</t>
 
        <t>The "display_name" attribute specifies a preferred display name for the 
        preference. The value SHOULD be localized as described in <xref target="Localization" />.</t>
 
        <t>The "default_value" attribute specifies the default value for instances
        of the preference. The value of the attribute depends on the value
        of the "datatype" attribute. Container's MUST provide the value of 
        the "default_value" attribute as the value of the preference when using the 
        <spanx style="verb">gadgets.Prefs</spanx> API and a stored value for the 
        preference does not yet exist.</t>
 
        <t>The "required" attribute specifies whether instances of the preference
        require a valid value in order for the gadget to function correctly.
        Valid values are "true" and "false". If not specified, the value is 
        assumed to be "false". If the value is "true", Containers SHOULD
        display an error message or a prompt if there is no value stored.</t>
 
        <section title="User Preference Data Types">
 
          <t>The default data type for all user preference values is "string", 
          represented either by omitting the "datatype" attribute on the 
          &lt;UserPref&gt; element or by explicitly specifying 
          <spanx style="verb">datatype="string"</spanx>. When datatype is "string", 
          The value of the "default_value" attribute and the stored value of 
          the user preference at runtime MUST be a string.</t>
 
          <figure><preamble>An example "string" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="string" default_value="foo"
            display_name="Foo" required="true" />
          ]]></artwork></figure>
 
          <t>When datatype equals "number", the value of the "default_value" 
          attribute and the stored value of the user preference at runtime
          MUST be a numeric value.</t>
 
          <figure><preamble>An example "number" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="number" default_value="123"
            display_name="Foo" required="true" />
          ]]></artwork></figure>
 
          <t>When datatype equals "bool", the value of the "default_value"
          attribute and the stored value of the user preference MUST 
          evaluate to "true" or "false" when accessed via the 
          <spanx style="verb">gadgets.Prefs.getBool</spanx> API.</t>
 
          <figure><preamble>An example "bool" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="bool" default_value="true"
            display_name="Foo" required="true" />
          ]]></artwork></figure>
 
          <t>When datatype equals "list", the value of the "default_value"
          attribute and the stored value of the user preference MUST
          be a pipe-delimited (|) string of values, returned as a 
          JavaScript array when accessed via the <spanx style="verb">gadgets.Prefs.getArray</spanx> 
          API.</t>
 
          <figure><preamble>An example "list" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="list" default_value="foo|bar|baz"
            display_name="Foo" required="true" />
          ]]></artwork></figure>
 
          <t>When datatype equals "hidden", the value of the "default_value" 
          attribute and the stored value of the user preference MUST
          be a string. The difference between "hidden" and "string" is 
          that "hidden" user preferences are not visible and are not editable
          by users by can be accessible via the <spanx style="verb">gadgets.Prefs.getString</spanx> 
          API.</t>
 
          <figure><preamble>An example "hidden" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="hidden" default_value="foo"
            display_name="Foo" required="true" />
          ]]></artwork></figure>
 
          <t>When datatype equals "enum", the &lt;UserPref&gt; element SHOULD
          contain one or more &lt;EnumValue&gt; elements, each of which define
          a single possible value for the preference. Each &lt;EnumValue&gt;
          element contains a required "value" attribute that specifies a
          string value, and an optional "display_value" attribute that specifies
          a textual representation of the "value". If unspecified, the 
          "display_value" defaults to the "value". Containers SHOULD display
          the "display_value" in place of "value" when rendering a user 
          interface for editing purposes. The value of the "default_value"
          attribute and the stored value of the user preference MUST equal
          one of the supplied &lt;EnumValue&gt; "value" attributes.</t>
 
          <figure><preamble>An example "enum" preference:</preamble>
          <artwork><![CDATA[
  <UserPref name="foo" datatype="string" default_value="foo"
            display_name="Foo" required="true">
    <EnumValue value="foo" display_value="Foo" />
    <EnumValue value="bar" display_value="Bar" />
    <EnumValue value="baz" display_value="Baz" />
  </UserPref>
          ]]></artwork></figure>
 
        </section>        
 
      </section>
 
      <section title="The &lt;Data&gt; Element">
 
        <t>The &lt;Data&gt; element contains data pineline elements as 
        defined by <xref target="DataPipelining"/>. All data pipeline
        elements defined in this block are registered globlly for all
        views by default. Individual data pipeline elements MAY be specified
        for particular views by adding the "view" attribute to the tag.</t>
 
        <t>See <xref target="DataPipelining"/> for complete information
        on the data pipelining mechanism and element definitions.</t>
 
      </section>
 
      <section title="The &lt;ExternalServices&gt; Element">
 
        <t>The &lt;ExternalServices&gt; element contains zero or more
        &lt;ServiceTag&gt; elements used to establish an "alias"
        for container-managed external services utilized by the gadget.</t>
 
        <figure><artwork>
  ExternalServices = element ExternalServices {
    undefinedAttribute*,
    element ServiceTag {
      attribute alias { text },
      text
    }*
  }
        </artwork></figure>
 
        <t>The &lt;ServiceTag&gt; element has a single "alias" attribute whose
        value is a string and textual content that provides a gadget-specific
        plain-text label for the alias. Additional markup within the &lt;ServiceTag&gt;
        is not allowed.</t>
 
        <t>Currently, when making a remote request from within a gadget using
        either the <spanx style="verb">OSAPI</spanx> or <spanx style="verb">gadgets.io.makeRequest</spanx> APIs, 
        the full URL of the remote service that is being invoked must be known
        to the gadget and specified within the request, along with all other 
        details of the request. Often, however, it is desirable to offload the 
        responsibility of managing access to external services to the container,
        for instance, when multiple services are available that implement the
        same protocol and it would be difficult for a single gadget to keep 
        track of all instances; or when a potentially untrusted gadget needs to be given
        access to secure backend systems. In such cases, a container can choose
        to manage all of the details involved with connecting to and communicating
        with the service and expose that service to the gadget via an "alias".</t>
 
        <t>Once an alias for a service is established, a gadget specification
        can use the &lt;ServiceTag&gt; element within &lt;ExternalServices&gt;
        to declare a gadget-specific reference label for the alias that can be 
        used when invoking the <spanx style="verb">OSAPI</spanx> or 
        <spanx style="verb">gadgets.io.makeRequest</spanx> APIs in place of 
        the URL.</t>
 
        <t>For example, suppose that a gadget requires access to a backend 
        enterprise application that implements a proprietary communications 
        protocol. Software is added to the container that allows it to 
        communicate with the backend system. All of the details including the
        URL, authentication details, authorization, and so forth are configured
        within the container by an administrator and an alias is assigned to
        the service: "opensocial:service://example.com/api?version=1".</t>
 
        <t>The gadget developer then creates the gadget specification and adds
        a &lt;ServiceTag&gt; element referencing the alias and created a lobel
        for the alias that can be used within the gadget's Javascript:</t>
 
        <figure><artwork><![CDATA[
  <Module>
    ...
    <ExternalServices>
      <ServiceTag alias="opensocial:service://example.com/api?version=1">
        EnterpriseService
      </ServiceTag>
    </ExternalServices>
    <Content>
      ...
      <script>
        ...
        var params = {
          'alias' : 'EnterpriseService',
          'href'  : '/files',
          'format': 'json',
        };
        osapi.http.get(params).execute(
          function(result) {
            ...
          }
        );
        ...
      </script>
      ...
    </Content>
  </Module>
        ]]></artwork></figure>
 
        <t>When the gadget is installed, the container will attempt to match
        the alias specified in the &lt;ServiceTag&gt; to any known configured
        services -- in this case, our backend enterprise service -- and will 
        automatically proxy all gadget requests to the "EnterpriseService" label
        to the backend service.</t>
 
        <t>It is possible for multiple service instances managed by a
        single container to share the same alias; for instance, when there are 
        multiple servers available that implement the same communication protocols. 
        In such cases, when the gadget is installed, the container can either 
        automatically select an appropriate service instance to map the &lt;ServiceTag&gt;
        to or provide a choice to the user installing the gadget to select 
        which service instance to use.</t>
 
        <t>If a &lt;ServiceTag&gt; specifies an alias that is not currently 
        known to the container, installation of the gadget SHOULD fail and 
        an error reported.</t>
 
      </section>
 
      <section title="The &lt;Content&gt; Element">
 
        <t>The &lt;Content&gt; element provides the user interface and 
        runtime code for the gadget. A gadget specification MUST have 
        at least one &lt;Content&gt; element.</t>
 
        <figure><artwork>
 
  CommonContent = {
    attribute preferred_height { text }?,
    attribute preferred_width { text }?,
    attribute view { text }?,
    undefinedAttribute*
  }
 
  UrlContent = element Content {
    CommonContent,
    SignedFetch,
    attribute type { "url" },
    attribute href ( IRI ),
    extensionElement*
  }
 
  ProxiedContent = element Content {
    CommonContent,
    SignedFetch,
    attribute type { "html" }?,
    attribute href { IRI },
    extensionElement*
  }
 
  HtmlContent = element Content {
    CommonContent,
    attribute type { "html" }?,
    text
  }
 
  Content = UrlContent | HtmlContent | ProxiedContent
        </artwork></figure>
 
        <t>The required "type" attribute specifies the type of content provided
        by the &lt;Content&gt; element. Valid values are either "html" or "url".
        Containers MUST process the &lt;Content&gt; element according to the 
        specific rules for each type.</t>
 
        <t>The &lt;Content&gt; element MUST conform to the following rules:</t>
 
        <list style="numbers">
          <t>If the value of "type" is "html" and the "href" attribute is
          specified, the content of &lt;Content&gt; MAY contain one or more
          Data Pipeline elements as defined in <xref target="DataPipelining"/>.
          The &lt;Content&gt; element MAY also contain any combination of the
          "Signed Fetch" attributes defined by <xref target="signed-fetch" />.</t>
          <t>If the value of "type" is "html", and the "href" attribute is 
          not specified, the content of &lt;Content&gt;
          MUST NOT contain child elements and SHOULD be suitable for
          handling as HTML [TODO: HTML].  The HTML markup SHOULD be wrapped
          within a CDATA tag otherwise it MUST be escaped in order to prevent
          the HTML from being interpreted by the XML parser; for
          example, "&lt;br>" as "&amp;lt;br>".</t>
          <t>If the value of "type" is "url", the &lt;Content&gt; element
          MUST contain the "href" attribute and MUST NOT contain child elements 
          or text. Containers SHOULD ignore any elements or text contained 
          within the &lt;Content&gt;. The element MAY contain any combination 
          of the "Signed Fetch" attributes defined by <xref taret="signed-fetch"/>.</t>
          <t>Any &lt;Content&gt; element MAY contain "preferred_height" and "
          preferred_width" attributes that specify the preferred dimensions, in pixels, 
          the container SHOULD use when rendering the content.</t>
          <t>Any &lt;Content&lt; element MAY contain a "views" attribute 
          that specifies a comma-separated list of views. A single gadget can
          support multiple views. Each view is associated with at least one &lt;Content&gt;
          element. When the container renders a gadget with multiple &lt;Content&gt;
          elements, it will use the view name to select the appropriate content.</t>    
        </list>
 
        <t>When a &lt;Content&gt; element uses the "href" attribute, the 
        view names listed in it's views attribute MUST NOT be used in any 
        other &lt;Content&gt; element. A single view name MAY
        appear within multiple &lt;Content&gt; elements that specify
        a "type" attribute value of "html" and do not include an "href" attribute.
        How multiple &lt;Content&gt; elements sharing the same view name are 
        processed to provide the rendered content for a view is defined in 
        <xref target="content-processing-model"/>.</t>
 
        <t>&lt;Content&gt; elements that do not specify a "views" attribute 
        are considered, by default, to be associated with the "default" view.</t>
 
        <section title="Processing Model" anchor="content-processing-model">
 
          <t>Containers MUST conform to the following rules when rendering a
          gadget view.</t>
 
          <section title="HTML Content">
 
            <figure><preamble>The simplest form of content provided by a gadget is HTML 
            associated with the "default" view:</preamble><artwork>
  &lt;Content type="html">&lt![CDATA[
    &lt;div>Hello World!&lt;/div>
  ]]&gt;&lt;/Content>
            </artwork></figure>
 
            <figure><preamble>The same example can be provided by explicitly naming
            the default view in the element's views attribute:</preamble><artwork>
  &lt;Content type="html" views="default">&lt![CDATA[
    &lt;div>Hello World!&lt;/div>
  ]]&gt;&lt;/Content>
            </artwork></figure>
 
            <t>When the container renders the "default" view for the gadget, it 
            will select this &lt;Content&gt; element and display the HTML "&lt;div>Hello World!&lt;/div>"
            to the user.</t>
 
            <t>If a gadget provides multiple "html" &ltContent&gt; elements that
            specify the same view, the content is concatenated together when 
            rendered in the order those &lt;Content&gt; elements appear within
            the gadget specification:</t>
 
            <figure><preamble>For instance, given two "html" Content elements 
            for the "default" view:</preamble><artwork>
  &lt;Content type="html">&lt![CDATA[
    &lt;div>Hello World!&lt;/div>
  ]]&gt;&lt;/Content>
  &lt;Content type="html" views="default,greeting">&lt![CDATA[
    &lt;div>How are you?&lt;/div>
  ]]&gt;&lt;/Content>
            </artwork></figure>
 
            <figure><preamble>When rendering the default view, the container 
            would generate the following:</preamble><artwork>
  &lt;div>Hello World!&lt;/div>
  &lt;div>How are you?&lt;/div>
            </artwork></figure>
 
            <figure><preamble>However, when rendering the "greeting" view, 
            the container would only select the &lt;Content&gt; element 
            that lists the "greeting" view:</preamble><artwork>
  &lt;div>How are you?&lt;/div>
            </artwork></figure>
 
            <t>Once the HTML content for a view has been assembled from the 
            appropriate &lt;Content&gt; elements, the container MUST perform
            Variable Substitution on the resulting content as defined by
            <xref target="variable-substitution"/>.</t>
 
          </section>
 
          <section title="Proxied Content">
 
            <t>As an alternative to including HTML markup directly within 
            the gadget specification, a &lt;Content&gt; element that uses
            type="html" MAY reference an external resource containing 
            HTML markup using the "href" attribute. When the gadget is 
            rendered, the container will fetch the external resource and 
            process it's HTML content as if it were included directly 
            within the &lt;Content&gt; element. This is commonly referred
            to as "Proxied Content".</t>
 
            <figure><preamble>An example of proxied content 
            associated with the "default" view:</preamble><artwork>
  &lt;Content type="html" href="http://example.org/hello.html"/>
            </artwork></figure>
 
            <t>When rendering the "default" view for a gadget containing
            the above &lt;Content&gt; element, the container will issue an 
            HTTP request to the address provided by the "href" attribute
            to retrieve the content.</t>
 
            <t>The container MUST add the following additional query 
            string parameters to the address provided by the "href" attribute:
              <list style="hanging">
                <t hangText="lang">The preferred language of the user for which
                the content is being rendered, specified as an ISO-639-1 
                language code.</t>
                <t hangText="country">The country of the user for which the 
                content is being rendered, specified as an ISO-3166-1 
                country code.</t>
                <t hangText="opensocial_proxied_content">MUST be specified 
                using the value "1". Servers can use this to identify
                proxied content renders from other types of requests.</t>
              </list>
            </t>
 
            <t>When the remote service returns the HTML content back to the 
            container, the container will continue to process it as if the 
            HTML had been directly included within the gadget specification.</t>
 
            <t>Note that, whereas multiple HTML Content elements MAY share a 
            common view name, the view names associated with Proxied Content MUST be 
            unique to that &lt;Content&gt; element, therefore making concatentation 
            unnecessary. The container MUST, however, still perform 
            Variable Substitution on the returned HTML content.</t>
 
            <t>If the response to the proxied request returns a successful HTTP 
            status code, the container MUST interpret the resulting response 
            body according to the rules for content declared inline.</t>
 
            <t>If the response to the proxied request returns an unsuccessful 
            HTTP status code, the container SHOULD present a meaningful error 
            message to the end user. Containers SHOULD obtain a suitable error 
            message for display by displaying the content specified for a view 
            named as "{view-name}.error", where {view-name} matches the name 
            of the view that the proxied request was being processed for. If an 
            exact match can not be found, the special view name "default.error" should 
            be used. If content for the "default.error" is not present, the 
            container SHOULD display a generic message indicating that a 
            problem occurred.</t>
 
            <figure><preamble>For instance, A Proxied Content for the "greeting"
            view with a specific "greeting.error" view to display error responses:</preamble><artwork>
  &lt;Content type="html" href="http://example.org/hello.html" views="greeting"/>
  &lt;Content type="html" views="greeting.error">
    There was an error retrieving the greeting content.
  &lt;/Content>
            </artwork></figure>
 
            <figure><preamble>An alternative Proxied Content for the "greeting"
            view that uses the "default.error" view to display error responses:</preamble><artwork>
  &lt;Content type="html" href="http://example.org/hello.html" views="greeting"/>
  &lt;Content type="html" views="default.error">
    There was an error retrieving the content.
  &lt;/Content>
            </artwork></figure>
 
            <t>Containers SHOULD cache the results of the HTTP request following
            the recommendations of Section 13 of <xref target="RFC2616"/>. If
            a container does support caching of data, it MUST also support
            using the "refresh_interval" parameter to override the default 
            caching directives. TODO: How does that work?</t>
 
            <t>TODO: Discuss the cache key requirements... the ones that are
            in the spec currently need to be clarified.</t>
 
            <t>TODO: Discuss Pipelined content</t>
 
          </section>
 
          <section title="Redirected Content">
 
            <t>When using Proxied Content, the container is responsible for
            sending the HTTP request to the remote server and processing the
            content while the gadget is being rendered. Alternatively, by 
            using type="url" within the &lt;Content&gt; element, the container
            can be instructed to provide a "direct view" of the content retrieved
            from the remote source without additional processing. When the 
            gadget is being rendered for display within a Web Browser, this 
            can be achieved by using an HTML IFrame whose src attribute is 
            set to the value of the &lt;Content&gt; element's href attribute.
            This is commonly referred to as "Redirected Content".</t>
 
            <figure><preamble>An example of redirected content 
            associated with the "default" view:</preamble><artwork>
  &lt;Content type="type" href="http://example.org/hello.html"/>
            </artwork></figure>
 
            <t>When rendering the "default" view for a gadget containing
            the above &lt;Content&gt; element, the container will issue an 
            HTTP request to the address provided by the "href" attribute
            to retrieve the content and will display that to the user exactly
            as it is returned from the server without any further processing.</t>
 
            <t>The container MUST add the following additional query 
            string parameters to the address provided by the "href" attribute:
              <list style="hanging">
                <t hangText="lang">The preferred language of the user for which
                the content is being rendered, specified as an ISO-639-1 
                language code.</t>
                <t hangText="country">The country of the user for which the 
                content is being rendered, specified as an ISO-3166-1 
                country code.</t>
                <t hangText="libs">A relative URL reference that points to 
                any JavaScript resources necessary to satisfy the optional 
                or required features listed within the gadget specifications 
                &lt;ModulePrefs&gt;. TODO: this needs more explanation</t>
              </list>
            </t>
 
            <figure><preamble>When rendering the default view for a gadget containing
            the above Redirected Content element, the container 
            would generate the following:</preamble><artwork>
  ...
  &gt;iframe src="http://example.org/hello.html?language=en&amp;country=US&amp;libs=????"
  ...
            </artwork></figure>
 
            <t>Like Proxied Content, view names associated with Redirected
            Content MUST not be shared with any other &lt;Content&gt; elements
            making concatenation unnecessary. Additionally, because Redirected
            Content is rendered exactly as it is provided by the remote service,
            Variable Substitution is not required. </t>
 
          </section>
 
          <section title="Authentication for Proxied and Redirected Content" anchor="signed-fetch">
 
            <t>For Proxied and Redirected Content (as well as the &lt;Preload&gt;
            element) the Signed Fetch mechanism described in 
            <xref target="SignedFetch"/> MAY be used to specify the type of
            authentication used in the request sent to the remote service.</t>
 
            <figure><preamble>The Signed Fetch attributes defined below MAY
            be used on any Proxied and Redirected Content elements:</preamble><artwork>
 
  NoAuth = {
    attribute authz { "none" }?
  }
 
  AuthCommon = {
    attribute refresh_interval { text }?,
    attribute sign_owner { "true" | "false" }?,
    attribute sign_viewer { "true" | "false" }?
  }
 
  OAuth1 = {
    AuthCommon,
    attribute authz { "oauth" },
    attribute oauth_received_callback { text }?,
    attribute oauth_request_token { text }?,
    attribute oauth_request_token_secret { text }?,
    attribute oauth_service_name { text }?,
    attribute oauth_token_name { text }?,
  }
 
  OAuth2 = {
    AuthCommon,
    attribute authz { "oauth2" },
    attribute oauth_received_callback { text }?,
    attribute oauth_request_token { text }?,
    attribute oauth_request_token_secret { text }?,
    attribute oauth_service_name { text }?,
    attribute oauth2_scope { text }?,
    attribute oauth_token_name { text }?,
  }
 
  SignedAuth = {
    AuthCommon,
    attribute authz { "signed" },
  }
 
  SignedFetch = NoAuth | OAuth1 | OAuth 2 | SignedAuth
            </artwork></figure>
 
            <t>The "authz" attribute identifies the authentication type used when
            submitting the request to fetch the resource. The valid values
            are "none", "oauth", "oauth2" or "signed" and each correspond to
            the values and meanings defined for the <spanx style="verb">gadgets.io.AuthorizationType</spanx> API.
            When not specified, the default is assumed to be "none" indicating
            that authentication is to be used.</t>
 
            <t>When "authz" is equal to "oauth", requests sent to the 
            remote service MUST be authenticated using the OAuth 1.0 protocol.</t>
 
            <t>When "authz" is equal to "oauth2", requests sent to the 
            remote service MUST be authenticated using the OAuth 2.0 protocol.</t>
 
            <t>When "authz" is either "oauth" or "oauth2", the following 
            additional optional attributes MAY be included as defined by 
            <xref target="OAuth"/>:
              <list style="symbols">
                <t>oauth_received_callback</t>
                <t>oauth_received_callback</t>
                <t>oauth_request_token</t>
                <t>oauth_request_token_secret</t>
                <t>oauth_service_name</t>
                <t>oauth2_scope</t>
                <t>oauth_token_name</t>
              </list>
            </t>
 
            <t>When "authz" is equal to "signed", the "Signed Fetch" mechanism
            described by <xref target="SignedFetch"/> is to be used.</t>
 
            <t>The "sign_owner" attribute indicates whether the identity of the 
            gadget "OWNER" needs be included in the request sent to fetch the
            resource. If the value of this attribute is "true", the container 
            MUST include the identity of the gadget "OWNER".</t>
 
            <t>The "sign_viewer" attribute indicates whether the identity of the
            current gadget "VIEWER" needs to be included in the request sent to
            fetch the resource. If the value of this attribute is "true", the
            container MUST include the identity of the gadget "VIEWER".</t>
 
            <t>TODO: Define refresh_interval.. currently it's role in 
            signed fetch is undefined</t>
 
          </section>
 
        </section>
      </section>
  </section> <!-- END DOCUMENT STRUCTURE -->