Merge lp:~wallyworld/launchpad/inline-picker-underscore-1005324 into lp:launchpad

Proposed by Ian Booth
Status: Merged
Approved by: Curtis Hovey
Approved revision: no longer in the source branch.
Merged at revision: 15340
Proposed branch: lp:~wallyworld/launchpad/inline-picker-underscore-1005324
Merge into: lp:launchpad
Diff against target: 699 lines (+76/-108)
37 files modified
lib/canonical/launchpad/icing/css/typography.css (+4/-0)
lib/lp/app/browser/tales.py (+3/-4)
lib/lp/app/doc/lazr-js-widgets.txt (+2/-2)
lib/lp/app/doc/tales.txt (+4/-4)
lib/lp/app/javascript/formwidgets/formwidgets.js (+1/-1)
lib/lp/app/javascript/inlineedit/assets/editor-core.css (+0/-21)
lib/lp/app/templates/base-layout-macros.pt (+5/-0)
lib/lp/app/templates/inline-multicheckbox-widget.pt (+1/-1)
lib/lp/app/templates/inline-picker.pt (+2/-4)
lib/lp/app/templates/launchpad-form.pt (+6/-9)
lib/lp/app/templates/launchpad-inline-icon-link.pt (+2/-2)
lib/lp/blueprints/templates/specification-index.pt (+2/-2)
lib/lp/bugs/browser/tests/test_bugtask.py (+1/-1)
lib/lp/bugs/javascript/bugtask_index.js (+4/-3)
lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt (+1/-1)
lib/lp/bugs/templates/bugcomment-macros.pt (+1/-1)
lib/lp/bugs/templates/bugtask-choose-affected-product.pt (+1/-2)
lib/lp/bugs/templates/bugtask-index.pt (+4/-4)
lib/lp/bugs/templates/bugtasks-and-nominations-portal.pt (+1/-3)
lib/lp/code/templates/branch-recipes.pt (+2/-3)
lib/lp/code/templates/branch-related-bugs-specs.pt (+1/-1)
lib/lp/code/templates/sourcepackagerecipe-index.pt (+2/-3)
lib/lp/registry/javascript/sharing/shareetable.js (+3/-3)
lib/lp/registry/javascript/sharing/sharingdetails.js (+3/-5)
lib/lp/registry/javascript/structural-subscription.js (+1/-3)
lib/lp/registry/templates/distributionsourcepackage-index.pt (+1/-3)
lib/lp/registry/templates/distroseries-add.pt (+2/-3)
lib/lp/registry/templates/distroseries-initialize.pt (+3/-3)
lib/lp/registry/templates/milestone-index.pt (+1/-1)
lib/lp/registry/templates/milestone-tag-search.pt (+2/-3)
lib/lp/registry/templates/person-editpgpkeys.pt (+1/-1)
lib/lp/registry/templates/person-editsshkeys.pt (+1/-1)
lib/lp/registry/templates/person-macros.pt (+1/-1)
lib/lp/registry/templates/person-portlet-contact-details.pt (+4/-4)
lib/lp/registry/templates/person-upcomingwork.pt (+1/-1)
lib/lp/registry/templates/team-editproposed.pt (+1/-1)
lib/lp/soyuz/stories/distribution/xx-distribution-packages.txt (+1/-3)
To merge this branch: bzr merge lp:~wallyworld/launchpad/inline-picker-underscore-1005324
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+107702@code.launchpad.net

Commit message

Adjust css so that hovering over picker activation icon doesn't show an underscore.

Description of the change

The picker activation icons were showing an underscore when hovered over. This was because a   had been added in various places to ensure the sprite icons show, since in some browsers the icons are not rendered if the anchor tag is empty.

== Implementation ==

I added css to suppress the underscore for any links the are marked as sprites.

I also fixed the issue in Opera where by the inline text editor activation icon had a funny Unicode char next to it. It turns out this was an attempt in the old lazr js library to get around the icon rendering issue for empty anchors. I replaced the Unicode char used with a   like what is used everywhere else.

== QA ==

I tested in Opera, Chrome, Firefox, Konquerer.

Konquerer did not show icons for *anything* - not menu portal links, not person links, nothing. So the work in this branch fixes everything for all other browsers but Konquerer still has issues all over the place, not just in the areas covered by this branch. I'm not sure what its problem is.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

Hi Ian.

I need to think about this. Your CSS change removed the underlines from menu links, it is not clear that text with icons are links. I do not want to solve the issue this way. We really want to remove the false content.

Konqueror is broken by bug 521219; the sprite image is physically too tall to render. I think we want to test which browsers require content in the sprite. We know this affected khtml and older webkits. Maybe we can use YUI to add a CSS class to the body element. when only activates the CSS rule you deleted See http://developer.yahoo.com/yui/3/api/UA.html#property_webkit
    Y.UA.webkit === 1

review: Needs Fixing (code)
Revision history for this message
Curtis Hovey (sinzui) wrote :

I think I have this content hack isolated to a specific range of webkit that allows us to remove the nbsp hacks from a lot of templates.

This is the script that must be executed on every page to identify the problem engine:
    if (Y.UA.Webkit > 0 Y.UA.webkit < 533) {
        Y.one('body').addClass('old-webkit');
    }

This is the CSS rule that added a the nbsp to old-webkit
    body.old-webkit .sprite {
        content: "\00A0";
        }

We then delete about 40 &nbsp; we inserted into anchors in pt, js, and py

Revision history for this message
Ian Booth (wallyworld) wrote :

I have added the required css and webkit version check to set the body style.

I have removed some nbsp from anchors with "spite edit" classes. However, anchors which exist to provide popup help still require the nbsp to be used for reasons I don't understand.

eg from bugtask-index.pt

<a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe">
  &nbsp;
  <span class="invisible-link">Tag help</span>
</a>

If I remove the nbsp, the 'maybe' sprite does not render. I do not know why. I guess if we figure out what to do the nbsp can be removed in a subsequent branch.

Revision history for this message
Ian Booth (wallyworld) wrote :

I should say the help icon issue in the above comment only occurs in Chrome, not Firefox.

Revision history for this message
Curtis Hovey (sinzui) wrote :

I am going to merge an look into this help issue. My local test on chromium does not show this. In fact, the markup you show has leading and trailing white-space that do take up space.

Revision history for this message
Curtis Hovey (sinzui) wrote :

I've sussed it! The space is collapsed when white-space is processed is normalised. This works:

This fails because there is white-space after the open tag and before the close tag that needs normalisation:
    <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe">
    <span class="invisible-link">Tag help</span>
    </a>

This works:
    <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe"><span class="invisible-link">Tag help</span></a>

As does this:
    <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe"
      ><span class="invisible-link">Tag help</span></a>

The anchor you are working with does not conform to Lp style. We know that browsers do not handle white-space normalisation consistently...webkit is closest to the standard because leading and trailing spaces are supposed to be stripped. Yet this phase causes reallocation of space that ignore the padding rule :(

Revision history for this message
Curtis Hovey (sinzui) wrote :
Download full text (3.4 KiB)

Hi Ian.

I think I have found most of the lines that need investigation and updating. As above, the rule is to ensure there are no spaces in the anchor tag.

./lib/lp/app/templates/inline-picker.pt
      18: class="sprite maybe">&nbsp;
./lib/lp/app/browser/tales.py
     886: '<span class="sprite %(icon)s">&nbsp;'
     912: '<a href="%s" alt="%s" title="%s" class="%s">&nbsp;</a>')
./lib/lp/app/doc/tales.txt
     215: <span class="sprite no">&nbsp;<span
     219: <span class="sprite no">&nbsp;<span
     223: <span class="sprite yes">&nbsp;<span
     227: <span class="sprite yes">&nbsp;<span
./lib/lp/app/javascript/choice.js
      65: '<a href="#"><img class="sprite edit editicon"/>&nbsp;</a></span>'
./lib/lp/app/javascript/formwidgets/formwidgets.js
     121: 'target="help" class="sprite maybe">&nbsp;' +
./lib/lp/registry/templates/person-upcomingwork.pt
      92: <a href="#" class="expander">&nbsp;</a>
./lib/lp/bugs/javascript/bugtask_index.js
     125: '<span class="invisible-link">edit</span>&nbsp;</a>');
./lib/lp/bugs/templates/bugtasks-and-nominations-portal.pt
      78: class="sprite maybe">&nbsp;
./lib/lp/bugs/templates/bugtask-choose-affected-product.pt
      23: class="sprite maybe">&nbsp;<span class="invisible-link">(?)</span>
./lib/lp/bugs/templates/bugtask-index.pt
     169: <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe">&nbsp;
./lib/lp/bugs/templates/bugcomment-macros.pt
      60: <span class="sprite arrowRight">&nbsp;</span>
./lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt
     229: title="Linked to milestone 3.1" class="sprite milestone">&nbsp;</a>
./lib/lp/registry/templates/person-macros.pt
      68: target="help">&nbsp;</a>
./lib/lp/registry/templates/person-portlet-contact-details.pt
      75: <a target="help" href="/+help-registry/openid.html" class="sprite maybe">&nbsp;
     186: <a target="help" href="/+help-registry/karma.html" class="sprite maybe">&nbsp;
./lib/lp/registry/templates/distroseries-initialize.pt
      20: target="help" class="sprite maybe">&nbsp;
./lib/lp/registry/javascript/sharing/shareetable.js
     162: ' data-person_name="{{display_name}}">&nbsp;</a>',
     168: ' data-person_name="{{display_name}}">&nbsp;</a>',
     205: ' <a class="editicon sprite edit" href="#">&nbsp;</a>',
./lib/lp/registry/javascript/sharing/sharingdetails.js
     284: ' <span class="sprite bug-{{bug_importance}}">&nbsp;</span>',
     296: ' &nbsp;</a>',
     323: ' &nbsp;</a>',
./lib/lp/blueprints/templates/specification-index.pt
     287: <a href="/+help-blueprints/workitems-help.html" target="help" class="sprite maybe">&nbsp;
./lib/lp/app/templates/launchpad-form.pt
     110: &nbsp;<span class="invisible-link">(?)</span>
     132: &nbsp;<span class="invisible-link">(?)</span>
     152: &nbsp;<span class="invisible-link">(?)</span>
./lib/lp/code/templates/branch-recipes.pt
      24: &nbsp;<span class="invisible-link">Tag help</span>
./lib/lp/code/templates/sourcepackagerecipe-index.pt
      87: &nbsp;<span class="invisible-link">Tag help</span>
./lib/lp/registry/templates/distroseries-add.pt
      15: &nbsp;<span class="invisible-link">(?)</span>
./lib/lp/registry/t...

Read more...

Revision history for this message
Curtis Hovey (sinzui) wrote :

BTW, Since I think we now understand the issue, the remaining changes are trivial. I am approving this.

review: Approve (code)
Revision history for this message
Ian Booth (wallyworld) wrote :

I have found and fixed another problem that appears in Chrome. The issue still causes the anchor icon not be be rendered but appears (to me) to have a lightly different root cause. And it affects lp in production right now swo has been a long standing issue in Chrome AFAICT.

The milestone index page as some text "Yes. Drivers can target bugs and blueprints to this milestone." which is supposed to have an Edit icon next to it. The edit icon is not rendered. The TAL is:

      <dd>
        <tal:yes condition="context/active">
          Yes. Drivers can target bugs and blueprints to this milestone.
        </tal:yes>
        <tal:no condition="not: context/active">
          No. Drivers cannot target bugs and blueprints to this milestone.
        </tal:no>
        &nbsp; <a tal:replace="structure milestone_menu/edit/fmt:icon" />
      </dd>

The issue turned out to be the extra ' ' between the &nbsp; and the "<a..."
The &nbsp; is used to separate the icon a little from the text it is next too. But the extra ' ' caused the icon not to render. I am not sure why.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/canonical/launchpad/icing/css/typography.css'
2--- lib/canonical/launchpad/icing/css/typography.css 2012-03-10 15:33:33 +0000
3+++ lib/canonical/launchpad/icing/css/typography.css 2012-05-31 07:22:20 +0000
4@@ -87,6 +87,10 @@
5 /* No border on images that are links. */
6 border: none;
7 }
8+body.old-webkit .sprite a.expander {
9+ /* Old webkit browsers require a nbsp so sprites render. */
10+ content: "\00A0";
11+ }
12 abbr[title], acronym[title] {
13 border-bottom: 1px dotted black;
14 cursor: help;
15
16=== modified file 'lib/lp/app/browser/tales.py'
17--- lib/lp/app/browser/tales.py 2012-05-18 22:04:13 +0000
18+++ lib/lp/app/browser/tales.py 2012-05-31 07:22:20 +0000
19@@ -672,7 +672,6 @@
20 css_classes.add('global-notification-visible')
21 return ' '.join(list(css_classes))
22
23-
24 def _getSaneBreadcrumbDetail(self, breadcrumb):
25 text = breadcrumb.detail
26 if len(text) > 64:
27@@ -883,7 +882,7 @@
28 else:
29 icon = 'no'
30 markup = (
31- '<span class="sprite %(icon)s">&nbsp;'
32+ '<span class="sprite %(icon)s">'
33 '<span class="invisible-link">%(icon)s</span></span>')
34 return markup % dict(icon=icon)
35
36@@ -906,10 +905,10 @@
37 ])
38
39 icon_template = (
40- '<span alt="%s" title="%s" class="%s">&nbsp;</span>')
41+ '<span alt="%s" title="%s" class="%s"></span>')
42
43 linked_icon_template = (
44- '<a href="%s" alt="%s" title="%s" class="%s">&nbsp;</a>')
45+ '<a href="%s" alt="%s" title="%s" class="%s"></a>')
46
47 def traverse(self, name, furtherPath):
48 """Special-case traversal for icons with an optional rootsite."""
49
50=== modified file 'lib/lp/app/doc/lazr-js-widgets.txt'
51--- lib/lp/app/doc/lazr-js-widgets.txt 2012-05-12 12:32:21 +0000
52+++ lib/lp/app/doc/lazr-js-widgets.txt 2012-05-31 07:22:20 +0000
53@@ -266,7 +266,7 @@
54 <span>
55 <a class="sprite edit lazr-btn yui3-activator-act"
56 href="http://launchpad.dev/widget/+edit"
57- title="">&nbsp;<span class="invisible-link">Edit</span></a>
58+ title=""><span class="invisible-link">Edit</span></a>
59 <div class="yui3-activator-message-box yui3-activator-hidden"></div>
60 </span> ...
61
62@@ -473,7 +473,7 @@
63 <a class="sprite edit lazr-btn yui3-activator-act"
64 href="http://code.launchpad.dev/~eric/+recipe/cake_recipe/+edit"
65 id="edit-distroseries-btn"
66- title="">&nbsp;<span class="invisible-link">Edit</span></a>
67+ title=""><span class="invisible-link">Edit</span></a>
68 </dt>
69 <span class="yui3-activator-data-box">
70 <dl id='edit-distroseries-items'>
71
72=== modified file 'lib/lp/app/doc/tales.txt'
73--- lib/lp/app/doc/tales.txt 2012-05-22 17:00:08 +0000
74+++ lib/lp/app/doc/tales.txt 2012-05-31 07:22:20 +0000
75@@ -212,19 +212,19 @@
76 All objects can be represented as a boolean icon.
77
78 >>> print test_tales("context/image:boolean", context=None)
79- <span class="sprite no">&nbsp;<span
80+ <span class="sprite no"><span
81 class="invisible-link">no</span></span>
82
83 >>> print test_tales("context/image:boolean", context=False)
84- <span class="sprite no">&nbsp;<span
85+ <span class="sprite no"><span
86 class="invisible-link">no</span></span>
87
88 >>> print test_tales("context/image:boolean", context=object())
89- <span class="sprite yes">&nbsp;<span
90+ <span class="sprite yes"><span
91 class="invisible-link">yes</span></span>
92
93 >>> print test_tales("context/image:boolean", context=True)
94- <span class="sprite yes">&nbsp;<span
95+ <span class="sprite yes"><span
96 class="invisible-link">yes</span></span>
97
98
99
100=== modified file 'lib/lp/app/javascript/formwidgets/formwidgets.js'
101--- lib/lp/app/javascript/formwidgets/formwidgets.js 2011-11-08 16:35:11 +0000
102+++ lib/lp/app/javascript/formwidgets/formwidgets.js 2012-05-31 07:22:20 +0000
103@@ -118,7 +118,7 @@
104 this.labelNode = Y.Node.create("<label />");
105 this.helpNode = Y.Node.create(('<span class="helper unseen">'+
106 '&nbsp;<a href=""' +
107- 'target="help" class="sprite maybe">&nbsp;' +
108+ 'target="help" class="sprite maybe">' +
109 '<span class="invisible-link"></span></a></span>'));
110 this.fieldNode = Y.Node.create("<div></div>");
111 this.descriptionNode = Y.Node.create('<p class="formHelp" />');
112
113=== modified file 'lib/lp/app/javascript/inlineedit/assets/editor-core.css'
114--- lib/lp/app/javascript/inlineedit/assets/editor-core.css 2011-12-21 07:54:40 +0000
115+++ lib/lp/app/javascript/inlineedit/assets/editor-core.css 2012-05-31 07:22:20 +0000
116@@ -22,24 +22,3 @@
117 .yui3-ieditor-input textarea:focus {
118 outline: none;
119 }
120-
121-/* Konqueror doesn't render the multiline editor's button if there's
122- * no apparent content in it (the sprite we use is a background image).
123- * This bit of CSS is meaningless; it sets the edit link's content to
124- * a zero-width non-joiner (an invisible, odorless Unicode character).
125- *
126- * Browsers should ignore the content attribute for :link and :visited
127- * pseudo-classes, but Konqueror doesn't. Setting non-empty text
128- * content here tricks it into rendering the button.
129- *
130- * Other things we tried instead of this hack:
131- * - Insert an HTML comment in the <a>. No effect.
132- * - Insert a &nbsp; in the <a>. No effect.
133- * - Insert whitespace in the <a>. No effect.
134- * - Insert a span or div in the <a>. No effect.
135- * - Use a regular <img> tag instead of a sprite. Ugly in all browsers.
136- * - Set the content to ".". Ugly in Konqueror.
137- */
138-.yui3-editable_text-trigger:link, .yui3-editable_text-trigger:visited {
139- content: "\200c";
140-}
141
142=== modified file 'lib/lp/app/templates/base-layout-macros.pt'
143--- lib/lp/app/templates/base-layout-macros.pt 2012-05-15 17:17:34 +0000
144+++ lib/lp/app/templates/base-layout-macros.pt 2012-05-31 07:22:20 +0000
145@@ -151,6 +151,7 @@
146 <metal:load-lavascript use-macro="context/@@+base-layout-macros/load-javascript" />
147
148 <script id="base-layout-load-scripts" type="text/javascript">
149+ //<![CDATA[
150 LPJS.use('base', 'node', 'console', 'event',
151 'oop', 'lp', 'lp.app.banner.privacy',
152 'lp.app.banner.beta', 'lp.app.foldables','lp.app.sorttable',
153@@ -164,6 +165,9 @@
154 banner = Y.lp.app.banner.privacy.getPrivacyBanner();
155 banner.show();
156 }
157+ if (Y.UA.webkit > 0 && Y.UA.webkit < 533) {
158+ Y.one(document.body).addClass('old-webkit');
159+ }
160 Y.lp.app.banner.beta.show_beta_if_needed();
161 Y.lp.app.sorttable.SortTable.init();
162 Y.lp.app.inlinehelp.init_help();
163@@ -184,6 +188,7 @@
164 window.location = e.new_value;
165 });
166 });
167+ //]]>
168 </script>
169 <script id="base-helper-functions" type="text/javascript">
170 //<![CDATA[
171
172=== modified file 'lib/lp/app/templates/inline-multicheckbox-widget.pt'
173--- lib/lp/app/templates/inline-multicheckbox-widget.pt 2012-05-12 03:19:06 +0000
174+++ lib/lp/app/templates/inline-multicheckbox-widget.pt 2012-05-31 07:22:20 +0000
175@@ -11,7 +11,7 @@
176 href view/edit_url;
177 title view/edit_title"
178 class="sprite edit lazr-btn yui3-activator-act"
179- >&nbsp;<span class="invisible-link">Edit</span></a>
180+ ><span class="invisible-link">Edit</span></a>
181 </tal:has_choices>
182 <tal:label-close-tag replace="structure view/label_close_tag"/>
183 <span class="yui3-activator-data-box">
184
185=== modified file 'lib/lp/app/templates/inline-picker.pt'
186--- lib/lp/app/templates/inline-picker.pt 2012-04-25 18:17:08 +0000
187+++ lib/lp/app/templates/inline-picker.pt 2012-05-31 07:22:20 +0000
188@@ -10,14 +10,12 @@
189 <a tal:attributes="href view/edit_url;
190 title view/edit_title"
191 class="sprite edit lazr-btn yui3-activator-act"
192- >&nbsp;<span class="invisible-link">Edit</span></a>
193+ ><span class="invisible-link">Edit</span></a>
194
195 <a tal:condition="view/help_link"
196 tal:attributes="href view/help_link"
197 target="help"
198- class="sprite maybe">&nbsp;
199- <span class="invisible-link">Driver help</span>
200- </a>
201+ class="sprite maybe"><span class="invisible-link">Driver help</span></a>
202 <div class="yui3-activator-message-box yui3-activator-hidden"></div>
203 </span>
204 </span>
205
206=== modified file 'lib/lp/app/templates/launchpad-form.pt'
207--- lib/lp/app/templates/launchpad-form.pt 2011-12-15 22:00:24 +0000
208+++ lib/lp/app/templates/launchpad-form.pt 2012-05-31 07:22:20 +0000
209@@ -106,9 +106,8 @@
210 <input tal:replace="structure widget" />
211 <tal:help-link condition="widget_help_link">
212 <a tal:attributes="href widget_help_link"
213- target="help" class="sprite maybe">
214- &nbsp;<span class="invisible-link">(?)</span>
215- </a>
216+ target="help"
217+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
218 </tal:help-link>
219 </div>
220 <div class="message" tal:condition="error"
221@@ -128,9 +127,8 @@
222 </tal:label>
223 <tal:help-link condition="widget_help_link">
224 <a tal:attributes="href widget_help_link"
225- target="help" class="sprite maybe">
226- &nbsp;<span class="invisible-link">(?)</span>
227- </a>
228+ target="help"
229+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
230 </tal:help-link>
231 <div tal:condition="error" tal:content="structure error"
232 class="message">Error message</div>
233@@ -148,9 +146,8 @@
234 tal:content="widget/label">Label</label>
235 <tal:help-link condition="widget_help_link">
236 <a tal:attributes="href widget_help_link"
237- target="help" class="sprite maybe">
238- &nbsp;<span class="invisible-link">(?)</span>
239- </a>
240+ target="help"
241+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
242 </tal:help-link>
243 <div tal:condition="error" tal:content="structure error"
244 class="message">Error message</div>
245
246=== modified file 'lib/lp/app/templates/launchpad-inline-icon-link.pt'
247--- lib/lp/app/templates/launchpad-inline-icon-link.pt 2011-05-27 18:01:09 +0000
248+++ lib/lp/app/templates/launchpad-inline-icon-link.pt 2012-05-31 07:22:20 +0000
249@@ -5,5 +5,5 @@
250 tal:attributes="
251 class string:menu-link-${context/name} sprite ${context/icon};
252 href context/url;
253- title context/summary;"
254-><span class="invisible-link" tal:content="context/text"></span></a></tal:link-enabled>
255+ title context/summary;"><span class="invisible-link"
256+ tal:content="context/text"></span></a></tal:link-enabled>
257
258=== modified file 'lib/lp/blueprints/templates/specification-index.pt'
259--- lib/lp/blueprints/templates/specification-index.pt 2012-03-05 13:04:16 +0000
260+++ lib/lp/blueprints/templates/specification-index.pt 2012-05-31 07:22:20 +0000
261@@ -284,8 +284,8 @@
262 </div>
263
264 <div class="portlet">
265- <a href="/+help-blueprints/workitems-help.html" target="help" class="sprite maybe">&nbsp;
266- <span class="invisible-link">Tag help</span></a>
267+ <a href="/+help-blueprints/workitems-help.html" target="help"
268+ class="sprite maybe"><span class="invisible-link">Tag help</span></a>
269 <div class="wide" tal:content="structure view/workitems_text_widget" />
270 </div>
271
272
273=== modified file 'lib/lp/bugs/browser/tests/test_bugtask.py'
274--- lib/lp/bugs/browser/tests/test_bugtask.py 2012-05-30 21:54:41 +0000
275+++ lib/lp/bugs/browser/tests/test_bugtask.py 2012-05-31 07:22:20 +0000
276@@ -2436,7 +2436,7 @@
277 self.assertEqual(item.bug_heat_html, model['bug_heat_html'])
278 self.assertEqual(
279 '<span alt="private" title="Private" class="sprite private">'
280- '&nbsp;</span>', model['badges'])
281+ '</span>', model['badges'])
282 self.assertEqual(None, model['milestone_name'])
283 item.bugtask.milestone = self.factory.makeMilestone(
284 product=item.bugtask.target)
285
286=== modified file 'lib/lp/bugs/javascript/bugtask_index.js'
287--- lib/lp/bugs/javascript/bugtask_index.js 2012-05-15 19:10:39 +0000
288+++ lib/lp/bugs/javascript/bugtask_index.js 2012-05-31 07:22:20 +0000
289@@ -122,7 +122,7 @@
290 var privacy_text = Y.one('#privacy-text');
291 privacy_link = Y.Node.create(
292 '<a id="privacy-link" class="sprite edit" title="[edit]">' +
293- '<span class="invisible-link">edit</span>&nbsp;</a>');
294+ '<span class="invisible-link">edit</span></a>');
295 privacy_link.set('href', privacy_link_url);
296 privacy_text.appendChild(privacy_link);
297 privacy_spinner = Y.Node.create(
298@@ -422,7 +422,7 @@
299 privacy_div.replaceClass('private', 'public');
300 privacy_text.set(
301 'innerHTML', 'This report is public ');
302- banner.hide();
303+ banner.hide();
304 }
305 privacy_text.appendChild(privacy_link);
306 privacy_text.appendChild(privacy_spinner);
307@@ -1514,4 +1514,5 @@
308 "lp.bugs.information_type_choice",
309 "lp.app.widgets.expander", "lp.client", "escape",
310 "lp.client.plugins", "lp.app.errors",
311- "lp.app.banner.privacy", "lp.app.confirmationoverlay"]});
312+ "lp.app.banner.privacy",
313+ "lp.app.confirmationoverlay"]});
314
315=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt'
316--- lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt 2012-02-08 12:12:34 +0000
317+++ lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt 2012-05-31 07:22:20 +0000
318@@ -226,7 +226,7 @@
319 >>> milestone = find_tags_by_class(browser.contents, 'sprite milestone')
320 >>> print milestone[0]
321 <a href="http://launchpad.dev/debian/+milestone/3.1" alt="milestone 3.1"
322- title="Linked to milestone 3.1" class="sprite milestone">&nbsp;</a>
323+ title="Linked to milestone 3.1" class="sprite milestone"></a>
324
325
326 Patches also appear as badges in bug listings.
327
328=== modified file 'lib/lp/bugs/templates/bugcomment-macros.pt'
329--- lib/lp/bugs/templates/bugcomment-macros.pt 2012-05-11 21:10:07 +0000
330+++ lib/lp/bugs/templates/bugcomment-macros.pt 2012-05-31 07:22:20 +0000
331@@ -57,7 +57,7 @@
332 <tbody>
333 <tr>
334 <td>
335- <span class="sprite arrowRight">&nbsp;</span>
336+ <span class="sprite arrowRight"></span>
337 <span tal:replace="num_hidden">42</span> comments hidden
338 <span id="more-comments-spinner" class="hidden">
339 Loading more comments
340
341=== modified file 'lib/lp/bugs/templates/bugtask-choose-affected-product.pt'
342--- lib/lp/bugs/templates/bugtask-choose-affected-product.pt 2011-11-26 04:03:29 +0000
343+++ lib/lp/bugs/templates/bugtask-choose-affected-product.pt 2012-05-31 07:22:20 +0000
344@@ -20,8 +20,7 @@
345 A bug may need fixing in more than one project. You may add another
346 project for this bug here.
347 <a href="/+help-bugs/also-affects-project-help.html" target="help"
348- class="sprite maybe">&nbsp;<span class="invisible-link">(?)</span>
349- </a>
350+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
351 </p>
352
353 <p tal:content="structure context/fmt:link" />
354
355=== modified file 'lib/lp/bugs/templates/bugtask-index.pt'
356--- lib/lp/bugs/templates/bugtask-index.pt 2012-05-12 03:19:06 +0000
357+++ lib/lp/bugs/templates/bugtask-index.pt 2012-05-31 07:22:20 +0000
358@@ -157,8 +157,8 @@
359 id="edit-tags-cancel"
360 type="button">Cancel</button>
361 </form>
362- <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe">&nbsp;
363- <span class="invisible-link">Tag help</span></a>
364+ <a href="/+help-bugs/tag-help.html" target="help"
365+ class="sprite maybe"><span class="invisible-link">Tag help</span></a>
366 </div>
367 <div id="add-bug-tags"
368 tal:attributes="class python: (not(context.bug.tags) and
369@@ -166,8 +166,8 @@
370 <a href="+edit" title="Add tags" id="add-tags-trigger" class="sprite add">
371 Add tags
372 </a>
373- <a href="/+help-bugs/tag-help.html" target="help" class="sprite maybe">&nbsp;
374- <span class="invisible-link">Tag help</span></a>
375+ <a href="/+help-bugs/tag-help.html" target="help"
376+ class="sprite maybe"><span class="invisible-link">Tag help</span></a>
377 <script type="text/javascript">
378 LPJS.use('event', 'node', 'lp.bugs.bug_tags_entry', function(Y) {
379 Y.on('domready',
380
381=== modified file 'lib/lp/bugs/templates/bugtasks-and-nominations-portal.pt'
382--- lib/lp/bugs/templates/bugtasks-and-nominations-portal.pt 2012-05-12 03:19:06 +0000
383+++ lib/lp/bugs/templates/bugtasks-and-nominations-portal.pt 2012-05-31 07:22:20 +0000
384@@ -75,9 +75,7 @@
385 replace="structure link/render" />
386 <a href="/+help-bugs/also-affects-project-help.html"
387 target="help"
388- class="sprite maybe">&nbsp;
389- <span class="invisible-link">(?)</span>
390- </a>
391+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
392 </span>
393 <span id="also-affects-package"
394 tal:attributes="class python:not view.canAddPackageTask() and 'private-disallow' or ''"
395
396=== modified file 'lib/lp/code/templates/branch-recipes.pt'
397--- lib/lp/code/templates/branch-recipes.pt 2011-11-26 04:03:29 +0000
398+++ lib/lp/code/templates/branch-recipes.pt 2012-05-31 07:22:20 +0000
399@@ -20,9 +20,8 @@
400 </tal:recipes>
401 using this branch.
402
403- <a href="/+help-code/related-recipes.html" target="help" class="sprite maybe">
404- &nbsp;<span class="invisible-link">Tag help</span>
405- </a>
406+ <a href="/+help-code/related-recipes.html" target="help"
407+ class="sprite maybe"><span class="invisible-link">Tag help</span></a>
408 </div>
409
410 <span
411
412=== modified file 'lib/lp/code/templates/branch-related-bugs-specs.pt'
413--- lib/lp/code/templates/branch-related-bugs-specs.pt 2012-05-11 22:11:37 +0000
414+++ lib/lp/code/templates/branch-related-bugs-specs.pt 2012-05-31 07:22:20 +0000
415@@ -53,7 +53,7 @@
416 <tal:link replace="structure spec/fmt:link:blueprints" />
417 <tal:show-edit condition="show_edit|nothing">
418 <a class="sprite edit"
419- tal:attributes="href spec_branch/fmt:url;">&nbsp;</a>
420+ tal:attributes="href spec_branch/fmt:url;"></a>
421 </tal:show-edit>
422 </li>
423
424
425=== modified file 'lib/lp/code/templates/sourcepackagerecipe-index.pt'
426--- lib/lp/code/templates/sourcepackagerecipe-index.pt 2012-05-11 22:06:46 +0000
427+++ lib/lp/code/templates/sourcepackagerecipe-index.pt 2012-05-31 07:22:20 +0000
428@@ -83,9 +83,8 @@
429 <div class="two-column-list">
430 <dl id="build_daily">
431 <dt>Build schedule:
432- <a href="/+help-code/recipe-build-frequency.html" target="help" class="sprite maybe">
433- &nbsp;<span class="invisible-link">Tag help</span>
434- </a>
435+ <a href="/+help-code/recipe-build-frequency.html" target="help"
436+ class="sprite maybe"><span class="invisible-link">Tag help</span></a>
437 </dt>
438 <dd tal:content="structure view/daily_build_widget"/>
439 <dd
440
441=== modified file 'lib/lp/registry/javascript/sharing/shareetable.js'
442--- lib/lp/registry/javascript/sharing/shareetable.js 2012-05-30 11:25:12 +0000
443+++ lib/lp/registry/javascript/sharing/shareetable.js 2012-05-31 07:22:20 +0000
444@@ -164,13 +164,13 @@
445 ' <a title="Stop sharing with {{display_name}}"',
446 ' href="#" class="sprite remove"',
447 ' data-self_link="{{self_link}}"',
448- ' data-person_name="{{display_name}}">&nbsp;</a>',
449+ ' data-person_name="{{display_name}}"></a>',
450 '</span>',
451 '<span id="update-{{name}}">',
452 ' <a title="Update sharing for {{display_name}}"',
453 ' href="#" class="sprite add"',
454 ' data-self_link="{{self_link}}"',
455- ' data-person_name="{{display_name}}">&nbsp;</a>',
456+ ' data-person_name="{{display_name}}"></a>',
457 '</span>',
458 '</td>',
459 '<td id="td-permission-{{name}}">',
460@@ -207,7 +207,7 @@
461 '<li class="nowrap">',
462 '<span id="{{policy}}-permission-{{sharee_name}}">',
463 ' <span class="value"></span>',
464- ' <a class="editicon sprite edit" href="#">&nbsp;</a>',
465+ ' <a class="editicon sprite edit" href="#"></a>',
466 '</span></li>',
467 '{{/information_types}}'].join(' ');
468 },
469
470=== modified file 'lib/lp/registry/javascript/sharing/sharingdetails.js'
471--- lib/lp/registry/javascript/sharing/sharingdetails.js 2012-05-11 06:29:27 +0000
472+++ lib/lp/registry/javascript/sharing/sharingdetails.js 2012-05-31 07:22:20 +0000
473@@ -281,7 +281,7 @@
474 '<tr id="shared-bug-{{ bug_id }}">',
475 ' <td class="icon right">',
476 ' <span class="sortkey">{{bug_id}}</span>',
477- ' <span class="sprite bug-{{bug_importance}}">&nbsp;</span>',
478+ ' <span class="sprite bug-{{bug_importance}}"></span>',
479 ' </td>',
480 ' <td class="amount">{{bug_id}}</td>',
481 ' <td>',
482@@ -292,8 +292,7 @@
483 ' <a class="sprite remove" href="#"',
484 ' title="Unshare bug {{bug_id}} with {{displayname}}"',
485 ' data-self_link="{{self_link}}" data-name="Bug {{bug_id}}"',
486- ' data-type="bug">',
487- ' &nbsp;</a>',
488+ ' data-type="bug"></a>',
489 ' </span>',
490 ' </td>',
491 ' <td>',
492@@ -319,8 +318,7 @@
493 ' <a class="sprite remove" href="#"',
494 ' title="Unshare branch {{branch_name}} with {{displayname}}"',
495 ' data-self_link="{{self_link}}" data-name="{{branch_name}}"',
496- ' data-type="branch">',
497- ' &nbsp;</a>',
498+ ' data-type="branch"></a>',
499 ' </span>',
500 ' </td>',
501 ' <td>',
502
503=== modified file 'lib/lp/registry/javascript/structural-subscription.js'
504--- lib/lp/registry/javascript/structural-subscription.js 2012-03-21 01:17:13 +0000
505+++ lib/lp/registry/javascript/structural-subscription.js 2012-05-31 07:22:20 +0000
506@@ -1361,9 +1361,7 @@
507 .append(Y.Node.create('<span/>')
508 .addClass('invisible-link')
509 .set('text', 'Delivery help')));
510- // For some reason the help link will not appear in Chrome unless
511- // there is a non-empty element immediately after the help node.
512- control.append(Y.Node.create('<span>&nbsp;</span>'));
513+ control.append(Y.Node.create('<span></span>'));
514 // We store a reference to the timeout that will hide the help link so
515 // we can cancel it if needed.
516 var hide_help_timeout;
517
518=== modified file 'lib/lp/registry/templates/distributionsourcepackage-index.pt'
519--- lib/lp/registry/templates/distributionsourcepackage-index.pt 2012-03-10 13:48:37 +0000
520+++ lib/lp/registry/templates/distributionsourcepackage-index.pt 2012-05-31 07:22:20 +0000
521@@ -150,9 +150,7 @@
522 <td style="white-space: nowrap">
523 <a class="expander"
524 tal:attributes="id string:pub${pubid}-expander;
525- href string:${archive/fmt:url}/+sourcepub/${pubid}/+listing-archive-extra">
526- &nbsp;
527- </a>
528+ href string:${archive/fmt:url}/+sourcepub/${pubid}/+listing-archive-extra"></a>
529 <a tal:attributes="href row/version">
530 <img src="/@@/package-source" />
531 <tal:version content="row/version"/>
532
533=== modified file 'lib/lp/registry/templates/distroseries-add.pt'
534--- lib/lp/registry/templates/distroseries-add.pt 2011-11-26 04:03:29 +0000
535+++ lib/lp/registry/templates/distroseries-add.pt 2012-05-31 07:22:20 +0000
536@@ -11,9 +11,8 @@
537 <p metal:fill-slot="extra_info">
538 This page allows you to add a new distribution series.
539 <a href="/+help-registry/distribution-add-series.html"
540- target="help" class="sprite maybe">
541- &nbsp;<span class="invisible-link">(?)</span>
542- </a>
543+ target="help"
544+ class="sprite maybe"><span class="invisible-link">(?)</span></a>
545 </p>
546 </div>
547 </div>
548
549=== modified file 'lib/lp/registry/templates/distroseries-initialize.pt'
550--- lib/lp/registry/templates/distroseries-initialize.pt 2012-02-01 15:31:32 +0000
551+++ lib/lp/registry/templates/distroseries-initialize.pt 2012-05-31 07:22:20 +0000
552@@ -16,9 +16,9 @@
553 <tal:enabled condition="view/show_derivation_form">
554 <div class="top-portlet">
555 This page allows you to initialize a distribution series.
556- <a href="/+help-registry/init-series-title-help.html"
557- target="help" class="sprite maybe">&nbsp;
558- <span class="invisible-link">Initialization help</span></a>
559+ <a href="/+help-registry/init-series-title-help.html" target="help"
560+ class="sprite maybe"><span
561+ class="invisible-link">Initialization help</span></a>
562 </div>
563 <p class="error message javascript-disabled">
564 Javascript is required to use this page. Please enable
565
566=== modified file 'lib/lp/registry/templates/milestone-index.pt'
567--- lib/lp/registry/templates/milestone-index.pt 2012-02-01 15:31:32 +0000
568+++ lib/lp/registry/templates/milestone-index.pt 2012-05-31 07:22:20 +0000
569@@ -132,7 +132,7 @@
570 <tal:no condition="not: context/active">
571 No. Drivers cannot target bugs and blueprints to this milestone.
572 </tal:no>
573- &nbsp; <a tal:replace="structure milestone_menu/edit/fmt:icon" />
574+ &nbsp;<a tal:replace="structure milestone_menu/edit/fmt:icon" />
575 </dd>
576 </dl>
577
578
579=== modified file 'lib/lp/registry/templates/milestone-tag-search.pt'
580--- lib/lp/registry/templates/milestone-tag-search.pt 2012-01-02 11:12:46 +0000
581+++ lib/lp/registry/templates/milestone-tag-search.pt 2012-05-31 07:22:20 +0000
582@@ -24,9 +24,8 @@
583 <p>
584 <tal:tags replace="structure view/widgets/tags" />
585 <input tal:replace="structure view/search_by_tags/render" />
586- <a target="help" href="/+help-registry/milestone-tags.html" class="sprite maybe">
587- &nbsp;<span class="invisible-link">Milestone Tags help</span>
588- </a>
589+ <a target="help" href="/+help-registry/milestone-tags.html"
590+ class="sprite maybe"><span class="invisible-link">Milestone Tags help</span></a>
591 </p>
592
593 <div class="error" tal:condition="view/errors">
594
595=== modified file 'lib/lp/registry/templates/person-editpgpkeys.pt'
596--- lib/lp/registry/templates/person-editpgpkeys.pt 2012-03-02 16:17:46 +0000
597+++ lib/lp/registry/templates/person-editpgpkeys.pt 2012-05-31 07:22:20 +0000
598@@ -186,7 +186,7 @@
599 </p>
600 <div>
601 <input type="submit" name="import" value="Import Key"/>
602- or&nbsp; <a tal:attributes="href view/cancel_url">Cancel</a>
603+ or&nbsp;<a tal:attributes="href view/cancel_url">Cancel</a>
604 </div>
605
606 </form>
607
608=== modified file 'lib/lp/registry/templates/person-editsshkeys.pt'
609--- lib/lp/registry/templates/person-editsshkeys.pt 2010-03-04 21:51:10 +0000
610+++ lib/lp/registry/templates/person-editsshkeys.pt 2012-05-31 07:22:20 +0000
611@@ -58,7 +58,7 @@
612 </div>
613 <div style="margin-top: 0.5em;">
614 <input type="submit" value="Import Public Key" />
615- or&nbsp; <a tal:attributes="href view/cancel_url">Cancel</a>
616+ or&nbsp;<a tal:attributes="href view/cancel_url">Cancel</a>
617 </div>
618 </div>
619 </form>
620
621=== modified file 'lib/lp/registry/templates/person-macros.pt'
622--- lib/lp/registry/templates/person-macros.pt 2012-02-16 12:45:59 +0000
623+++ lib/lp/registry/templates/person-macros.pt 2012-05-31 07:22:20 +0000
624@@ -65,7 +65,7 @@
625 tal:attributes="title context/subscriptionpolicy/description">
626 <span tal:replace="context/subscriptionpolicy/title" />
627 <a class="sprite maybe" href="/+help-registry/team-subscription-policy.html"
628- target="help">&nbsp;</a>
629+ target="help"></a>
630 </dd>
631 </dl>
632
633
634=== modified file 'lib/lp/registry/templates/person-portlet-contact-details.pt'
635--- lib/lp/registry/templates/person-portlet-contact-details.pt 2012-02-16 20:37:55 +0000
636+++ lib/lp/registry/templates/person-portlet-contact-details.pt 2012-05-31 07:22:20 +0000
637@@ -72,8 +72,8 @@
638 <dd>
639 <img src="/@@/private" alt="" />
640 <tal:openid-login content="view/openid_identity_url" />
641- <a target="help" href="/+help-registry/openid.html" class="sprite maybe">&nbsp;
642- <span class="invisible-link">OpenID help</span></a>
643+ <a target="help" href="/+help-registry/openid.html"
644+ class="sprite maybe"><span class="invisible-link">OpenID help</span></a>
645 </dd>
646 </dl>
647
648@@ -183,8 +183,8 @@
649 <dd><a id="karma-total"
650 tal:attributes="href overview_menu/karma/url"
651 tal:content="context/karma">342</a>
652- <a target="help" href="/+help-registry/karma.html" class="sprite maybe">&nbsp;
653- <span class="invisible-link">Karma help</span></a>
654+ <a target="help" href="/+help-registry/karma.html"
655+ class="sprite maybe"><span class="invisible-link">Karma help</span></a>
656 </dd>
657 </dl>
658 </div>
659
660=== modified file 'lib/lp/registry/templates/person-upcomingwork.pt'
661--- lib/lp/registry/templates/person-upcomingwork.pt 2012-05-21 19:40:33 +0000
662+++ lib/lp/registry/templates/person-upcomingwork.pt 2012-05-31 07:22:20 +0000
663@@ -89,7 +89,7 @@
664 <tbody>
665 <tr class="expandable">
666 <td>
667- <a href="#" class="expander">&nbsp;</a>
668+ <a href="#" class="expander"></a>
669 <span tal:replace="structure container/html_link" />
670 </td>
671 <td tal:content="structure container/target_link" />
672
673=== modified file 'lib/lp/registry/templates/team-editproposed.pt'
674--- lib/lp/registry/templates/team-editproposed.pt 2010-12-16 20:40:07 +0000
675+++ lib/lp/registry/templates/team-editproposed.pt 2012-05-31 07:22:20 +0000
676@@ -69,7 +69,7 @@
677 </p>
678
679 <input tal:replace="structure view/action_save/render" />
680- or&nbsp; <a tal:attributes="href view/cancel_url">Cancel</a>
681+ or&nbsp;<a tal:attributes="href view/cancel_url">Cancel</a>
682 </form>
683 </div>
684
685
686=== modified file 'lib/lp/soyuz/stories/distribution/xx-distribution-packages.txt'
687--- lib/lp/soyuz/stories/distribution/xx-distribution-packages.txt 2012-02-21 22:46:28 +0000
688+++ lib/lp/soyuz/stories/distribution/xx-distribution-packages.txt 2012-05-31 07:22:20 +0000
689@@ -247,9 +247,7 @@
690 >>> expander_url = find_tags_by_class(
691 ... user_browser.contents, 'expander')[0]
692 >>> print expander_url
693- <a class="expander" href="/ubuntu/+archive/primary/+sourcepub/26/+listing-archive-extra" id="pub26-expander">
694- &nbsp;
695- </a>
696+ <a class="expander" href="/ubuntu/+archive/primary/+sourcepub/26/+listing-archive-extra" id="pub26-expander"></a>
697
698 >>> browser.open(user_browser.getLink(id="pub26-expander").url)
699 >>> print extract_text(browser.contents)