Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
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
Gabriel Monnerat
renderjs
Commits
164e473d
Commit
164e473d
authored
Dec 15, 2021
by
Gabriel Monnerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
propagate cancel message through all cancel methods
parent
be266052
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
207 additions
and
15 deletions
+207
-15
renderjs.js
renderjs.js
+19
-13
test/renderjs_test.js
test/renderjs_test.js
+188
-2
No files found.
renderjs.js
View file @
164e473d
...
@@ -113,18 +113,18 @@
...
@@ -113,18 +113,18 @@
prevent_default
=
true
;
prevent_default
=
true
;
}
}
function
cancelResolver
()
{
function
cancelResolver
(
msg
)
{
if
((
callback_promise
!==
undefined
)
&&
if
((
callback_promise
!==
undefined
)
&&
(
typeof
callback_promise
.
cancel
===
"
function
"
))
{
(
typeof
callback_promise
.
cancel
===
"
function
"
))
{
callback_promise
.
cancel
();
callback_promise
.
cancel
(
msg
);
}
}
}
}
function
canceller
()
{
function
canceller
(
msg
)
{
if
(
handle_event_callback
!==
undefined
)
{
if
(
handle_event_callback
!==
undefined
)
{
target
.
removeEventListener
(
type
,
handle_event_callback
,
useCapture
);
target
.
removeEventListener
(
type
,
handle_event_callback
,
useCapture
);
}
}
cancelResolver
();
cancelResolver
(
msg
);
}
}
function
itsANonResolvableTrap
(
resolve
,
reject
)
{
function
itsANonResolvableTrap
(
resolve
,
reject
)
{
var
result
;
var
result
;
...
@@ -134,7 +134,9 @@
...
@@ -134,7 +134,9 @@
evt
.
preventDefault
();
evt
.
preventDefault
();
}
}
cancelResolver
();
cancelResolver
(
"
Cancelling previous event (
"
+
evt
.
type
+
"
)
"
);
try
{
try
{
result
=
callback
(
evt
);
result
=
callback
(
evt
);
...
@@ -146,7 +148,7 @@
...
@@ -146,7 +148,7 @@
.
push
(
undefined
,
function
handleEventCallbackError
(
error
)
{
.
push
(
undefined
,
function
handleEventCallbackError
(
error
)
{
// Prevent rejecting the loop, if the result cancelled itself
// Prevent rejecting the loop, if the result cancelled itself
if
(
!
(
error
instanceof
RSVP
.
CancellationError
))
{
if
(
!
(
error
instanceof
RSVP
.
CancellationError
))
{
canceller
();
canceller
(
error
.
toString
()
);
reject
(
error
);
reject
(
error
);
}
}
});
});
...
@@ -442,11 +444,11 @@
...
@@ -442,11 +444,11 @@
return
new
Monitor
();
return
new
Monitor
();
}
}
function
canceller
()
{
function
canceller
(
msg
)
{
var
len
=
promise_list
.
length
,
var
len
=
promise_list
.
length
,
i
;
i
;
for
(
i
=
0
;
i
<
len
;
i
+=
1
)
{
for
(
i
=
0
;
i
<
len
;
i
+=
1
)
{
promise_list
[
i
].
cancel
();
promise_list
[
i
].
cancel
(
msg
);
}
}
// Clean it to speed up other canceller run
// Clean it to speed up other canceller run
promise_list
=
[];
promise_list
=
[];
...
@@ -460,17 +462,17 @@
...
@@ -460,17 +462,17 @@
monitor
.
isRejected
=
true
;
monitor
.
isRejected
=
true
;
monitor
.
rejectedReason
=
rejectedReason
;
monitor
.
rejectedReason
=
rejectedReason
;
resolved
=
true
;
resolved
=
true
;
canceller
();
canceller
(
rejectedReason
.
toString
()
);
return
fail
(
rejectedReason
);
return
fail
(
rejectedReason
);
};
};
},
canceller
);
},
canceller
);
monitor
.
cancel
=
function
cancelMonitor
()
{
monitor
.
cancel
=
function
cancelMonitor
(
msg
)
{
if
(
resolved
)
{
if
(
resolved
)
{
return
;
return
;
}
}
resolved
=
true
;
resolved
=
true
;
promise
.
cancel
();
promise
.
cancel
(
msg
);
promise
.
fail
(
function
rejectMonitorPromise
(
rejectedReason
)
{
promise
.
fail
(
function
rejectMonitorPromise
(
rejectedReason
)
{
monitor
.
isRejected
=
true
;
monitor
.
isRejected
=
true
;
monitor
.
rejectedReason
=
rejectedReason
;
monitor
.
rejectedReason
=
rejectedReason
;
...
@@ -529,7 +531,11 @@
...
@@ -529,7 +531,11 @@
function
deleteGadgetMonitor
(
g
)
{
function
deleteGadgetMonitor
(
g
)
{
if
(
g
.
hasOwnProperty
(
'
__monitor
'
))
{
if
(
g
.
hasOwnProperty
(
'
__monitor
'
))
{
g
.
__monitor
.
cancel
();
g
.
__monitor
.
cancel
(
"
Deleting Gadget Monitor
"
+
"
(
"
+
g
.
element
.
dataset
.
gadgetUrl
+
"
)
"
);
delete
g
.
__monitor
;
delete
g
.
__monitor
;
g
.
__job_list
=
[];
g
.
__job_list
=
[];
}
}
...
@@ -654,7 +660,7 @@
...
@@ -654,7 +660,7 @@
function
runJob
(
gadget
,
name
,
callback
,
argument_list
)
{
function
runJob
(
gadget
,
name
,
callback
,
argument_list
)
{
if
(
gadget
.
__job_dict
.
hasOwnProperty
(
name
))
{
if
(
gadget
.
__job_dict
.
hasOwnProperty
(
name
))
{
gadget
.
__job_dict
[
name
].
cancel
();
gadget
.
__job_dict
[
name
].
cancel
(
name
+
"
: Cancelling previous job
"
);
}
}
var
job_promise
=
ensurePushableQueue
(
callback
,
argument_list
,
gadget
);
var
job_promise
=
ensurePushableQueue
(
callback
,
argument_list
,
gadget
);
gadget
.
__job_dict
[
name
]
=
job_promise
;
gadget
.
__job_dict
[
name
]
=
job_promise
;
...
...
test/renderjs_test.js
View file @
164e473d
...
@@ -3267,6 +3267,108 @@
...
@@ -3267,6 +3267,108 @@
});
});
});
});
test
(
'
check cancellation message after trigger event twice
'
,
function
()
{
var
called
=
false
,
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test600.html
'
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><body></body></html>
"
]);
document
.
getElementById
(
'
qunit-fixture
'
).
innerHTML
=
"
<div></div>
"
;
stop
();
expect
(
1
);
renderJS
.
declareGadgetKlass
(
html_url
)
.
then
(
function
(
Klass
)
{
Klass
.
onEvent
(
'
bar
'
,
function
()
{
return
new
RSVP
.
Promise
(
function
()
{
return
;
},
function
(
error
)
{
if
(
called
)
{
return
;
}
called
=
true
;
equal
(
error
,
"
Cancelling previous event (bar)
"
);
});
});
return
gadget
.
declareGadget
(
html_url
,
{
element
:
document
.
getElementById
(
'
qunit-fixture
'
)
.
querySelector
(
"
div
"
)}
);
})
.
then
(
function
()
{
var
event
=
new
Event
(
"
bar
"
);
document
.
getElementById
(
'
qunit-fixture
'
).
querySelector
(
"
div
"
)
.
dispatchEvent
(
event
);
document
.
getElementById
(
'
qunit-fixture
'
).
querySelector
(
"
div
"
)
.
dispatchEvent
(
event
);
})
.
always
(
function
()
{
start
();
});
});
test
(
'
check message after delete gadget
'
,
function
()
{
var
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test601.html
'
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><body></body></html>
"
]);
document
.
getElementById
(
'
qunit-fixture
'
).
innerHTML
=
"
<div></div>
"
;
stop
();
expect
(
2
);
renderJS
.
declareGadgetKlass
(
html_url
)
.
then
(
function
(
Klass
)
{
Klass
.
declareJob
(
"
runJob1
"
,
function
()
{
return
new
RSVP
.
Promise
(
function
()
{
return
RSVP
.
delay
(
20
);
},
function
(
error
)
{
equal
(
error
,
"
Deleting Gadget Monitor
"
+
"
(https://example.org/files/qunittest/test601.html)
"
);
});
});
Klass
.
onEvent
(
'
bar
'
,
function
()
{
return
new
RSVP
.
Promise
(
function
()
{
return
;
},
function
(
error
)
{
equal
(
error
,
"
Deleting Gadget Monitor
"
+
"
(https://example.org/files/qunittest/test601.html)
"
);
});
});
return
gadget
.
declareGadget
(
html_url
,
{
element
:
document
.
getElementById
(
'
qunit-fixture
'
)
.
querySelector
(
"
div
"
)}
);
})
.
then
(
function
(
g
)
{
var
event
=
new
Event
(
"
bar
"
);
document
.
getElementById
(
'
qunit-fixture
'
).
querySelector
(
"
div
"
)
.
dispatchEvent
(
event
);
g
.
runJob1
();
})
.
then
(
function
()
{
document
.
getElementById
(
'
qunit-fixture
'
)
.
innerHTML
=
""
;
})
.
always
(
function
()
{
start
();
});
});
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// RenderJSGadgetKlass.onLoop
// RenderJSGadgetKlass.onLoop
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
...
@@ -3578,6 +3680,91 @@
...
@@ -3578,6 +3680,91 @@
});
});
});
});
test
(
'
job called twice propage error message
'
,
function
()
{
var
g
,
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test502.html
'
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><body></body></html>
"
]);
document
.
getElementById
(
'
qunit-fixture
'
).
innerHTML
=
"
<div></div>
"
;
stop
();
expect
(
1
);
renderJS
.
declareGadgetKlass
(
html_url
)
.
then
(
function
(
Klass
)
{
Klass
.
declareJob
(
"
runJob1
"
,
function
(
parameter
)
{
return
new
RSVP
.
Promise
(
function
()
{
return
RSVP
.
delay
(
20
);
},
function
(
error
)
{
if
(
parameter
===
"
first
"
)
{
equal
(
error
,
"
runJob1 : Cancelling previous job
"
);
}
});
});
return
gadget
.
declareGadget
(
html_url
,
{
element
:
document
.
getElementById
(
'
qunit-fixture
'
)
.
querySelector
(
"
div
"
)}
);
})
.
then
(
function
(
result
)
{
g
=
result
;
g
.
runJob1
(
"
first
"
);
g
.
runJob1
(
"
second
"
);
})
.
always
(
function
()
{
start
();
});
});
test
(
'
cancel jobs with custom message
'
,
function
()
{
var
gadget
=
new
RenderJSGadget
(),
html_url
=
'
https://example.org/files/qunittest/test502.html
'
;
gadget
.
__sub_gadget_dict
=
{};
this
.
server
.
respondWith
(
"
GET
"
,
html_url
,
[
200
,
{
"
Content-Type
"
:
"
text/html
"
},
"
<html><body></body></html>
"
]);
document
.
getElementById
(
'
qunit-fixture
'
).
innerHTML
=
"
<div></div>
"
;
stop
();
expect
(
2
);
renderJS
.
declareGadgetKlass
(
html_url
)
.
then
(
function
(
Klass
)
{
return
gadget
.
declareGadget
(
html_url
,
{
element
:
document
.
getElementById
(
'
qunit-fixture
'
)
.
querySelector
(
"
div
"
)}
);
})
.
then
(
function
(
result
)
{
var
all
,
msg
=
"
Cancel RSVP.all
"
;
all
=
RSVP
.
all
([
RSVP
.
Promise
(
function
()
{
return
;
},
function
(
error
)
{
equal
(
error
,
msg
);
}),
RSVP
.
Promise
(
function
()
{
return
;
},
function
(
error
)
{
equal
(
error
,
msg
);
})
]);
all
.
cancel
(
"
Cancel RSVP.all
"
);
})
.
always
(
function
()
{
start
();
});
});
test
(
'
job triggered when gadget element added in DOM
'
,
function
()
{
test
(
'
job triggered when gadget element added in DOM
'
,
function
()
{
// Subclass RenderJSGadget to not pollute its namespace
// Subclass RenderJSGadget to not pollute its namespace
var
service1
=
{},
var
service1
=
{},
...
@@ -6933,5 +7120,4 @@
...
@@ -6933,5 +7120,4 @@
});
});
}(
document
,
renderJS
,
QUnit
,
sinon
,
URI
,
URL
,
Event
,
}(
document
,
renderJS
,
QUnit
,
sinon
,
URI
,
URL
,
Event
,
MutationObserver
,
RSVP
));
MutationObserver
,
RSVP
));
\ No newline at end of file
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