Re: A successor to framesets

What would framesets be like if we designed them today?
======================

Where would they be used?
-----------------------

Framesets (or emulations of framesets using a master-page and iframes)
are still in broad use, especially amongst documentation generators.

- Javadoc e.g. https://docs.oracle.com/javase/8/docs/api/
- Adobe Robohelp e.g. http://www.grainge.org/pages/authoring/rh_tour/index.htm
- MadCap Flare e.g.
http://webhelp.madcapsoftware.com/flare10NonResponsive/Default.htm
- Help-and-Manual e.g. http://www.helpandmanual.com/help/
- Innovasys Help Studio e.g. www.innovasys.com/help/hs/webframe.html
- HelpNDoc e.g.
http://www.helpndoc.com/sites/default/files/documentation/html/index.html
- WebWorker ePublisher e.g. http://www.webworks.com/Documentation/Reverb/
- FastHelp e.g. http://www.fast-help.com/WebsiteHelp/index.html?v8200
- HelpGenerator e.g. http://www.helpgenerator.com/help/help.htm
- Helpinator e.g. http://www.helpinator.com/webhelp/index.html

IIRC, none of these keep the address-bar URL matched to the primary content.
(Some of them use fragile work-arounds such as manual & automatic
redirects to the frameset page URL and/or the primary content URL
encoded into the frameset URL's query or hash).

Framesets designed today *should* be usable by these documentation
generators with minimal changes and *must* handle keeping the
address-bar URL matched to the primary-content automatically.

There are many other site generators that create similar sets of content -
many content pages, T.O.C., indexes, etc -
but don't present them in a frameset.

These generators should be able to use redesigned framesets with
minimal changes.
Ideally, even the content-author using such a generator should be able
to take the output files and make minimal changes to make use of
redesigned framesets.
Maybe even the end-user could have the power to apply a customized
frameset to such a site.

The preceding types of sites all seem to match the classical usage of framesets.

But if we were redesigning framesets maybe there will be all manner of
sites that are amenable to the approach.
In the introductory video - https://youtu.be/qVdAc8_ppao (skip to
22:40) - I demonstrate how twitter.com might be implemented as a
highly evolved frameset applied to (the much simpler yet
fully-functional) mobile.twitter.com.

Between traditional frameset sites and examples such as twitter.com
lies a significant proportion of the web (including almost every site
that uses jquery-pjax - https://github.com/defunkt/jquery-pjax).

The only precondition for this type of application would be that the
site is fully-functional without Javascript *and* without redesigned
framesets.


What are the required changes?
-------------------------

### Content First

HTML Frameset sites require the end-user to navigate to the
frameset-page which then loads primary and auxiliary content.

This needs to be the other way around - when the end-user first lands
on a site the primary-content of the landing-page should load first
and only then (and perhaps conditionally) the appropriate frameset is
applied. Later navigation around the site would be managed by the
"frameset", naturally updating the URL in the address-bar.


### Flexible layout

The original frameset implementation used the <frameset> element for layout.
Some sites emulate framesets with a master-page containing <iframe>s
to give better layout flexibility.
A redesigned frameset implementation must follow this latter example.


### Content shouldn't be designed for the frameset

Framed content in HTML Frameset sites is often designed specifically
for the frameset. This imposes restrictions on layout, styles,
contextual content, etc which may conflict with how the content might
be presented if it were a stand-alone page.

This needs to be switched - content pages should be designed for the
stand-alone scenario and the frameset implementation must be capable
of manipulating that content into the representation it needs.

This has two implications:

- Frame transformations: a frame must be capable of modifying the
(stand-alone) content it receives before rendering.

- Lightweight frames: styles and dynamic behavior for the framed
content must be set by the frameset

These in turn imply that scripts in the framed document cannot be
executed - this is not an issue since one of the meta-goals of a
frameset redesign is that pages / sites are fully-functional without
scripting.


### Hyperlink targetting is determined by the frameset, not the content

This is actually another implication of the previous requirement.
Since the content should not be aware of the frameset, hyperlinks in
the content cannot have a predefined target. Hyperlink targetting must
be determined from the frameset.


### Adaptive / responsive design

- The frameset should adapt to the available space in the browser.

- The frameset must have the ability to adapt to different categories
of content being displayed

- Sometimes these adaptations may result in parts of the DOM being
hidden (or even never displayed).
If a frame is enclosed by a hidden DOM tree then its content probably
should not be downloaded.
In general auxiliary content should be lazy-loaded.


A partial design
-----------------

### Determining the frameset for a URL

The end-user navigates to a URL. The page content begins to download.
How does the browser determine the appropriate frameset?

1. <link rel="frameset" href="..." />

Optionally these links could make use of @media but preferably this is
handled by the frameset.
This setting can be over-ridden by...

2. Scripted

Hard-coding the frameset on the server - using <link rel="frameset"> -
conflicts somewhat with the idea of decoupling the content from the
frameset. There should be the option of deferring this decision to a
script that can run on the client.

3. User configuration

This potentially allows the end-user to choose an alternate /
customized frameset for the site.
The site could provide alternate framesets or the user could
potentially design there own.
While this latter scenario is unlikely to be of general use (unless
web-sites adopt common application-level semantics) it would allow a
site-developer to privately test a new frameset on a live site.
The most likely user configuration option is to just disable framesets.


### Frameset definition

Theoretically the frameset could be defined in various ways, but there
are several advantages to using a stand-alone HTML document (with a
few frameset only custom-elements).

- the rendered frameset will be a HTML DOM
- more likely that editors and linters can be modified to understand
custom-HTML than custom-HTML-in-Javascript-strings or other
DOM-generation code
- the frameset can be viewed in a browser - visual verification can be
one of the quickest ways to spot errors
- HTML framesets had a frameset document so conceptual understanding
is facilitated

NOTE: The frameset document is not navigated to directly nor is it
directly rendered. This allows it to break some of the rules of normal
page loads which in turn enables more complex behavior than HTML
framesets. For example, script-handling can be different.

Applying a frameset definition means *replacing* the current browsing
context with a new one *based on* the frameset definition (but
retaining the landing-page URL). Polyfills will need to emulate this
process (and hope for the best).


### Frame definitions

Inside of the browser view (equivalent to the *rendered* frameset) a
frame is the point where content from a different URL is inserted.
But the content may need to be transformed first, and the frame also
needs to handle different states of content readiness - uninitialized,
loading, error, loaded.

Inside the frameset definition a frame defines this transformation and
ready-state handling.
Ideally this could be done with markup. The following is a suggestion:

<hf-frame id="unique-defn-id" main=".css .selector">

    <!-- a frame *definition* can have multiple bodies -->

    <hf-body condition=" uninitialized | loading | error | loaded">

        <hf-transform type=" main | script | xslt | custom " format="
css | xpath | microdata | microformats | custom ">
            <!-- content of the transform matches the @type and defines how to
                process a fetched document into a form appropariate to
be rendered. -->
        </hf-transform>

        <hf-transform type="main">
            <!-- transforms can be chained. -->
        </hf-transform>

    </hf-body>
</hf-frame>

When a *frameset definition* is loaded and parsed, each frame
definition is replaced with a frame declaration.
If the frame definition has no identifier then one is auto-generated.
The frame declaration receives a frame definition reference which
points to the frame definition.
The frame definition is added to a set of definitions indexed by @id.
After this processing the <body> of the frameset definition will
contain one or more frame declarations and each frame definition will
contain zero or more frame declarations.

Suggested transform types include:

- `main` which extracts the contents of the source documents <main> or
@role="main" or <body> or some custom selector

- `script` which processes the source document via javascript

- some form of advanced declarative transforming / templating language


### Frame declarations

Inside the frameset definition a frame declaration looks like a frame
definition without any content.
It would mimic the original <frame> signature like so:

<hf-frame def="unique-defn-id" src="/some/path"
name="not-necessarily-unique-name"></hf-frame>

The @def references a frame definitions. Several frame declarations
can share the same definition.

Frame declarations first enter the browser view when the frameset
definition's <body> is inserted.
When a frame declaration enters the browser view, its @src is fetched
and the contents of the frame are updated according to the resource's
ready-state and the frame's frame definition (referenced by @def).

Considering the case of the resource being fully loaded, it is
processed by the transforms specified in the frame definition's
`<hf-body condition="loaded">`.  The output of this processing
(assuming no failure) becomes the content of the frame. This may
result in more frame-declarations entering the browser view which are
processed in turn.


### Hyperlink targetting

Hyperlink targetting is not a property of the hyperlink, since the
content should be agnostic about the frameset.
It has to be a role of the frameset itself.

When the end-user clicks on a hyperlink, the click event bubbles up
through the nearest enclosing frame, parent frames, the frameset (i.e.
the <body>) and then to the document root.

Each frame may respond to the hyperlink with a target reference. (How
this lookup can be defined declaratively is not suggested). If it does
respond then the event is prevented from bubbling.

The target reference is used to find frames in the browser view by
their @name. Each of the found frames has its @src updated to match
the hyperlink and is reprocessed similarly to if it had just entered
the browser view. Updating the content of frames can cause descendant
frames to be removed from the view and new descendant frames to enter
the view.

If no frames respond to the hyperlink then conditionally the frameset
may respond. If the frameset can specify a target then processing is
the same as for frames AND the document.URL is updated to match the
hyperlink. Obviously this cannot occur if the hyperlink is to a
different site, in which case the frameset doesn't have the option to
respond and a normal browser navigation occurs.


### Landing page

Processing of the landing page is a special case of hyperlink
targetting. The frameset responds to the document.URL (which is that
of the landing-page) with a target reference. As frame declarations
enter the view, if they have a matching @name their @src is changed to
match the document.URL and processing is done as normal.


### Nested frames

Frames can be arbitrarily nested. When this is combined with document
transformation it makes dynamically loaded hierarchical-menus and
directory-trees trivial, for example:

A directory tree is split into several files, each containing one
sub-tree. A navigation section in the frameset has a frame-declaration
that sources the top level file of the directory tree. The frame's
frame-definition specifies a transform which converts sub-tree
*hyperlinks* into *frames* which source the sub-tree and apply the
same transform as for the top level.


### Conditional content

It is possible that some sub-trees of the rendered DOM are hidden. Any
frames that are enclosed by hidden sub-trees should not be fetched and
processed until they are visible (or about to be?).

This may allow multi-views and responsive-layout to be orthogonal to
the behavior of frames.
It is envisaged that custom-elements may also be appropriate to
declare these features.


Problems
----------

- Handling non-GET <form>s at the frameset-level (i.e. document.URL
would change) needs exploration.

- How complex should state-management be?

- How to do "hyperlink targetting" declaratively but flexibly?

- It would be nice to have something like XSLT that could be parsed in
HTML (and that more people liked)

- It would be nice to have a microdata / microformats parser and path language

- Your issues here...








On Wed, Apr 1, 2015 at 4:56 PM, Sean Hogan <shogun70@gmail.com> wrote:
> HTML framesets were the original single-page-application.
>
> Despite the flaws (mostly not being content-first), at least servers
> were emitting reasonably simple HTML including real hyperlinks and
> forms.
>
> What would framesets be like if we designed them today?
>
> In the linked video I make the case for a successor to framesets.
> It is 25 minutes but that is unavoidable.
>
>     https://youtu.be/qVdAc8_ppao
>
> The first half illustrates *why* this is important / better than alternatives,
> with actual demonstrations (which you should try for yourself to
> ensure I'm not cheating).
>
> The second half provides some insight into how I've approached this,
> again with demonstrations.
>
> I'll continue later with details of the differences / enhancements
> required to make the frameset concept live up to today's expectations.
>
> regards,
> Sean

Received on Thursday, 9 April 2015 16:17:56 UTC