Skip to content

Commit 28b914a

Browse files
author
jomae
committed
1.1.3dev: merged [13328] from 1.0-stable (fix for #10470)
git-svn-id: http://trac.edgewall.org/intertrac/log:/trunk@13329 af82e41b-90c4-0310-8c96-b1721e28e2e2
1 parent 817d744 commit 28b914a

File tree

9 files changed

+121
-8
lines changed

9 files changed

+121
-8
lines changed

trac/htdocs/js/trac.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@
140140
$.loadStyleSheet = function(href, type) {
141141
type = type || "text/css";
142142
$(document).ready(function() {
143+
var link;
144+
$("link[rel=stylesheet]").each(function() {
145+
if (this.getAttribute("href") === href) {
146+
if (this.disabled)
147+
this.disabled = false;
148+
link = this;
149+
return false;
150+
}
151+
});
152+
if (link !== undefined)
153+
return;
143154
if (document.createStyleSheet) { // MSIE
144155
document.createStyleSheet(href);
145156
} else {

trac/ticket/templates/ticket.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@
9898
var show_preview = preview.children().length != 0;
9999
$("#ticketchange").toggle(show_preview);
100100
setRevertHandler();
101+
// Execute scripts to load stylesheets
102+
items.filter("script").appendTo("head");
101103
}, "#ticketchange .trac-loading");
102104
$("#trac-comment-editor").autoSubmit({preview_comment: '1'}, function(data, reply) {
103105
var comment = $("#trac-comment-editor").next("div.comment").html(reply);

trac/ticket/templates/ticket_box.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,5 @@ <h3 id="comment:description">
120120
</div>
121121
<br py:if="not ticket.description" style="clear: both" />
122122
</div>
123+
<py:if test="chrome_info_script">${chrome_info_script(req)}</py:if>
123124
</div>

trac/ticket/templates/ticket_preview.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
py:with="can_append = 'TICKET_APPEND' in perm(ticket.resource);
1818
has_edit_comment = 'TICKET_EDIT_COMMENT' in perm(ticket.resource);"
1919
py:strip="">
20-
<xi:include href="ticket_box.html"/>
20+
<xi:include href="ticket_box.html" py:with="chrome_info_script = None" />
2121
<div id="changelog">
2222
<div py:for="change in changes"
2323
class="change${' trac-new' if change.date > start_time and 'attachment' not in change.fields else None}"
@@ -28,4 +28,5 @@
2828
<input type="hidden" name="view_time" value="${to_utimestamp(ticket['changetime'])}"/>
2929
<div id="preview"><xi:include py:if="change_preview.fields or change_preview.comment"
3030
href="ticket_change.html" py:with="change = change_preview; preview = True"/></div>
31+
<py:if test="chrome_info_script">${chrome_info_script(req)}</py:if>
3132
</html>

trac/ticket/web_ui.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@
4848
from trac.util.presentation import separated
4949
from trac.util.translation import _, tag_, tagn_, N_, ngettext
5050
from trac.versioncontrol.diff import get_diff_options, diff_blocks
51-
from trac.web import IRequestHandler, arg_list_to_args, parse_arg_list
51+
from trac.web.api import IRequestHandler, arg_list_to_args, parse_arg_list
5252
from trac.web.chrome import (
5353
Chrome, INavigationContributor, ITemplateProvider,
5454
add_ctxtnav, add_link, add_notice, add_script, add_script_data,
55-
add_stylesheet, add_warning, auth_link, prevnext_nav, web_context
55+
add_stylesheet, add_warning, auth_link, chrome_info_script, prevnext_nav,
56+
web_context
5657
)
5758
from trac.wiki.formatter import format_to, format_to_html, format_to_oneliner
5859

@@ -500,6 +501,7 @@ def _process_newticket_request(self, req):
500501

501502
if req.get_header('X-Requested-With') == 'XMLHttpRequest':
502503
data['preview_mode'] = True
504+
data['chrome_info_script'] = chrome_info_script
503505
return 'ticket_box.html', data, None
504506

505507
add_stylesheet(req, 'common/css/ticket.css')
@@ -519,7 +521,8 @@ def _process_ticket_request(self, req):
519521
escape_newlines = self.must_preserve_newlines
520522
rendered = format_to_html(self.env, context,
521523
req.args.get('edited_comment', ''),
522-
escape_newlines=escape_newlines)
524+
escape_newlines=escape_newlines) + \
525+
chrome_info_script(req)
523526
req.send(rendered.encode('utf-8'))
524527

525528
req.perm('ticket', id, version).require('TICKET_VIEW')
@@ -641,6 +644,7 @@ def _process_ticket_request(self, req):
641644

642645
if xhr:
643646
data['preview_mode'] = bool(data['change_preview']['fields'])
647+
data['chrome_info_script'] = chrome_info_script
644648
return 'ticket_preview.html', data, None
645649

646650
mime = Mimeview(self.env)

trac/web/chrome.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
from trac.util.html import escape, plaintext
5353
from trac.util.text import pretty_size, obfuscate_email_address, \
5454
shorten_line, unicode_quote_plus, to_unicode, \
55-
javascript_quote, exception_to_unicode
55+
javascript_quote, exception_to_unicode, to_js_string
5656
from trac.util.datefmt import (
5757
pretty_timedelta, format_datetime, format_date, format_time,
5858
from_utimestamp, http_date, utc, get_date_format_jquery_ui, is_24_hours,
@@ -304,6 +304,30 @@ def auth_link(req, link):
304304
return link
305305

306306

307+
def chrome_info_script(req, use_late=None):
308+
"""Get script elements from chrome info of the request object during
309+
rendering template or after rendering.
310+
311+
:param req: the HTTP request object.
312+
:param use_late: if True, `late_links` will be used instead of `links`.
313+
"""
314+
if use_late:
315+
links = req.chrome.get('late_links')
316+
else:
317+
links = req.chrome.get('links')
318+
if links:
319+
links = links.get('stylesheet')
320+
321+
content = []
322+
content.extend('jQuery.loadStyleSheet(%s, %s);' %
323+
(to_js_string(link['href']), to_js_string(link['type']))
324+
for link in links or ())
325+
if content:
326+
return tag.script('\n'.join(content), type='text/javascript')
327+
else:
328+
return ''
329+
330+
307331
def _chrome_resource_path(req, filename):
308332
"""Get the path for a chrome resource given its `filename`.
309333

trac/wiki/tests/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
import trac.wiki.api
1818
import trac.wiki.formatter
1919
import trac.wiki.parser
20-
from trac.wiki.tests import formatter, macros, model, web_ui, wikisyntax
20+
from trac.wiki.tests import formatter, macros, model, web_api, web_ui, \
21+
wikisyntax
2122
from trac.wiki.tests.functional import functionalSuite
2223

2324
def suite():
@@ -26,6 +27,7 @@ def suite():
2627
suite.addTest(formatter.suite())
2728
suite.addTest(macros.suite())
2829
suite.addTest(model.suite())
30+
suite.addTest(web_api.suite())
2931
suite.addTest(web_ui.suite())
3032
suite.addTest(wikisyntax.suite())
3133
suite.addTest(doctest.DocTestSuite(trac.wiki.api))

trac/wiki/tests/web_api.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# Copyright (C) 2014 Edgewall Software
4+
# All rights reserved.
5+
#
6+
# This software is licensed as described in the file COPYING, which
7+
# you should have received as part of this distribution. The terms
8+
# are also available at http://trac.edgewall.org/wiki/TracLicense.
9+
#
10+
# This software consists of voluntary contributions made by many
11+
# individuals. For the exact contribution history, see the revision
12+
# history and logs, available at http://trac.edgewall.org/log/.
13+
14+
import unittest
15+
from cStringIO import StringIO
16+
17+
import trac.tests.compat
18+
from trac.mimeview.patch import PatchRenderer
19+
from trac.test import EnvironmentStub, Mock
20+
from trac.web.api import RequestDone
21+
from trac.web.href import Href
22+
from trac.wiki.web_api import WikiRenderer
23+
24+
25+
class WikiRendererTestCase(unittest.TestCase):
26+
27+
def setUp(self):
28+
self.env = EnvironmentStub()
29+
self.mod = WikiRenderer(self.env)
30+
31+
def test_load_stylesheet(self):
32+
buf = StringIO()
33+
def send(data):
34+
buf.write(data)
35+
raise RequestDone
36+
37+
text = """\
38+
{{{#!text/x-diff
39+
--- a/file.txt 2014-11-13 01:16:06 +0000
40+
+++ b/file.txt 2014-11-13 01:16:06 +0000
41+
@@ -1 +1 @@
42+
-old line
43+
+new line
44+
}}}
45+
"""
46+
req = Mock(method='POST', path_info='/wiki_render', session={},
47+
args={'id': 'WikiStart', 'text': text},
48+
abs_href=Href('http://example.com/'), href=Href('/'),
49+
chrome={'links': {}, 'scripts': []}, perm=None,
50+
authname=None, tz=None, send=send)
51+
self.assertTrue(self.mod.match_request(req))
52+
try:
53+
self.mod.process_request(req)
54+
self.fail('RequestDone not raised')
55+
except RequestDone:
56+
output = buf.getvalue()
57+
self.assertIn('<div class="code"><pre>', output)
58+
self.assertIn('jQuery.loadStyleSheet("'
59+
'/chrome/common/css/diff.css"', output)
60+
61+
62+
def suite():
63+
return unittest.makeSuite(WikiRendererTestCase)
64+
65+
66+
if __name__ == '__main__':
67+
unittest.main(defaultTest='suite')

trac/wiki/web_api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from trac.resource import Resource
1616
from trac.util import as_int
1717
from trac.web.api import IRequestHandler
18-
from trac.web.chrome import web_context
18+
from trac.web.chrome import chrome_info_script, web_context
1919
from trac.wiki.formatter import format_to
2020

2121

@@ -51,5 +51,6 @@ def process_request(self, req):
5151

5252
resource = Resource(realm, id=id, version=version)
5353
context = web_context(req, resource)
54-
rendered = format_to(self.env, flavor, context, text, **options)
54+
rendered = format_to(self.env, flavor, context, text, **options) + \
55+
chrome_info_script(req)
5556
req.send(rendered.encode('utf-8'))

0 commit comments

Comments
 (0)