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
Xiaowu Zhang
renderjs
Commits
23e359df
Commit
23e359df
authored
Jul 31, 2013
by
Romain Courteaud
🐸
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Iframed gadget prototype.
parent
f72bcfc4
Changes
11
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
841 additions
and
23 deletions
+841
-23
Makefile
Makefile
+6
-1
examples/officejs/catalog.html
examples/officejs/catalog.html
+1
-0
examples/officejs/editor.html
examples/officejs/editor.html
+1
-0
examples/officejs/io.html
examples/officejs/io.html
+1
-0
examples/officejs/jqteditor.html
examples/officejs/jqteditor.html
+1
-0
examples/officejs/officejs.css
examples/officejs/officejs.css
+7
-0
examples/officejs/officejs.html
examples/officejs/officejs.html
+2
-0
examples/officejs/officejs.js
examples/officejs/officejs.js
+2
-2
lib/jschannel/jschannel.js
lib/jschannel/jschannel.js
+614
-0
renderjs.js
renderjs.js
+205
-20
test/index.html
test/index.html
+1
-0
No files found.
Makefile
View file @
23e359df
...
@@ -14,6 +14,7 @@ all: external lint test build doc
...
@@ -14,6 +14,7 @@ all: external lint test build doc
external
:
lib/sinon/sinon.js
\
external
:
lib/sinon/sinon.js
\
lib/sinon/sinon-qunit.js
\
lib/sinon/sinon-qunit.js
\
lib/jquery/jquery.js
\
lib/jquery/jquery.js
\
lib/jschannel/jschannel.js
\
lib/require/require.js
\
lib/require/require.js
\
lib/qunit/qunit.js
\
lib/qunit/qunit.js
\
lib/qunit/qunit.css
\
lib/qunit/qunit.css
\
...
@@ -35,6 +36,10 @@ lib/jquery/jquery.js:
...
@@ -35,6 +36,10 @@ lib/jquery/jquery.js:
@
mkdir
-p
$
(
@D
)
@
mkdir
-p
$
(
@D
)
curl
-s
-o
$@
http://code.jquery.com/jquery-2.0.3.js
curl
-s
-o
$@
http://code.jquery.com/jquery-2.0.3.js
lib/jschannel/jschannel.js
:
@
mkdir
-p
$
(
@D
)
curl
-s
-o
$@
http://mozilla.github.io/jschannel/src/jschannel.js
lib/require/require.js
:
lib/require/require.js
:
@
mkdir
-p
$
(
@D
)
@
mkdir
-p
$
(
@D
)
curl
-s
-o
$@
http://requirejs.org/docs/release/2.1.8/comments/require.js
curl
-s
-o
$@
http://requirejs.org/docs/release/2.1.8/comments/require.js
...
@@ -80,4 +85,4 @@ lint: ${BUILDDIR}/$(RENDERJS).lint
...
@@ -80,4 +85,4 @@ lint: ${BUILDDIR}/$(RENDERJS).lint
doc
:
doc
:
$(YUIDOC_CMD)
.
$(YUIDOC_CMD)
.
clean
:
clean
:
rm
-rf
$(RENDERJS_MIN)
${BUILDDIR}
lib/sinon lib/jquery lib/qunit lib/jio lib/require
rm
-rf
$(RENDERJS_MIN)
${BUILDDIR}
lib/sinon lib/jquery lib/
jschannel lib/
qunit lib/jio lib/require
examples/officejs/catalog.html
View file @
23e359df
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
<title>
Catalog Gadget
</title>
<title>
Catalog Gadget
</title>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"catalog.js"
type=
"text/javascript"
></script>
<script
src=
"catalog.js"
type=
"text/javascript"
></script>
</head>
</head>
...
...
examples/officejs/editor.html
View file @
23e359df
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
<title>
Simple Text Editor Gadget
</title>
<title>
Simple Text Editor Gadget
</title>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"editor.js"
type=
"text/javascript"
></script>
<script
src=
"editor.js"
type=
"text/javascript"
></script>
<link
rel=
"http://www.renderjs.org/rel/interface"
<link
rel=
"http://www.renderjs.org/rel/interface"
...
...
examples/officejs/io.html
View file @
23e359df
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
<title>
IO
</title>
<title>
IO
</title>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jio/md5.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jio/md5.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jio/jio.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jio/jio.js"
type=
"text/javascript"
></script>
...
...
examples/officejs/jqteditor.html
View file @
23e359df
...
@@ -4,6 +4,7 @@
...
@@ -4,6 +4,7 @@
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
/>
<link
rel=
"stylesheet"
href=
"jqte/jquery-te-1.4.0.css"
/>
<link
rel=
"stylesheet"
href=
"jqte/jquery-te-1.4.0.css"
/>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"jqte/jquery-te-1.4.0.js"
type=
"text/javascript"
></script>
<script
src=
"jqte/jquery-te-1.4.0.js"
type=
"text/javascript"
></script>
<script
src=
"jqteditor.js"
type=
"text/javascript"
></script>
<script
src=
"jqteditor.js"
type=
"text/javascript"
></script>
...
...
examples/officejs/officejs.css
0 → 100644
View file @
23e359df
iframe
{
border
:
0
;
margin
:
0
;
padding
:
0
;
width
:
80%
;
height
:
100px
;
}
examples/officejs/officejs.html
View file @
23e359df
...
@@ -5,7 +5,9 @@
...
@@ -5,7 +5,9 @@
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1"
>
<title>
Office JS
</title>
<title>
Office JS
</title>
<link
rel=
"stylesheet"
href=
"../../lib/jqm/jquery.mobile.css"
/>
<link
rel=
"stylesheet"
href=
"../../lib/jqm/jquery.mobile.css"
/>
<link
rel=
"stylesheet"
href=
"officejs.css"
/>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jquery/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"officejs.js"
type=
"text/javascript"
></script>
<script
src=
"officejs.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jqm/jquery.mobile.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jqm/jquery.mobile.js"
type=
"text/javascript"
></script>
...
...
examples/officejs/officejs.js
View file @
23e359df
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
// Load 1 editor and 1 IO and plug them
// Load 1 editor and 1 IO and plug them
$
.
when
(
$
.
when
(
g
.
declareGadget
(
editor_list
[
0
].
path
,
editor_a_context
),
g
.
declare
Iframed
Gadget
(
editor_list
[
0
].
path
,
editor_a_context
),
g
.
declareGadget
(
io_list
[
0
].
path
,
io_a_context
),
g
.
declareGadget
(
io_list
[
0
].
path
,
io_a_context
),
"
officejs
"
).
done
(
attachIOToEditor
);
"
officejs
"
).
done
(
attachIOToEditor
);
...
@@ -49,7 +49,7 @@
...
@@ -49,7 +49,7 @@
'
data-iconpos="left">
'
+
editor_definition
.
title
+
'
</a>
'
);
'
data-iconpos="left">
'
+
editor_definition
.
title
+
'
</a>
'
);
panel_context
.
find
(
'
a
'
).
last
().
click
(
function
()
{
panel_context
.
find
(
'
a
'
).
last
().
click
(
function
()
{
$
.
when
(
$
.
when
(
g
.
declareGadget
(
editor_definition
.
path
,
editor_a_context
),
g
.
declare
Iframed
Gadget
(
editor_definition
.
path
,
editor_a_context
),
g
.
declareGadget
(
io_list
[
0
].
path
,
io_a_context
),
g
.
declareGadget
(
io_list
[
0
].
path
,
io_a_context
),
"
officejs
"
).
done
(
attachIOToEditor
);
"
officejs
"
).
done
(
attachIOToEditor
);
});
});
...
...
lib/jschannel/jschannel.js
0 → 100644
View file @
23e359df
This diff is collapsed.
Click to expand it.
renderjs.js
View file @
23e359df
/*! RenderJs v0.2 */
/*! RenderJs v0.2 */
/*global $, jQuery, localStorage, jIO, window, document, DOMParser */
/*global $, jQuery, localStorage, jIO, window, document, DOMParser
, Channel
*/
/*jslint evil: true, indent: 2, maxerr: 3, maxlen: 79 */
/*jslint evil: true, indent: 2, maxerr: 3, maxlen: 79 */
"
use strict
"
;
"
use strict
"
;
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
* renderJs - Generic Gadget library renderer.
* renderJs - Generic Gadget library renderer.
* http://www.renderjs.org/documentation
* http://www.renderjs.org/documentation
*/
*/
(
function
(
document
,
window
,
$
,
DOMParser
)
{
(
function
(
document
,
window
,
$
,
DOMParser
,
Channel
,
undefined
)
{
var
gadget_model_dict
=
{},
var
gadget_model_dict
=
{},
javascript_registration_dict
=
{},
javascript_registration_dict
=
{},
...
@@ -137,9 +137,133 @@
...
@@ -137,9 +137,133 @@
return
this
.
html
;
return
this
.
html
;
});
});
// Class inheritance
function
RenderJSEmbeddedGadget
()
{
RenderJSGadget
.
call
(
this
);
}
RenderJSEmbeddedGadget
.
ready_list
=
[];
RenderJSEmbeddedGadget
.
declareMethod
=
RenderJSGadget
.
declareMethod
;
RenderJSEmbeddedGadget
.
ready
=
RenderJSGadget
.
ready
;
RenderJSEmbeddedGadget
.
prototype
=
new
RenderJSGadget
();
RenderJSEmbeddedGadget
.
prototype
.
constructor
=
RenderJSEmbeddedGadget
;
// XXX Declare method in same non root url gadget
RenderJSEmbeddedGadget
.
declareMethod
=
function
(
name
,
callback
)
{
RenderJSEmbeddedGadget
.
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
name
,
});
return
RenderJSGadget
.
declareMethod
.
apply
(
this
,
[
name
,
callback
]);
};
// Class inheritance
function
RenderJSIframeGadget
()
{
RenderJSGadget
.
call
(
this
);
}
RenderJSIframeGadget
.
ready_list
=
[];
RenderJSIframeGadget
.
declareMethod
=
RenderJSGadget
.
declareMethod
;
RenderJSIframeGadget
.
ready
=
RenderJSGadget
.
ready
;
RenderJSIframeGadget
.
prototype
=
new
RenderJSGadget
();
RenderJSIframeGadget
.
prototype
.
constructor
=
RenderJSIframeGadget
;
RenderJSGadget
.
prototype
.
declareIframedGadget
=
function
(
url
,
jquery_context
)
{
var
previous_loading_gadget_promise
=
loading_gadget_promise
,
next_loading_gadget_deferred
=
$
.
Deferred
();
// Change the global variable to update the loading queue
loading_gadget_promise
=
next_loading_gadget_deferred
.
promise
();
// Wait for previous gadget loading to finish first
previous_loading_gadget_promise
.
always
(
function
()
{
// Instanciate iframe
var
gadget
=
new
RenderJSIframeGadget
();
gadget
.
context
=
jquery_context
;
// XXX Do not set this info on the instance!
gadget
.
path
=
url
;
// XXX onload onerror
// $('iframe').load(function() {
// RunAfterIFrameLoaded();
// });
// Create the iframe
if
(
gadget
.
context
!==
undefined
)
{
$
(
gadget
.
context
).
html
(
// Use encodeURI to prevent XSS
'
<iframe src="
'
+
encodeURI
(
url
)
+
'
"></iframe>
'
);
gadget
.
chan
=
Channel
.
build
({
window
:
gadget
.
context
.
find
(
'
iframe
'
).
first
()[
0
].
contentWindow
,
origin
:
"
*
"
,
scope
:
"
renderJS
"
});
// gadget.getTitle = function () {
// var dfr = $.Deferred();
// gadget.chan.call({
// method: "getTitle",
// success: function (v) {
// dfr.resolve(v);
// }
// });
// return dfr.promise();
// };
gadget
.
chan
.
bind
(
"
declareMethod
"
,
function
(
trans
,
method_name
)
{
console
.
log
(
"
Receive declaration
"
+
method_name
+
"
on
"
+
gadget
.
path
);
gadget
[
method_name
]
=
function
()
{
var
dfr
=
$
.
Deferred
();
gadget
.
chan
.
call
({
method
:
"
methodCall
"
,
params
:
[
method_name
,
Array
.
prototype
.
slice
.
call
(
arguments
,
0
)],
success
:
function
()
{
dfr
.
resolveWith
(
gadget
,
arguments
);
}
// XXX Error callback
});
return
dfr
.
promise
();
};
});
// Wait for the iframe to be loaded before continuing
gadget
.
chan
.
bind
(
"
ready
"
,
function
(
trans
)
{
console
.
log
(
gadget
.
path
+
"
is ready
"
);
next_loading_gadget_deferred
.
resolve
(
gadget
);
});
gadget
.
chan
.
bind
(
"
failed
"
,
function
(
trans
)
{
next_loading_gadget_deferred
.
reject
();
});
}
else
{
next_loading_gadget_deferred
.
reject
();
}
});
loading_gadget_promise
// Drop the current loading klass info used by selector
.
done
(
function
()
{
gadget_loading_klass
=
undefined
;
})
.
fail
(
function
()
{
gadget_loading_klass
=
undefined
;
})
.
done
(
function
(
created_gadget
)
{
$
.
each
(
created_gadget
.
constructor
.
ready_list
,
function
(
i
,
callback
)
{
callback
.
apply
(
created_gadget
);
});
});
return
loading_gadget_promise
;
};
RenderJSGadget
.
prototype
.
declareGadget
=
function
(
url
,
jquery_context
)
{
RenderJSGadget
.
prototype
.
declareGadget
=
function
(
url
,
jquery_context
)
{
var
loaded
=
false
,
var
previous_loading_gadget_promise
=
loading_gadget_promise
,
previous_loading_gadget_promise
=
loading_gadget_promise
,
next_loading_gadget_deferred
=
$
.
Deferred
();
next_loading_gadget_deferred
=
$
.
Deferred
();
// Change the global variable to update the loading queue
// Change the global variable to update the loading queue
...
@@ -515,6 +639,9 @@
...
@@ -515,6 +639,9 @@
if
(
gadget_model_dict
.
hasOwnProperty
(
url
))
{
if
(
gadget_model_dict
.
hasOwnProperty
(
url
))
{
throw
new
Error
(
"
bootstrap should not be called twice
"
);
throw
new
Error
(
"
bootstrap should not be called twice
"
);
}
}
loading_gadget_promise
=
loading_gadget_deferred
.
promise
();
if
(
window
.
self
===
window
.
top
)
{
// XXX Copy/Paste from declareGadgetKlass
// XXX Copy/Paste from declareGadgetKlass
tmp_constructor
=
function
()
{
tmp_constructor
=
function
()
{
RenderJSGadget
.
call
(
this
);
RenderJSGadget
.
call
(
this
);
...
@@ -529,9 +656,65 @@
...
@@ -529,9 +656,65 @@
// Create the root gadget instance and put it in the loading stack
// Create the root gadget instance and put it in the loading stack
root_gadget
=
new
gadget_model_dict
[
url
]();
root_gadget
=
new
gadget_model_dict
[
url
]();
}
else
{
// Create the root gadget instance and put it in the loading stack
tmp_constructor
=
RenderJSEmbeddedGadget
;
root_gadget
=
new
RenderJSEmbeddedGadget
();
RenderJSEmbeddedGadget
.
root_gadget
=
root_gadget
;
// Create the communication channel
root_gadget
.
chan
=
Channel
.
build
({
window
:
window
.
parent
,
origin
:
"
*
"
,
scope
:
"
renderJS
"
});
root_gadget
.
chan
.
bind
(
"
methodCall
"
,
function
(
trans
,
v
)
{
root_gadget
[
v
[
0
]].
apply
(
root_gadget
,
v
[
1
]).
done
(
function
(
g
)
{
trans
.
complete
(
g
);
});
trans
.
delayReturn
(
true
);
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getInterfaceList
"
,
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getRequiredCSSList
"
,
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getRequiredJSList
"
,
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getPath
"
,
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getTitle
"
,
});
root_gadget
.
chan
.
notify
({
method
:
"
declareMethod
"
,
params
:
"
getHTML
"
,
});
// Surcharge declareMethod to inform parent window
// XXX TODO
// Inform parent window that gadget is correctly loaded
loading_gadget_promise
.
done
(
function
()
{
// XXX Wait for all previous declaration before ending ready message
setTimeout
(
function
()
{
root_gadget
.
chan
.
notify
({
method
:
"
ready
"
});
},
100
);
}).
fail
(
function
()
{
root_gadget
.
chan
.
notify
({
method
:
"
failed
"
});
});
}
gadget_loading_klass
=
tmp_constructor
;
gadget_loading_klass
=
tmp_constructor
;
loading_gadget_promise
=
loading_gadget_deferred
.
promise
();
...
@@ -560,12 +743,14 @@
...
@@ -560,12 +743,14 @@
});
});
gadget_loading_klass
=
undefined
;
gadget_loading_klass
=
undefined
;
loading_gadget_deferred
.
resolve
();
loading_gadget_deferred
.
resolve
();
}).
fail
(
function
()
{
loading_gadget_deferred
.
reject
();
});
});
});
});
}
}
bootstrap
();
bootstrap
();
}(
document
,
window
,
jQuery
,
DOMParser
));
}(
document
,
window
,
jQuery
,
DOMParser
,
Channel
));
///**
///**
...
...
test/index.html
View file @
23e359df
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
<script
src=
"../lib/qunit/qunit.js"
type=
"text/javascript"
></script>
<script
src=
"../lib/qunit/qunit.js"
type=
"text/javascript"
></script>
<script
src=
"../lib/sinon/sinon.js"
type=
"text/javascript"
></script>
<script
src=
"../lib/sinon/sinon.js"
type=
"text/javascript"
></script>
<script
src=
"../sinon-qunit.js"
type=
"text/javascript"
></script>
<script
src=
"../sinon-qunit.js"
type=
"text/javascript"
></script>
<script
src=
"../../lib/jschannel/jschannel.js"
type=
"text/javascript"
></script>
<script
src=
"../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"../renderjs.js"
type=
"text/javascript"
></script>
<script
src=
"renderjs_test2.js"
type=
"text/javascript"
></script>
<script
src=
"renderjs_test2.js"
type=
"text/javascript"
></script>
</head>
</head>
...
...
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