This specification describes how a client application can display links and embed rich previews for resources from other applications. Links may have a label and an icon, and previews are HTML markup provided by a server and displayed directly inside the client application.
Previews often appear as a pop-up when a user mouses over a link as in . However, a client may wish to display a preview differently depending on the kind of application, the size of the screen, and the capabilities of the device. For example, a desktop application on a PC might handle previews differently than a mobile application running on a small touchscreen.
Servers can provide both small and large previews. A client might show a small preview first, then if the user gestures, show additional details from the large preview. Servers suggest sizes for previews, and previews can ask to be resized after they are displayed.
A client only needs to know the URI of a resource to display a link and a preview. It doesn't need to know anything else about the resource. Clients don't need to copy, synchronize, or cache any data.
Terminology uses and extends the terminology and capabilities of OSLC Core Overview, W3C Linked Data Platform [[!LDP]], W3C's Architecture of the World Wide Web [[WEBARCH]], and Hyper-text Transfer Protocol [[!HTTP11]].
The following terms are used in discussions of previews:
The namespace for OSLC Core is http://open-services.net/ns/core#
.
Commonly used namespace prefixes:
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix oslc: <http://open-services.net/ns/core#>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
Applications often display links to related resources from other applications. For example, a quality management application might show a link to a related defect when displaying a test result. In some cases, the quality management application only has a URI pointing to the defect. The application needs a way to display the link with an appropriate label and icon so testers find out the status of the defect without leaving the quality management application.
Compact resources and resource preview provide these capabilities. Clients can discover the link label and a resource icon given only the resource URI. The client can then use the link label and icon as a means of displaying the link in a meaningful way. Previews allow users to see see information about related resources quickly without leaving the application they're in, even when the resources are from another server.
To enable previews of a resource, servers supply an associated Compact resource describing the preview. The Compact resource can contain a link label, icon, and small and/or large previews of the resource. Compact resources always have a JSON representation [[!RFC4627]], but they can also have other representations such as XML, Turtle [[!turtle]] or JSON-LD [[!JSON-LD]]. Here is a simple example of a Compact resource:
{ "title": "Screenshot of the problem", "icon": "http://example.com/icons/attachment.jpg", "smallPreview": { "document": "http://example.com/bugs/324/screenshot?preview=small" } }
To display a link with a label or a preview of a resource, clients request its Compact resource. The URI of the
Compact resource is found through an HTTP Link
header [[!RFC5988]] in HTTP responses to the
resource URI. Alternatively, a client can use a Prefer
request header in requests for the resource
to ask for its Compact resource. The server can then inline the Compact resource directly in the response,
saving an HTTP request.
The Compact resource may contain small and/or large previews. Each preview can have size hints and a link to an
HTML representation designed to be embedded in other user interfaces. To display the preview, the client creates
an HTML iframe
element in its user interface and sets the iframe
element's
src
to the preview document URI. This sandboxes the preview from other content in the client
application and allows the preview to use its own stylesheets and scripts.
Clients can discover Compact resources in three ways:
The HTTP Accept
header allows clients to access previews using the
application/x-oslc-compact+xml
MIME type extension to request the Compact resource representation
for a URI instead of the content of the resource itself. This usage is considered deprecated and is included
only to maintain compatibility with [[!OSLCUIPreview20]].
The HTTP Link
header allows servers to offer previews for any resource, even binary resources
with no RDF or JSON representations. To discover previews using the Link
header, a client
typically performs an HTTP HEAD or OPTIONS request on the resource URI. The response contains a
Link
header with the URI of the Compact resource. The client then performs a GET request on the
Compact URI to retrieve the Compact resource.
Clients might instead use the HTTP Prefer
header to get the Compact resource in a single HTTP
request. If the client is confident that the resource has a preview, it makes an HTTP GET request on the
resource URI using the return=representation
preference [[!RFC7240]] and an
include
parameter [[!LDP]] asking for the Compact resource to be included in the response. The
provider responds with a minimal representation of the resource and the Compact resource in the HTTP response
body.
[[!OSLCUIPreview20]] utilizes a MIME type extension, application/x-oslc-compact+xml
to allow
servers to use content negotiation with the HTTP Accept
header to access the Compact
representation of a resource instead of the content of the resource itself.
GET /bugs/324/screenshot HTTP/1.1 Host: example.com Accept: application/x-oslc-compact+xml
This returns a Compact resource with Content-Type: application/x-oslc-compact+xml
as defined in
.
In responses to HTTP requests for resources that have a preview, servers include a Link
header
[[!RFC5988]] where the link relation is http://open-services.net/ns/core#Compact
and the target
URI is the URI of the Compact resource.
HEAD /bugs/324/screenshot HTTP/1.1 Host: example.com
HTTP/1.1 200 OK Content-Length: 45789 Content-Type: image/png ETag: "678609cdee68e0fb8aea5f252b84a511" Link: <http://example.com/bugs/324/screenshot?compact>; rel="http://open-services.net/ns/core#Compact"
Clients can request the Compact resource using the target URI of the Link
header.
GET /bugs/324/screenshot?compact HTTP/1.1 Host: example.com Accept: application/json
HTTP/1.1 200 OK Content-Length: 192 Content-Type: application/json; charset=UTF-8 ETag: "3bf6fbc90e11b3c2cc30acb534b452ea" Vary: Accept,Accept-Language { "title": "Screenshot of the problem", "shortTitle": "screenshot.png", "smallPreview": { "document": "http://example.com/bugs/324/screenshot?preview=small" } }
Servers can also return a Link
header in response to successful requests that create resources.
This allows the client to get the Compact resource URI for new resources without making additional requests.
Note that servers set the Link
context using an anchor
parameter if the request
URI is not the same as the newly-created resource URI.
POST /bugs HTTP/1.1 Host: example.com Content-Length: 153 Content-Type: text/turtle @prefix dcterms: <http://purl.org/dc/terms/> . <> a <http://example.com/ns#Bug> ; dcterms:title "Something went wrong" .
HTTP/1.1 201 Created Content-Length: 0 Link: <http://example.com/bugs/478?compact>; rel="http://open-services.net/ns/core#Compact"; anchor="http://example.com/bugs/478" Location: http://example.com/bugs/478
Clients can request a Compact resource by making an HTTP GET request to the target resource's URI using the
return=representation
preference of the HTTP Prefer request header [[!RFC7240]] and
include
parameter [[!LDP]] value http://open-services.net/ns/core#PreferCompact
.
Servers supporting resource preview must support this method of discovery for resources with RDF or JSON
representations.
GET /bugs/324 HTTP/1.1 Host: example.com Accept: application/json Prefer: return=representation; include="http://open-services.net/ns/core#PreferCompact"
If the provider supports a preview for this resource and the request is successful, the response includes the Compact resource in its body.
The response content type is negotiated using the HTTP Accept
request header. If the negotiated content type is
application/json
, the response body is a JSON object. The top-level JSON object has a
compact
property whose value is the JSON object describing the Compact resource in
. The JSON may include other properties.
HTTP/1.1 200 OK Content-Length: 315 Content-Type: application/json; charset=UTF-8 ETag: "f9d76afe5fbed1655c5768906db8958a" Preference-Applied: return=representation Vary: Accept,Accept-Language,Prefer { "compact": { "title": "324: Need a fix <em>NOW</em>", "icon": "http://example.com/icons/defect.jpg", "largePreview": { "document": "http://example.com/bugs/324?preview=large", "hintHeight": "250px", "hintWidth": "400px" } } }
Services may include a JSON-LD context in an application/json
response. Clients who prefer RDF
should request text/turtle
or application/ld+json
using the HTTP
Accept
request header, rather than application/json
.
HTTP/1.1 200 OK Content-Length: 788 Content-Type: application/json; charset=UTF-8 ETag: "d53d19be87fa9c61043c70bd91413dab" Preference-Applied: return=representation Vary: Accept,Accept-Language,Prefer { "@id": "http://example.com/bugs/324", "@type": "http://example.com/ns#Bug", "@context": "http://docs.oasis-open.org/oslc-core/oslc-core/v3.0/cs01/contexts/preview.jsonld", "compact": { "@id": "http://example.com/bugs/324?compact", "@type": "http://open-services.net/ns/core#Compact", "title": "324: Need a fix <em>NOW</em>", "shortTitle": "324", "icon": "http://example.com/icons/defect.jpg", "iconTitle": "Defect", "iconAltLabel": "Defect", "largePreview": { "document": "http://example.com/bugs/324?preview=large", "hintHeight": "250px", "hintWidth": "400px" }, "smallPreview": { "document": "http://example.com/bugs/324?preview=small" } } }
When displaying a preview inside another HTML-based presentation, clients create an
iframe
element, setting its src
attribute to the preview's document URI. Previews
can contain HTML, stylesheets, and scripts and might not render properly outside of an iframe
.
Using the iframe
element also sandboxes the preview, avoiding cross-site scripting
vulnerabilities.
Typically, the server does not include the icon or title in the preview itself. The client can display these as needed. In , the preview document is the content inside the yellow, dashed lines.
Resources can have both a small and large preview, and clients can choose which to display. Some clients display the small preview initially and let users expand to the large preview using a button or "Show more" link.
The Compact resource can include oslc:hintHeight
and oslc:hintWidth
properties for
each preview. Values for oslc:hintWidth
and oslc:hintHeight
are expressed in
length units specified in [[!CSS21]].
Servers can also request dynamic resizing for small and large previews. The communication of dynamic size
information happens within a web browser. JavaScript code running in the preview iframe
sends a
message that is received and acted upon by JavaScript code running in the iframe
's parenting
window. This cross-frame communication is done using HTML 5 postMessage
. Dynamic resizing will
not work inside browsers that do not support postMessage
.
A resize message begins with oslc-resize:
followed by a JSON object describing the dimensions
using properties oslc:hintHeight
and oslc:hintWidth
.
JSON Property Name | Type | Occurs | Description |
---|---|---|---|
oslc:hintHeight |
String | Zero-or-one | Preferred height of the preview. Values are expressed using length units as specified in [[!CSS21]]. |
oslc:hintWidth |
String | Zero-or-one | Preferred width of the preview. Values are expressed using length units as specified in [[!CSS21]]. |
For example, the following message requests that the preview be resized to height of 277 pixels and a width of 400 pixels.
oslc-resize:{"oslc:hintHeight": "277px", "oslc:hintWidth": "400px"}
The following JavaScript example sends a resize request to the parent window.
var size = { 'oslc:hintHeight': '277px', 'oslc:hintWidth': '400px' }; if (window.postMessage && window.parent) { window.parent.postMessage('oslc-resize:' + JSON.stringify(size), "*"); }
Clients can ignore a server's size hints and use other values. For instance, a client might choose another size if the preview is too large for the window.
The following guidance is suggested for Client display of a resource link and rich previews. For purposes of this discussion, assume source resource A has a URI property that refers to target resource B:
The typical way for forming and displaying the hyperlink should be based on information that is stored locally in source resource A (or that is generally known to the Client). Generally, link text can be derived from property values of resource A, and potentially from a string or literal property value in the reference to the target resource B, if such a property exists. Because these property values are part of the representation of the source resource A, they are available without consulting the target resource, and will be available even if the target resource B cannot be fetched. When available, Clients should display this string (as opposed to the URI) when presenting resource A to indicate a potential navigation to resource B. This is the basic presentation of a link to target resource B.
The default display of the link from A to B is visible to any user authorized to access resource A. The use of Compact representation information described below is only viable for users who are also authorized to access resource B.
A Compact representation of the resource may contain a more accurate and slightly richer label for a target
resource (dcterms:title
element), a short-form title for the resource
(oslc:shortTitle
), and a corresponding image (oslc:icon
), possibly chosen from a set
with different sizes (oslc:iconSrcSet
), all of which may be based on the current state of the
target resource. If this becomes known to the Client, the client should assume that this information is better
and use it in forming the hyperlink that is displayed to the user. When available,
oslc:shortTitle
may be used instead of dcterms:title
in presentations where visual
space is severely limited.
Clients should not fetch Compact representations when there is perfectly usable default display information available. When designing a Client application, consideration should be given to the potential benefits of obtaining an improved title and icon for the target resource against the costs of preemptively fetching the Compact representation in terms of added load on servers and networks (which might only be apparent to users on slow networks or heavily loaded servers).
Clients should be wary of material obtained from non-trusted sources; in particular, the Client should check that the dcterms:title and oslc:shortTitle property values do not contain HTML markup beyond the specified set of simple elements.
When the resource does not supply preferred sizing for a preview, the Client should default to a reasonably generous value. The default value a Client uses may be different for different window and screen sizes.
If a user mouses or hovers over a displayed link, the Client should determine whether the target resource has
a small preview (oslc:smallPreview
). If it does, the Client should present the small preview
document in a hovering widget. Since preview documents may contain arbitrary content, including HTML and
scripts, Client must use iframes if embedding the preview document inside another HTML-based presentation.
The Client should not attempt to prefetch a Compact representation just to have the preview URIs in hand so that the hover can come up faster. There is a low chance that the user will make a gesture that would call for the display of a small preview. It would generally be a poor trade-off to increase overall system load just to decrease UI latency for low probability eventualities. Clients may wish to utilize lazy loading techniques to only access preview dialogs that users actually view, and can cache those dialogs for subsequent uses if needed to improve performance.
If the user then gestures that they want to see a bit more of the resource, the Client should determine
whether the target resource has a large preview (oslc:largePreview
). If it does, the Client
should present the large preview document in a stationary widget that permits further user interaction. Again,
since preview documents may contain arbitrary content, including HTML and scripts, Clients must use iframes if
embedding the preview document inside another HTML-based presentation.
Servers MAY choose to provide Compact resources for some resources and not others.
Resources with previews MUST support the HTTP OPTIONS method.
In responses to HTTP GET requests targeting resources that have a Compact resource, servers SHOULD either
include a Vary
response header with at least Accept
and Prefer
field
values or a Cache-Control
header value no-store
.
Servers MAY consult the
Accept-Language
header on requests for a Compact resource (and on requests for preview documents)
to return a resource for the requested natural language.
Clients SHOULD gracefully handle unsuccessful attempts to use previews. Previews may not be supported for all resources or may not work due to security or service availability issues.
In response to OPTIONS, HEAD or GET on resource, servers MAY include an
Accept: application/x-oslc-compact+xml
header to indicate the resource provides a compact
representation.
Servers MAY support the application/x-oslc-compact+xml
MIME type extension to allow clients to
use content negotiation to access the Compact resource. However, this usage should be considered deprecated
and is only provided for OSLC 2.0 compatibility.
Servers that do support the application/x-oslc-compact+xml
MIME type extension MUST return the
Compact resource using Content-Type: application/x-oslc-compact+xml
as specified in
[[!OSLCUIPreview20]].
In responses to successful HTTP requests for a target resource that has a Compact resource, servers MUST
include a Link
header [[!RFC5988]] where:
http://open-services.net/ns/core#Compact
, andLink: <http://example.com/bugs/324/screenshot?compact>; rel="http://open-services.net/ns/core#Compact"
If a newly-created resource has a Compact resource, servers MAY return a Link
header in
response to the creation request where:
http://open-services.net/ns/core#Compact
, andLink: <http://example.com/bugs/478?compact>; rel="http://open-services.net/ns/core#Compact"; anchor="http://example.com/bugs/478"
Clients MAY request that the Compact resource is returned inline with the target resource using the
Prefer
request header [[!RFC7240]] and
return
, value representation
include
[[!LDP]], value
http://open-services.net/ns/core#PreferCompact
.
Prefer: return=representation; include="http://open-services.net/ns/core#PreferCompact"
Servers MUST honor a client's request to in-line the Compact resource in JSON and RDF representations if the target resource has a Compact resource and the request is successful.
If the target resource does not exist or is not accessible to the requesting client, servers MUST return the
same status code that it would have returned had the client not included the Prefer
header in the
request.
When servers in-line the Compact resource with the target resource in an
application/json
[[!RFC4627]] response, the response entity MUST be a JSON object with a
compact
property where the value is the Compact resource JSON as described in
.
Servers MAY choose to return only a subset of the target resource properties when a client requests that the Compact resource is returned in-line.
Clients SHOULD inspect the response body for the Compact resource even if the server omits the
Preference-Applied
header [[!RFC7240]].
Servers MUST support the
application/json
[[!RFC4627]] and text/turtle
[[!turtle]] media types for the
Compact resource.
Servers SHOULD support the
application/ld+json
media type [[!JSON-LD]] for the Compact resource.
The application/json
Compact resource representation MUST be in the JSON format described in
.
Servers MAY respond with JSON-LD in
compacted document form when clients
request the application/json
representation of the Compact resource as long as the response meets
the requirements for the JSON representation.
RDF representations of the Compact resource MUST conform to the shape specified in .
Content-Type application/x-oslc-compact+xml
representations of the Compact resource MUST conform
to the shape specified in .
The Compact resource MAY have additional server-specific properties.
When displaying a preview inside another HTML presentation, clients MUST use an iframe
element,
setting its src
attribute to the preview's document URI.
Servers MUST express the
oslc:hintWidth
and oslc:hintHeight
properties of an oslc:Preview
in
length units as specified in [[!CSS21]].
Servers MAY use dynamic resizing for small and large previews in addition to oslc:Preview
oslc:hintHeight
and oslc:hintWidth
properties.
Servers that support dynamic sizing MUST send resize messages to the parent window using the
Window.postMessage
method [[!whatwg-web-messaging]] where the source of the event is the
preview's window.
A resize message MUST consist of the characters oslc-resize:
followed by a JSON object with at
least one of the following properties:
oslc:hintHeight
oroslc:hintWidth
.oslc-resize:{"oslc:hintHeight": "277px", "oslc:hintWidth": "400px"}
A resize message MAY also also consist of the characters oslc-preview-height:
followed by the
desired height in pixels.
oslc-preview-height:277
This postMessage
format should be considered deprecated and is only provided for OSLC 2.0
compatibility.
The oslc:hintHeight
and oslc:hintWidth
property values in the resize message JSON
MUST be length units as specified in [[!CSS21]].
Servers MAY send more than one dynamic resize request.
Clients MAY choose to ignore the size hints in oslc:Preview
resources or in dynamic resize
messages.
This document applies the following constraints to the OSLC Core vocabulary terms.
An OSLC server providing the Resource Preview capability MUST implement the vocabulary defined in this section.
A Compact resource JSON representation might look like the following for the target resource
http://example.com/bugs/324
:
{ "title": "324: Need a fix <em>NOW</em>", "shortTitle": "324", "icon": "http://example.com/icons/defect.jpg", "iconSrcSet": "http://example.com/icons/smallIcon.png 16w, http://example.com/icons/largeIcon.png 64w", "iconTitle": "Defect", "iconAltLabel": "Defect", "largePreview": { "document": "http://example.com/bugs/324?preview=large", "hintHeight": "250px", "hintWidth": "400px" }, "smallPreview": { "document": "http://example.com/bugs/324?preview=small" } }
The JSON representation has the following constraints:
title
or shortTitle
properties MUST, if present, only contain
markup valid in an HTML span
element. To afford clients the greatest flexibility to style the
text to match the context in which it is being displayed, the titles SHOULD be plain text with HTML markup
used only to emphasize words or phrases or to convey additional information about the target resource.
icon
, if present, MUST be the URI of an image. The image SHOULD be square. A client MAY scale the
image as needed.
iconSrcSet
, if present, MUST provide a comma-separated list of image URIs along with image size
as specified for the HTML img srcset attribute.
iconAltLabel
and iconTitle
, if present, MUST only have string content with no
markup.
smallPreview
and largePreview
, if present, MAY have any number of properties,
including none.
smallPreview
and largePreview
, if present, MUST be the JSON
representation of an
oslc:Preview.
Preview
MUST include a document property. It MAY have any number of other properties.
document
MUST be the URI of a document containing a preview of the resource.hintWidth
and hintHeight
, if present, MUST be expressed using length units
as specified in [[!CSS21]].
The following JSON-LD Context may be used with JSON Compact representations.
The following JSON Schema [[!JSONSchema]] describes the Compact JSON representation.
A Compact resource XML representation woould look like the following for the target resource
http://example.com/bugs/12345
:
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:oslc="http://open-services.net/ns/core#"> <oslc:Compact rdf:about="http://example.com/bugs/12345"> <dcterms:title> 12345: Need a "fix" <em>NOW</em> </dcterms:title> <oslc:shortTitle> 12345 </oslc:shortTitle> <oslc:icon rdf:resource="http://example.com/icons/defect.jpg" /> <oslc:iconAltLabel>Defect</oslc:iconAltLabel> <oslc:iconTitle>Defect</oslc:iconTitle> <oslc:smallPreview> <oslc:Preview> <oslc:document rdf:resource="http://example.com/bugs/12345?hover=small" /> </oslc:Preview> </oslc:smallPreview> <oslc:largePreview> <oslc:Preview> <oslc:document rdf:resource="http://example.com/bugs/12345?hover=large" /> <oslc:hintWidth> 60em </oslc:hintWidth> <oslc:hintHeight> 20em </oslc:hintHeight> </oslc:Preview> </oslc:largePreview> </oslc:Compact> </rdf:RDF>
The XML representation has the following syntactic and semantic constraints:
rdf:RDF
and SHOULD identify the
namespaces for RDF ( http://www.w3.org/1999/02/22-rdf-syntax-ns#
), Dublin Core (
http://purl.org/dc/terms/
), and OSLC ( http://open-services.net/ns/core#
), as well
as namespaces for any additional Provider supplied properties.
oslc:Compact
element MUST be a child of the root element and
MUST specify an rdf:about
attribute whose value is the URI of the target
resource.
oslc:Compact
element MAY have any number of child elements, including
none. Each child element specifies one property of the target resource. The order of child elements is not
significant.
dcterms:title
, oslc:shortTitle
, oslc:icon
,
oslc:smallPreview
, and oslc:largePreview
child elements
MAY occur at most once.
dcterms:title
or oslc:shortTitle
element
MUST be limited to any XHTML <span> element. To afford clients the greatest
flexibility to style the text to match the context in which it is being displayed, the titles
SHOULD be plain text with XHTML markup used only to emphasize words or phrases or to
convey additional information about the target resource.
oslc:icon
element MUST have an rdf:resource
attribute whose
value is a URI of an image. The image SHOULD be 16x16 pixels in size.
oslc:iconAltLabel
and oslc:iconTitle
elements MUST only
have string content.
oslc:smallPreview
and oslc:largePreview
elements MAY have
any number of child elements, including none.
oslc:Preview
element MUST be a child of an
oslc:smallPreview
or oslc:largePreview
element and
MAY occur at most once.
oslc:Preview
element MAY have any number of child elements,
including none. Each child element specifies one property of the Preview. The order of child
elements is not significant.
oslc:document
, oslc:hintWidth
, oslc:hintHeight
,
and oslc:initialHeight
child elements MAY occur at most once.
oslc:document
element MUST have an
rdf:resource
attribute whose value is a URI of a document containing a preview of the
resource.
oslc:hintWidth
, oslc:hintHeight
, or
oslc:initialHeight
element MUST be a valid relative length value.
dcterms:title
and oslc:shortTitle
, MAY include additional child
elements not specified here. Consumers MUST quietly ignore unknown elements and attributes
encountered in a Compact representation.