<Glazblog/>

" Il est meilleur d'être irresponsable et dans le vrai que responsable et dans l'erreur " -- Winston Churchill

home
Disruptive Innovations
No comment
inFoRmatique

Tuesday 31 August 2010

Wysiwyg editing is hard #2, let's apply a larger font size

Let's say the user wants to use a larger font size on the LAST paragraph in the following example:

<style>
#section p { font-size: larger ! important}
.warning { color: red; border: thin solid red }
</style>
<div id="section">
<p>This is NOT a warning</p>
<p class="warning">This is a warning</p>
</div>

We're in a Wysiwyg environment, the user got the document from an unkown source, places the caret in the paragraph or selects the whole paragraph, click on some UI thingy meaning "I want a larger font" and he/she expects a larger font size for the paragraph, whatever has the editing tool to do for that... The user has no knowledge of the underlying technology - in our case CSS - and he/she's the perfect target for Wysiwyg editors. Let's suppose the editing tool manipulates stylesheets and hates HTML attributes and inline styles, and that's also our goal.

First thought and first problem, we cannot apply font-size: larger to the paragraph since it's already applied... But, wait, how do you know it's already applied? Just looking at the computed value of font-size, you can't since that will reply only an absolute value like 18px! So to determine if and how you can tweak a given property on a given element, you first need to browse all the CSS rules applying to your element. In Gecko, you can use the inIDOMUtils DOM Inspector interface and namely its getCSSStyleRules() method. Then for each rule applying to the element, you need to check if the property is applied to the element through that rule and if it is, compute the specificity of the selector and preserve the rule, the specificity of the rule and the priority (think !important) of the declaration in an array. When that's done for all rules, sort the array according to the CSS Cascade rules... Yep, that's right, you read it well, you need to recascade yourself the whole thing because the CSS Object Model has no getCascadedValue() method for the time being. Oh and of course, nothing either to compute the specificity of a given selector...

Once you have the cascaded the whole thing, you have the rule applying the current font-size to the element, its specificity and the priority of the declaration. Of course, there is a trivial case where no rule applies to the element for that property and your final data set is empty. 

Then the editing tool has no choice, it must create a rule with a specificity greater than or equal to the specificity of the rule we found and caring about the priority of the declaration...

  • If the data set above is empty or if the rule's specificity is equal to or less than the specificity of a class selector, AND IF the user says through some UI dialog we can safely apply the change to all <p class="warning">, then we can create a .warning { font-size: ...px } or .warning { font-size: ...px !important } rule at the end of our stylesheet where ... is a font-size value greater than the computed value of font-size on the element. Hey, yeah, you have to compute that value yourself again :-( We won't deal with the p.warning possibility because it's just impossible to show an average user a dialog asking for permission to change the styles applied to all paragraph of class warning and not other elements...
  • Else if the rule's specificity is equal to or less than the specificity of an #ID selector, we can safely insert a #myNewId { font-size: ...px }  or #myNewId { font-size: ...px ! important } at the end of our stylesheet but please note the editing tool has to query the user for an ID or select a random - and unreadable - one by itself. Of course, the font-size computation issue detailed just above still applies here.
  • Else if the rule's specificity is equal to or less than the specificity of an #ID selector and a type element selector, we can safely insert a p#myNewId { font-size: ...px } or p#myNewId { font-size: ...px ! important } at the end of our stylesheet. And the font-size computation and the ID UI query issues still apply here.
  • Else we have the most complex case: we need to prompt the user for an ID or find a random one and derive a rule from the selector of the rule we found above adding an ID simple selector to the last chain of simple selectors in the selector. In other terms in our case here, create #section p#myNewId { font-size: larger ! important} from #section p { font-size: larger ! important}.

Woof. Of course, the CSS Object Model's minimalistic interfaces don't help a lot here and the editing tool's author will end up writing a lot of code that is already implemented in the rendering engine, but not exposed. Welcome to my world :-)

Saturday 28 August 2010

Floating panels question

Now we have floating panels in Gecko, I hit a small issue : if two floating panels are visible on screen AND overlap, how do you raise the deepest in z-order??? There seems to be no method to raise a panel above the others. focus() does not help, moving the panel in its parent's child list hides the panel, I found no method for that in the interfaces. The only workaround I found is to hide and show again the panel but that introduces a bad flickering. Help !

Wednesday 25 August 2010

Firefox Panorama

I spent an hour testing the new Panorama (aka Tab Candy) in the last nightly of Firefox and I have a few thoughts to share about it:

  • it's not ironed yet (no tooltips, apparently low accessibility, tabgroup close buttons sometimes unresponsive at least on my Mac and w/o :hover effect) but hey that's a beta so no worries here; I loved the fact you have "magnetic lines" on the panorama viewport to make sure your groups nicely align.
  • this is not a criticism but I find pretty amazing that we're moving back to some kind of UI/UX Opera offered long ago on Windows with their MDI desktop browser. With real zoom being available in Gecko, the Panorama view could be live... I mean the current canvas screenshots could be real live zoomed-out browser and then we have almost MDI again.
  • no journalist noticed but the Panorama view is not a XUL view. It's based on HTML. It's one of the first times a major, shipped-in-the-browser and differenciating new feature of Firefox is entirely based on HTML from a UI perspective and not on XUL. This is very nice. Very nice but it has a bad side effect related to extensibility, because the current extensibility system in Mozilla (hear overlays) does not apply here. Creating then an add-on adding specific stuff to the Panorama view itself seems to be harder than expected.
  • at first glance, having the app suddenly turning into a big grey area w/o menubar or toolbars or decorations feels really weird. I really wondered if it was a bug. The next item proposes a way to fix that issue.
  • I think the UX could be improved in particular now we have canvas, CSS transitions and super powerful effects. The transition normalview-to-Panorama could be smoother with a better dissolution of menubar/toolbars and expansion of tabs into tab thumbnails ; probably requires a lot of work but would make the whole think better understandable, in particular the fact you see only one Tab Group at a time. Similarly, the panorama-to-normal transition is not smooth enough; that's partly because zooming from 0.1 to 1 blurs things a lot but that's also because reflows are not fluid enough and only one viewport expands and not the chrome. The selected tab could also expand while the rest of the Panorama view dissolves. Anyway, I'm just thinking out loud here but the fluidity of the whole thing can be improved and that would really help the user understand what's going on.
  • I do like the concept a lot. I have mixed feelings about it though because after an hour using it and having six Tab Groups set up, I ended up having too many times to go back to the Panorama View w/o really needing it. The Panorama View then becomes de facto a focal point of the application and I'm not sure this is desirable. This is a browser after all and Panorama is only, IMHO, a helper feature. It can sound like a minor comment but I don't think it is since Panorama drastically changes the gravity center of the whole app and this the kind of things average users are easily lost with. Here are a few ideas (again, thinking out loud here) to possibly fix that issue or at least decrease its importance (these ideas are not mutually exclusive):
    • add an option/UI allowing to directly cycle not only between the currently shown tabs but between tab groups (if it already exists, I did not find it, sorry)
    • offer the choice (hear a pref) between show-only-one-tab-group-in-normal-view and show-all-tabs-anyway-in-normal-view ; with the latter, Panorama is only a supplementary enhanced tab list not interfering with a browser behaviour users have been dealing with for years.

Thursday 19 August 2010

France.fr, soyons un peu geeks...

En bon amateur de palmipède sous toutes ses formes, gastronomiques et écrites, j'ai bien entendu pris un plaisir soutenu à la lecture du Canard Enchaîné d'hier et plus particulièrement de sa page 3 qui a sorti quelques chiffres croustillants sur le nouveau www.france.fr. Ayant visité la chose, et passée la première émotion de voir un pop-over ECRIT EN FLASH présentant des excuses pour le foirage majuscule du 14 juillet dernier, je me suis demandé ce que la bête avait dans le ventre. Editorialement je veux dire. Combien de contenus différents. Quelle masse d'information. Tout ça quoi...

Et comme je suis un bon geek qui se respecte, j'ai passé quelques minutes à écrire les outils automatisant tout ça :-)

Commençons par l'aspiration du site. Evidemment un petit coup de wget -m a largement suffi à obtenir une copie locale de france.fr. Pour faire bonne mesure, j'ai viré de cette copie-miroir les traductions anglaise, italienne, allemande et espagnole, et j'ai regardé uniquement les documents francophones. Oui, mais combien y en a-t-il ?

for i in `find . -type f`; do file $i; done|grep HTML |wc
404 1616 32929

Je n'y crois pas :-) Il y a 404 documents HTML :-) J'en ai explosé de rire, dites donc...

Pour déterminer, même approximativement, la taille du contenu utile de ces documents, j'en ai regardé quelques-uns pour trouver les éléments "maîtres", c'est-à-dire ceux contenant la partie réellement utile à l'usager sans tenir compte de la navigation et tout ça. J'ai donc écrit le bout de code suivant, que je fournis ici uniquement pour démontrer la méthodologie utilisée. Le tout est encapsulé dans une extension à Firefox écrite en 2 minutes pour la circonstance (je tiens le XPI à disposition de qui le souhaiterait).

var gUI = {};

// juste un utilitaire
function GetUIElements()
{
var elts = document.querySelectorAll("*[id]");
for (var i = 0; i < elts.length; i++)
{
var elt = elts.item(i);
gUI[ elt.getAttribute("id") ] = elt;
}
}

// le startup commence ici
function Startup()
{
GetUIElements();

// détecter la fin de chargement de chaque document
gUI.iframe.addEventListener("pageshow", onIframeLoaded, false);
// démarrer le chargement avec le premier document du tableau
LoadFranceFr();
}

var gIndex = 1;
var gLength = 0;

function LoadFranceFr()
{
gUI.iframe.setAttribute("src", "file:///Users/glazou/france.fr/www.france.fr/" + kDOCUMENTS[gIndex-1]);
}

function onIframeLoaded(aEvent)
{
var src = gUI.iframe.getAttribute("src");
var doc = gUI.iframe.contentDocument;

var articles_list = doc.getElementById("articles_list");
var article_wrapper = doc.querySelector(".article_wrapper");
var maincontent = doc.getElementById("main-content");

var contentElt = articles_list || article_wrapper || maincontent;
if (contentElt) {
var row = document.createElement("row");
row.setAttribute("align", "center");
var label0 = document.createElement("label");
label0.setAttribute("value", gIndex);
var label1 = document.createElement("label");
label1.setAttribute("value", src.substr(src.lastIndexOf("/") +1));
var label2 = document.createElement("label");
var length = contentElt.textContent.length;
label2.setAttribute("value", length);
row.appendChild(label0);
row.appendChild(label1);
row.appendChild(label2);
gUI.summaryRows.insertBefore(row, gUI.summaryRows.firstChild);

gLength += length;
gUI.totalLabel.setAttribute("value", gLength);
}
else {
var row = document.createElement("row");
row.setAttribute("align", "center");
row.className = "wrong";
var label0 = document.createElement("label");
label0.setAttribute("value", gIndex);
var label1 = document.createElement("label");
label1.setAttribute("value", src.substr(src.lastIndexOf("/") +1));
var label2 = document.createElement("label");
label2.setAttribute("value", "");
row.appendChild(label0);
row.appendChild(label1);
row.appendChild(label2);
gUI.summaryRows.insertBefore(row, gUI.summaryRows.firstChild);
}

gIndex++;
if (gIndex < kDOCUMENTS.length)
LoadFranceFr();
}

Dans ce code, kDOCUMENTS est un tableau dont les éléments sont les URLs locaux des 404 documents pré-cités. Le code ci-dessus va charger chaque document dans un iframe XUL, attendre patiemment que ce chargement soit effectué, trouver le contenu utile, déterminer sa taille par un elt.textContent.length (oui je sais c'est très généreux, ça compte des flopées d'espaces), agréger les résultats et passer au document suivant tant qu'il y en a. Et voila le résultat :

France.fr sink

Bien entendu, mes chiffres sont des approximations, un ordre de magnitude. On pourra toujours arguer du fait qu'il y a un peu de contenu dans les barres de navigation ou a contrario qu'il y a des listes de liens redondantes avec la navigation dans le contenu utile. Quoiqu'il en soit, www.france.fr c'est donc en gros 400 documents totalisant environ 520 000 caractères.

Si les chiffres du Canard Enchaîné sont exacts - et je ne doute pas qu'ils le soient - www.france.fr est donc pour 4 000 000€ un des sites les plus chers de France depuis la création du Web. Chaque document unique du site aura in fine coûté 10 000€ (hors traductions) ! Chaque caractère utile du site aura lui coûté presque 7,70€ (hors traductions également). (Nota bene: tout cela est sous réserve du bon fonctionnement de mon aspiration du site ; si les chiffres réels peuvent être un peu différents, l'ordre de magnitude lui ne saurait énormément varier)

Encore bravo au SIG, Service d'Information du Gouvernement, et son patron Thierry Saussez. Mes plus chaleureuses et sincères félicitations aux prestataires qui sont intervenus pour eux. C'est du Grand Art, des deux côtés.

Monday 16 August 2010

Fifteen

Today, Microsoft Internet Explorer is precisely 15 years old. Wooooohooo !!!!

He's really Woerth it...

Nom de Zeus... Ce ne sont plus des casseroles, c'est la batterie de cuisine au grand complet !

Thursday 12 August 2010

Le grand foutoir du site de la Présidence tournante de l'Union Européenne...

année
URL
Langues
2005 www.eu2005.lu 2
2006 www.eu2005.at
www.eu2006.fi
3
2
2007 www.eu2007.de
www.eu2007.pt (serveur en rade)
3
-
2008 www.eu2008.si
www.eu2008.fr
3
6
2009 www.eu2009.cz
www.se2009.eu
3
3
2010 www.eu2010.es
www.eutrio.be
6 (dont catalan, basque et gallego...)
4

Sans commentaire...

Monday 9 August 2010

developer.mozilla.org

It's now the seventh day in a row that Search on developer.mozilla.org is horked. And since I came back seven days ago from my summer vacation, it could be even older than that... So to search on devmo, I now have to ask Google for "MDC %s" where %s is my query and the results are not always optimal :-( Urgh.

Friday 6 August 2010

Wysiwyg editing is hard #1

You probably never asked yourself about it, but how complicated is the deletion of the selection in a markup-based Wysiwyg editor? In one single word: complicated.... I will try below to make you understand what a Wysiwyg markup-based editor does when you hit the delete key.

Let's take a simple example :

<h1>aa[aa</h1>
<ul>
<li>bbbb
   <ul>
     <li>cc]cc</li>
     <li>dddd</li>
   </ul>
</li>
<li>eeee</li>
</ul>

The selection is everything between the square brackets (included). Now the user hits the delete key. The natural algo for that is the following one (I'm not saying it's the only one; see DOMRange.extractContents to see another one):

  1. find all the "visible" nodes in the various ranges (here we have only one range) of the selection. A "visible" node is a text node or an empty element.
  2. split the start and end nodes of each range of the selection if necessary, for instance if these nodes are text nodes and the selection splits the nodes in two nodes of non-zero length.
  3. for each visible node in each range of the selection, remove the node and remove recursively all the parents if they are "removable". A "removable" parent is an empty element or, depending on its tag name, an element containing only text nodes made of whitespaces (/s in regexps); some elements are explicitely not "removable", body for instance.

This method is enough for the test case above and here's the expected result:

<h1>aa</h1>
<ul>
<li>
   <ul>
     <li>cc</li>
     <li>dddd</li>
   </ul>
 </li>
<li>eeee</li>
</ul>

But now imagine we have some markup that requires merging after the deletion of the selection. Here's one:

<ul>
<li>aaaa</li>
<li>bb[bb</li>
</ul>
<ul>
<li>cc]cc</li>
<li>dddd</li>
</ul>

What the user really expects here when the selection is deleted is the merging of the two ULs into one single list. We need then to improve a bit our algo above...

  1. find all the "visible" nodes in the various ranges (here we have only one range) of the selection. A "visible" node is a text node or an empty element.
  2. split the start and end nodes of each range of the selection if necessary, for instance if these nodes are text nodes and the selection splits the nodes in two nodes of non-zero length.
  3. traverse all ranges in our selection and preserve a list of all nodes traversed with the traversal direction (start, up, down, next)
Let's have an example here, and let's reuse the first example at the top of this article wih a h1 followed by a ul. The list of traversed nodes is then:
node
direction
"aa"
start
h1
up
ul
next
li
down
"bbbb"
down
ul
next
li
down
"cc"
down

For our examples of two adjacent lists, the list of traversed nodes is:

node
direction
"bb"
start
li
up
ul
up
ul
next
li
down
"cc"
down

But that's not all... There can be non-significant text nodes in the DOM between elements, like a carriage return between the two ULs. So to make sure we correctly merge during our deletion, the third step of our algo should be this one:

  1. for each node being an element and having a direction "next" in the list of traversed nodes above, find the previous "visible" sibling, discarding text nodes containing only white spaces if the element is a block. If the previous visible sibling is also an element and of same type than the reference node, and if these elements are "mergeable", then append all the children of the reference node to the previous visible node's children and delete the reference node. Two "mergeable" elements are for instance two paragraphs, or two h1 elements, or two dl elements; two inline text elements like span or strong are also mergable if

The rest of the algo is similar to what we did for the h1/ul example above:

  1. for each visible node in each range of the selection, remove the node and remove recursively all the parents if they are "removable". A "removable" parent is an empty element or, depending on its tag name, an element containing only text nodes made of whitespaces (/s in regexps); some elements are explicitelynot "removable", body for instance.
And then result is:
<ul>
<li>aaaa</li>
<li>bb</li>
<li>cc</li>
<li>dddd</li>
</ul>

Next time, we'll dive into some high-level functions like indentations or list creation.

Thursday 5 August 2010

Idée de caricature

Sarkozy, Hortefeux et Lefebvre discutent. Sarkozy dit "Le Conseil Constitutionnel va censurer car tous les français sont égaux", Hortefeux surenchérit "Encore un coup de Chirac..." pendant que Lefebvre a un geste à la Eureka! et dit "il faut donc restreindre la déchéance aux non-français !".

Saturday 31 July 2010

Scanner de négatifs Silvercrest

De passage dans le LIDL à côté de chez moi, je suis tombé sur un scanner de négatifs de la marque SilverCrest (une LIDLerie) à 39.99€. Comme LIDL ne fait aucune difficulté pour rembourser sous une semaine si on n'est pas content d'un produit et et comme j'ai des milliers de négatifs en souffrance, je me suis laissé tenter.

Installation très simple, logiciel plutôt simple à utiliser même s'il n'est pas beau. Ne marche que sous Windaube et pas Mac OS X mais bon, à ce prix-là... Tout ce qu'il faut pour les néga et les diapos. Mais malgré toutes mes tentatives de réglages, le scan génère des lignes sombres horizontales franchement pénibles et rendant le scanner peu utilisable. J'ai donc demandé le remboursement du produit, que je ne recommande à personne malgré son prix fort attractif. Voila.

Tuesday 27 July 2010

Halte au politiquement correct de la Sarkozie

Je suis rentré en région parisienne depuis 48h que j'en ai déjà marre de Sarko et ses sbires et surtout de leur impact sur notre vie quotidienne... Résumons un peu :

  • un braqueur sur-armé et portant gilet pare-balles prend les poulets pour cible avec du gros calibre
  • ceux-ci, ne goutant que fort peu la cuisine au plomb, répliquent
  • le braqueur prend un bastos dans une des rares zones non protégées de son corps, la tête, et ça lui est un peu fatal...
  • le quartier d'origine du braqueur s'enflamme, on tire à de multiples reprises sur les poulets, on met même un contrat sur eux

On croit rêver tout de même... Un braqueur chevronné se fait buter en pleine action violente et son quartier se rebelle ? Là, Hortefeux et Sarko sont bien gentils, peut-être trop gentils, parce que j'ai la très nette impression que le sentiment général de la population est plutôt "faites encercler le quartier par les FuMaCo, les dragons parachutistes et le GIGN et videz-le à coups de trique". Que l'approbation serait générale si une opération de très grosse envergure visait ce quartier. Comment donc la République a-t-elle pu en arriver là, laisser de telles zones de non-droit total se développer ?

Mais dans le même temps, Hortefeux et Sarkozy continuent à se prendre les pieds dans le plat en se mêlant de choses qu'ils feraient bien de laisser passer, pour ne pas dire laisser pisser :

  • une des pubs actuelles pour les volailles de Loué montre un flic seul et souriant, en tenue ancienne à képi, avec la mention "Poulet de Loué élevé en liberté" et un tas d'autres flics plutôt stressés sortant de l'arrière d'un véhicule type panier-à-salade avec la mention "d'autres poulets". La légende générale est 'Un bon poulet est un poulet libre". L'image est plutôt marrante, pas vulgaire, pas dénigrante. On sourit, mais on ne se moque pas. Rien à dire.
  • cela fait DES SIECLES que la police (de Paris d'abord, de l'ensemble du pays ensuite) est surnommée "les poulets" parce que la Préfecture de Police de Paris est construite sur le très ancien marché à la volaille de la capitale
  • des dizaines de bouquins, dont ceux de Frédéric Dard, ont fait des milliers de jeux de mots parfois douteux sur la maison Poulaga et les Poulets. Audiard et consorts ont consommé du Poulet à haute dose.
  • mais non, le Ministre et ses Poulets râlent !?!?

En Sarkozye, l'humour n'a plus droit de citer, et Desproges aurait été embastillé avec Le Luron. Sous couvert d'un focus sécuritaire, la satire devient un exercice mis à l'index. L'humour pas méchant est désormais tout simplement déplacé. Comme une poupée vaudou, quoi. La Police de la Pensée n'est pas loin et cela me révulse.

Stop !

Monday 26 July 2010

Zoé Shepard

Je viens de dévorer en une journée "Absolument dé-bor-dée !" de Zoé Shepard et je dois dire que j'ai adoré. Tout d'abord j'ai beaucoup ri. J'ai fortement apprécié le rapport de whistleblower sans concession (si ce n'est les changements de noms). Le tableau qu'elle brosse est effarant, consternifiant dirait Tristant Nitot, pire que celui que Corinne Maier ou moi-même avons pu dresser de la R&D d'Electricité de France. Je recommande chaleureusement ce livre, ne serait-ce que pour aider un peu l'auteur qui risque une suspension de deux ans sans solde par le Conseil Régional d'Aquitaine (encore qu'il semble qu'une suspension de ce type aussi longue soit illégale).

Un détail important : Zoé Shepard et son livre seraient probablement passés inaperçus sans la connerie sans limite de son employeur. Comme dans le cas de "Bonjour Paresse" de Corinne Maier, c'est l'énorme publicité offerte par l'action légale contre l'auteur qui a assuré son succés. Encore bravo au responsable de la communication et au président du conseil régional d'Aquitaine pour une décision non seulement complètement con mais surtout contre-productive. Félicitations à l'éditeur de Zoé Shepard qui a du se dire qu'avec des andouilles de cet acabit, la plainte était garantie et donc la pub avec.

Wednesday 30 June 2010

La meilleure de l'année

Because I'm Woerth it

source : @kwyxz

France Inter demain matin

Je serai l'invité de Guillaume Erner demain matin à 9h00 dans son émission en direct sur France Inter. Sujet : Apple... Les podcasts sont en général disponibles après l'émission.

Premier Atelier Git Attitude samedi 10/07/2010 à Paris

Je crois que le titre dit tout ; c'est vraiment pas cher, c'est utile, c'est bô, chaque inscription sauve un bébé phoque. Foncez-y.

Utilise ça...

Utilise.ca m'a fait l'honneur de m'interviewer récemment. C'est en ligne depuis quelques minutes.

/bin/sleep

Comments are closed for three weeks on the glazblog.

Tuesday 29 June 2010

An Update on CSS 2.1

So where are we (that "we" meaning the CSS Working Group) on CSS 2.1? In short, we're making fast and excellent progress:

  • we are currently resolving the last outstanding issues ; almost all our weekly conference calls are entirely dedicated to CSS 2.1
  • the Test Suite is near completion ; the Working Group has decided, given the size of the Test Suite, that it's not realistic to review individually all tests before saying the Test Suite is completed. We will declare the Test Suite ready for implementation reports and will fix individual bugs when reported buggy by testers, browser vendors, the community, whoever. On a more personal note, I think it's the only reasonable way of dealing with a Test Suite that contains thousands and thousands of tests, some of them rather complex not only to write but also to understand when you read them. Otherwise, the review and validation process of all these tests alone will take ages...
  • given the recent changes in the spec - we resolved a lot of issues some of them pretty complicated - we may have to go back to Last Call Working Draft and then back to CR again. That's not a problem and can be relatively fast.
  • the current CR exit criteria - that we don't plan to change - are very clear (see conditions 4 and 5). The CR period could be a bit long though; we'll see.
  • the Test Suite and the CR should be available at same time and that time should be, as planned by the WG, after the summer. That should leave us enough time to reach Proposed Recommendation before the end of the year, as expected.

To the people who could complain about the duration of this process and the time needed to make this spec appear as a REC, let me say that we have a lot, really a lot of work here. The WG focuses almost solely on CSS 2.1 at this time and that's not recent. 2.1 must be released as a Web Standard because that's one of the current cornerstones of the architecture of the World Wide Web. We cannot make the next steps, CSS 3 even module by module, happen without 2.1 before.

In summary, we're on track. As expected. No reason to worry.

Thanks.

Daniel Glazman, W3C CSS Working Group, Co-chair

Update: reposted on W3C blog.

Dream...

If there is a browser feature I would like to see appear some day, it's the following one: when I want to listen to a radio or watch a TV channel that reflects real-time its broadcast through a flash plugin in a web page (for example http://france-info.com/), I need to keep the browser running and a tab for that page. I'd love to see a trivial UI way to "detach" the running flash player and make it a totally independent (and of course closeable) window...

- page 1 of 258