Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
R
renderjs
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Romain Courteaud
renderjs
Commits
3a87d366
Commit
3a87d366
authored
Jan 28, 2020
by
Romain Courteaud
🐸
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use the base tag to build the dependency url
parent
c04e9c65
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
233 additions
and
5 deletions
+233
-5
renderjs.js
renderjs.js
+19
-5
test/renderjs_test.js
test/renderjs_test.js
+214
-0
No files found.
renderjs.js
View file @
3a87d366
...
...
@@ -1495,10 +1495,12 @@
title
:
""
,
interface_list
:
[],
required_css_list
:
[],
required_js_list
:
[]
required_js_list
:
[],
path
:
url
},
i
,
element
;
element
,
base_found
=
false
;
if
(
!
url
||
!
isAbsoluteOrDataURL
.
test
(
url
))
{
throw
new
Error
(
"
The url should be absolute:
"
+
url
);
...
...
@@ -1515,19 +1517,31 @@
// element.href returns absolute URL in firefox but "" in chrome;
if
(
element
.
rel
===
"
stylesheet
"
)
{
settings
.
required_css_list
.
push
(
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
href
"
),
url
)
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
href
"
),
settings
.
path
)
);
}
else
if
(
element
.
nodeName
===
"
SCRIPT
"
&&
(
element
.
type
===
"
text/javascript
"
||
!
element
.
type
))
{
settings
.
required_js_list
.
push
(
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
src
"
),
url
)
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
src
"
),
settings
.
path
)
);
}
else
if
(
element
.
rel
===
"
http://www.renderjs.org/rel/interface
"
)
{
settings
.
interface_list
.
push
(
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
href
"
),
url
)
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
href
"
),
settings
.
path
)
);
}
else
if
((
element
.
nodeName
===
"
BASE
"
)
&&
!
base_found
&&
element
.
getAttribute
(
"
href
"
))
{
settings
.
path
=
renderJS
.
getAbsoluteURL
(
element
.
getAttribute
(
"
href
"
),
settings
.
path
);
// Only use the first base element found
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base#Usage_notes
base_found
=
true
;
}
}
}
...
...
test/renderjs_test.js
View file @
3a87d366
...
...
@@ -86,6 +86,7 @@
// Check that parseGadgetHTMLDocument returns the default value
// if the string is not a valid xml
deepEqual
(
parseGadgetHTML
(
""
,
"
http://example.org
"
),
{
path
:
"
http://example.org
"
,
title
:
""
,
interface_list
:
[],
required_css_list
:
[],
...
...
@@ -118,6 +119,7 @@
document
.
implementation
.
createHTMLDocument
(
""
),
"
http://example.org
"
),
{
path
:
"
http://example.org
"
,
title
:
""
,
interface_list
:
[],
required_css_list
:
[],
...
...
@@ -162,6 +164,31 @@
// equal(settings.title, '', 'Title not found');
// });
test
(
'
Extract base url
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the title
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org
"
);
equal
(
settings
.
path
,
'
http://example.org/bar/bar2/
'
,
'
Base extracted
'
);
});
test
(
'
Extract only one base url
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the first title
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
<base href='./bar3/bar4/'></base>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org
"
);
equal
(
settings
.
path
,
'
http://example.org/bar/bar2/
'
,
'
Base extracted
'
);
});
// XXX innerHTML is not extracted anymore
// test('Extract body', function () {
// // Check that parseGadgetHTML correctly extract the body
...
...
@@ -215,6 +242,38 @@
"
CSS extracted
"
);
});
test
(
'
Extract CSS after base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the CSS
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
<link rel='stylesheet' href='../lib/qunit/qunit.css'
"
+
"
type='text/css'/>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
required_css_list
,
[
'
http://example.org/foo/bar/lib/qunit/qunit.css
'
],
"
CSS extracted
"
);
});
test
(
'
Extract CSS before base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the CSS
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<link rel='stylesheet' href='../lib/qunit/qunit.css'
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
type='text/css'/>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
required_css_list
,
[
'
http://example.org/lib/qunit/qunit.css
'
],
"
CSS extracted
"
);
});
test
(
'
Extract CSS order
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly keep CSS order
var
settings
,
...
...
@@ -261,6 +320,38 @@
"
interface extracted
"
);
});
test
(
'
Extract interface after base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the interface
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
<link rel='http://www.renderjs.org/rel/interface'
"
+
"
href='./interface/renderable'/>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
interface_list
,
[
'
http://example.org/foo/bar/bar2/interface/renderable
'
],
"
interface extracted
"
);
});
test
(
'
Extract interface before base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the interface
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<link rel='http://www.renderjs.org/rel/interface'
"
+
"
href='./interface/renderable'/>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
interface_list
,
[
'
http://example.org/foo/interface/renderable
'
],
"
interface extracted
"
);
});
test
(
'
Extract interface order
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly keep interface order
var
settings
,
...
...
@@ -307,6 +398,38 @@
"
JS extracted
"
);
});
test
(
'
Extract JS after base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the JS
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
<script src='../lib/qunit/qunit.js'
"
+
"
type='text/javascript'></script>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
required_js_list
,
[
'
http://example.org/foo/bar/lib/qunit/qunit.js
'
],
"
JS extracted
"
);
});
test
(
'
Extract JS before base tag
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly extract the JS
var
settings
,
html
=
"
<html>
"
+
"
<head>
"
+
"
<script src='../lib/qunit/qunit.js'
"
+
"
type='text/javascript'></script>
"
+
"
<base href='./bar/bar2/'></base>
"
+
"
</head></html>
"
;
settings
=
parseGadgetHTML
(
html
,
"
http://example.org/foo/
"
);
deepEqual
(
settings
.
required_js_list
,
[
'
http://example.org/lib/qunit/qunit.js
'
],
"
JS extracted
"
);
});
test
(
'
Extract JS order
'
,
function
()
{
// Check that parseGadgetHTMLDocument correctly keep JS order
var
settings
,
...
...
@@ -345,6 +468,7 @@
'
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
'
+
'
</head><body><p>Non valid XML</p></body></html>
'
,
'
http://example.org/foo/
'
),
{
path
:
"
http://example.org/foo/
"
,
title
:
"
Test non valid XML
"
,
interface_list
:
[],
required_css_list
:
[],
...
...
@@ -4846,6 +4970,96 @@
});
});
test
(
'
can declareGadget relativeurl in HTML
'
,
function
()
{
var
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test12345.html
'
,
html_relative_url2
=
'
test12346.html
'
,
html_url2
=
'
https://example.org/files/qunittest/test12346.html
'
,
spy
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><body><div data-foo='bar'
"
+
"
data-gadget-scope='bar' data-gadget-url='
"
+
html_relative_url2
+
"
'></div></body></html>
"
]);
this
.
server
.
respondWith
(
"
GET
"
,
html_url2
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
raw html
"
]);
spy
=
sinon
.
spy
(
renderJS
,
"
parseGadgetHTMLDocument
"
);
stop
();
expect
(
6
);
gadget
.
declareGadget
(
html_url
)
.
then
(
function
(
g
)
{
equal
(
spy
.
callCount
,
2
);
equal
(
spy
.
firstCall
.
args
[
1
],
html_url
);
equal
(
spy
.
secondCall
.
args
[
1
],
html_url2
);
// Second gadget is a child
return
g
.
getDeclaredGadget
(
"
bar
"
);
})
.
then
(
function
(
g2
)
{
equal
(
g2
.
__path
,
html_url2
);
// The gadget element is the one defined in HTML
equal
(
g2
.
element
.
getAttribute
(
"
data-foo
"
),
"
bar
"
);
// The gadget is public by default
equal
(
g2
.
element
.
innerHTML
,
"
raw html
"
);
})
.
fail
(
function
(
e
)
{
ok
(
false
,
e
);
})
.
always
(
function
()
{
start
();
spy
.
restore
();
});
});
test
(
'
can declareGadget relativeurl in HTML with base tag
'
,
function
()
{
var
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test12345.html
'
,
html_relative_url2
=
'
test12346.html
'
,
html_url2
=
'
https://example.org/files/qunittest/foo/test12346.html
'
,
spy
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><head><base href='./foo/'></head><body><div data-foo='bar'
"
+
"
data-gadget-scope='bar' data-gadget-url='
"
+
html_relative_url2
+
"
'></div></body></html>
"
]);
this
.
server
.
respondWith
(
"
GET
"
,
html_url2
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
raw html
"
]);
spy
=
sinon
.
spy
(
renderJS
,
"
parseGadgetHTMLDocument
"
);
stop
();
expect
(
6
);
gadget
.
declareGadget
(
html_url
)
.
then
(
function
(
g
)
{
equal
(
spy
.
callCount
,
2
);
equal
(
spy
.
firstCall
.
args
[
1
],
html_url
);
equal
(
spy
.
secondCall
.
args
[
1
],
html_url2
);
// Second gadget is a child
return
g
.
getDeclaredGadget
(
"
bar
"
);
})
.
then
(
function
(
g2
)
{
equal
(
g2
.
__path
,
html_url2
);
// The gadget element is the one defined in HTML
equal
(
g2
.
element
.
getAttribute
(
"
data-foo
"
),
"
bar
"
);
// The gadget is public by default
equal
(
g2
.
element
.
innerHTML
,
"
raw html
"
);
})
.
fail
(
function
(
e
)
{
ok
(
false
,
e
);
})
.
always
(
function
()
{
start
();
spy
.
restore
();
});
});
test
(
'
can declareGadget a sandboxed gadget in HTML directly
'
,
function
()
{
var
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test123456.html
'
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment