Commit dfe76e42 authored by JC Brand's avatar JC Brand

Merge branch 'master' into mockup

Conflicts:
	converse.css
	mockup.html
parents 0157b237 f4eeb504
......@@ -2,5 +2,5 @@ language: node_js
node_js:
- "0.10"
before_script:
- "./node_modules/.bin/bower update"
- "./node_modules/.bin/grunt fetch"
script: grunt test
Changelog
=========
0.5.3 (Unreleased)
0.6.0 (Unreleased)
------------------
- #39 Documentation for minifying JS is wrong. [jcbrand]
- #41 prebind and show_controlbox_by_default true fails. [jcbrand]
- With prebinding, attaching to the connection now happens inside Converse and
not as a separate step after initialization. [jcbrand]
- Register presence and message handlers before fetching the roster. Otherwise
some presence notifications might be missed. [jcbrand]
- Add a debug option (logs to the browser console). [jcbrand]
- Use font icons from http://icomoon.io [jcbrand]
- Added a static mockup to aid CSS/design process. [jcbrand]
0.5.2 (2013-08-05)
------------------
......
......@@ -95,7 +95,7 @@ module.exports = function(grunt) {
var done = this.async();
var child_process = require('child_process');
var exec = child_process.exec;
exec('bower update && cd ./components/strophe && make normal',
exec('./node_modules/.bin/bower update && cd ./components/strophe && make normal',
function (err, stdout, stderr) {
if (err) {
grunt.log.write('build failed with error code '+err.code);
......@@ -106,7 +106,7 @@ module.exports = function(grunt) {
});
});
grunt.registerTask('minify', 'Create a new release', ['requirejs', 'cssmin']);
grunt.registerTask('minify', 'Create a new release', ['cssmin', 'requirejs']);
grunt.registerTask('check', 'Perform all checks (e.g. before releasing)', function () {
grunt.task.run('jshint', 'test');
......
......@@ -2,6 +2,9 @@
converse.js
===========
.. figure:: https://api.travis-ci.org/jcbrand/converse.js.png?branch=master
:alt: Build Status
Converse.js_ is a web based `XMPP/Jabber`_ instant messaging client.
It enables you to add chat functionality to your website, independent of any
......
{
"name": "converse",
"version": "0.5.2",
"version": "0.6.0",
"devDependencies": {
"jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x"
},
......
......@@ -110,11 +110,11 @@ span.spinner.hor_centered {
.chatroom .participants {
float: left;
width: auto;
height: 272px;
background-color: white;
overflow: auto;
border-left: 1px solid #AAA;
max-width: 99px;
}
.participants ul.participant-list li {
......@@ -152,6 +152,7 @@ ul.participant-list li.moderator {
font-size: 13px;
color: rgb(79, 79, 79);
height:173px;
width: 190px;
overflow-y:auto;
border: 0;
background-color: #ffffff;
......@@ -175,6 +176,10 @@ ul.participant-list li.moderator {
padding-right: 3px;
}
.chat-message-content {
word-wrap: break-word;
}
.chat-message-them {
color: #F62817;
}
......@@ -577,6 +582,10 @@ dd.available-chatroom:hover a.room-info {
border-radius: 4px;
}
.chatbox {
width: 200px;
}
.chatroom {
width: 300px;
}
......
This diff is collapsed.
This diff is collapsed.
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 75b256f63edf933c138244d36b1fd86c
config: cc4e774ae6c30c8f75f9540598d47e5a
tags: fbb0d17656682115ca4d033fb2f83ba1
......@@ -188,15 +188,17 @@ Jack Moffitt has a great `blogpost`_ about this and even provides an `example Dj
.. Note::
If you want to enable single session support, make sure to pass **prebind: true**
when you call **converse.initialize** (see ./index.html).
Additionally you need to pass in valid **jid**, **sid**, **rid** and
**bosh_service_url** values.
When you authenticate to the XMPP server on your backend, you'll receive two
tokens, RID (request ID) and SID (session ID).
These tokens then need to be passed back to the javascript running in your
browser, where you will need them attach to the existing session.
browser, where you will need them to attach to the existing session.
You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to you server and ask it to return them for you.
XMLHttpRequest call to your server and ask it to return them for you.
Below is one example of how this could work. An Ajax call is made to the
relative URL **/prebind** and it expects to receive JSON data back.
......@@ -204,26 +206,19 @@ relative URL **/prebind** and it expects to receive JSON data back.
::
$.getJSON('/prebind', function (data) {
var connection = new Strophe.Connection(converse.bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
converse.onConnected(connection)
}
});
}
converse.initialize({
prebind: true,
bosh_service_url: data.bosh_service_url,
jid: data.jid,
sid: data.sid,
rid: data.rid
});
);
**Here's what's happening:**
The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
BOSH connection manager is already set as a configuration setting on the
*converse* object (see ./main.js), so we can reuse it from there.
A new Strophe.Connection object is instantiated and then *attach* is called with
the user's JID, the necessary tokens and a callback function.
In the callback function, you call *converse.onConnected* together with the
connection object.
The JSON data contains the user's JID (jabber ID), RID, SID and the URL to the
BOSH connection manager.
Facebook integration
......@@ -463,25 +458,36 @@ a middle man between HTTP and XMPP.
See `here <http://metajack.im/2008/09/08/which-bosh-server-do-you-need>`_ for more information.
debug
-----
If set to true, debugging output will be logged to the browser console.
fullname
--------
If you are using prebinding, you need to specify the fullname of the currently
logged in user.
If you are using prebinding, can specify the fullname of the currently
logged in user, otherwise the user's vCard will be fetched.
hide_muc_server
---------------
Default = False
Default = false
Hide the ``server`` input field of the form inside the ``Room`` panel of the
controlbox. Useful if you want to restrict users to a specific XMPP server of
your choosing.
i18n
----
Specify the locale/language. The language must be in the ``locales`` object. Refer to
``./locale/locales.js`` to see which locales are supported.
prebind
--------
Default = False
Default = false
Use this option when you want to attach to an existing XMPP connection that was
already authenticated (usually on the backend before page load).
......@@ -489,26 +495,19 @@ already authenticated (usually on the backend before page load).
This is useful when you don't want to render the login form on the chat control
box with each page load.
When set to true, you'll need to make sure that the onConnected method is
called, and passed to it a Strophe connection object.
For prebinding to work, your backend server must authenticate for you, and
then return a JID (jabber ID), SID (session ID) and RID (Request ID).
Besides requiring the back-end to authenticate you, you'll also
have to write a Javascript snippet to attach to the set up connection::
If you set ``prebind`` to ``true``, you have to make sure to also pass in these
values as ``jid``, ``sid``, ``rid``.
$.JSON({
'url': 'mysite.com/xmpp-authenticate',
'success': function (data) {
connection = new Strophe.Connection(bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, converse.onConnected);
}
Additionally, you have to specify ``bosh_service_url``.
The backend must authenticate for you, and then return a SID (session ID) and
RID (Request ID), which you use when you attach to the connection.
show_controlbox_by_default
--------------------------
Default = False
Default = false
The "controlbox" refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.
......@@ -537,40 +536,27 @@ be used.
Minification
============
Minifying Javascript
====================
Minifying Javascript and CSS
============================
Please make sure to read the section `Development`_ and that you have installed
all development dependencies (long story short, you can run ``npm install``
and then ``grunt fetch``).
We use `require.js`_ to keep track of *Converse.js* and its dependencies and to
to bundle them together in a single minified file fit for deployment to a
production site.
To use the require.js's optimization tool, you'll need Node and it's package
manager, NPM.
You can then install install require.js for Node like so:
::
npm install requirejs
The minified javascript file is then created like this:
To minify the Javascript and CSS, run the following command:
::
r.js -o build.js
You should now have a new minified file (the name which is specified in build.js).
grunt minify
Javascript will be bundled and minified via `require.js`_'s optimization tool.
You can `read more about require.js's optimizer here`_.
Minifying CSS
=============
CSS can be minimized with Yahoo's yuicompressor tool:
::
yui-compressor --type=css converse.css -o converse.min.css
CSS is minified via `cssmin <https://github.com/gruntjs/grunt-contrib-cssmin>`_.
============
......
......@@ -32,4 +32,11 @@ h1 a {
ul {
margin-bottom: 5px;
}
tt.literal {
color: #222;
background-color: #fff;
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
font-size: 14px;
}
\ No newline at end of file
......@@ -9,7 +9,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; Converse.js 0.5.1 documentation</title>
<title>Index &mdash; Converse.js 0.5.3 documentation</title>
<link rel="stylesheet" href="_static/stylesheet.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
......@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.5.1',
VERSION: '0.5.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
......@@ -26,7 +26,7 @@
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Converse.js 0.5.1 documentation" href="index.html" />
<link rel="top" title="Converse.js 0.5.3 documentation" href="index.html" />
</head>
<body>
<div id="header_wrap" class="outer">
......@@ -51,7 +51,7 @@
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
accesskey="I">index</a></li>
<li><a href="index.html">Converse.js 0.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li>
</ul>
</div>
<section id="main_content" class="inner">
......@@ -80,7 +80,7 @@
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
>index</a></li>
<li><a href="index.html">Converse.js 0.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li>
</ul>
</div>
</div>
......
This diff is collapsed.
# Sphinx inventory version 2
# Project: Converse.js
# Version: 0.5.1
# Version: 0.5.3
# The remainder of this file is compressed using zlib.
xm
{"];
......
......@@ -7,7 +7,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; Converse.js 0.5.1 documentation</title>
<title>Search &mdash; Converse.js 0.5.3 documentation</title>
<link rel="stylesheet" href="_static/stylesheet.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
......@@ -15,7 +15,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.5.1',
VERSION: '0.5.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
......@@ -25,7 +25,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="top" title="Converse.js 0.5.1 documentation" href="index.html" />
<link rel="top" title="Converse.js 0.5.3 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
......@@ -55,7 +55,7 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li><a href="index.html">Converse.js 0.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li>
</ul>
</div>
<section id="main_content" class="inner">
......@@ -100,7 +100,7 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li><a href="index.html">Converse.js 0.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li>
</ul>
</div>
</div>
......
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,punjab:0,specif:0,present:0,under:0,spec:0,string:0,fals:0,account:0,facebook:0,jack:0,veri:0,tri:0,chatpanel:0,list:0,sane:0,div:0,pleas:0,prevent:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,click:0,even:0,index:0,what:0,hide:0,section:0,current:0,"public":0,version:0,"new":0,net:0,method:0,widget:0,themselv:0,gener:0,here:0,bodi:0,let:0,strong:0,modifi:0,valu:0,box:0,great:0,convers:0,mysit:0,ajax:0,fetch:0,implement:0,sorri:0,via:0,repositori:0,extra:0,solut:0,prefer:0,put:0,href:0,org:0,auto_list_room:0,instal:0,getsess:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,few:0,stylesheet:0,call:0,recommend:0,type:0,until:0,toggl:0,more:0,peopl:0,yahoo:0,notic:0,site:0,particular:0,must:0,none:0,room:0,work:0,xhr:0,can:0,lc_messag:0,purpos:0,root:0,blogpost:0,control:0,quickstart:0,give:0,share:0,templat:0,tag:0,proprietari:0,explor:0,onlin:0,occup:0,end:0,goal:0,thing:0,write:0,how:0,sid:0,roster:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,haven:0,after:0,usabl:0,befor:0,underscor:0,data:0,demonstr:0,man:0,github:0,practic:0,bind:0,show_controlbox_by_default:0,element:0,caus:0,callback:0,parti:0,mechan:0,order:0,feedback:0,chatbox:0,xmpp:0,over:0,becaus:0,through:0,streamlin:0,snippet:0,jid:0,"8147a27e4a7f9b55ffc85c2683f9529a":0,directli:0,fit:0,fix:0,"static":0,pend:0,hidden:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,name:0,edit:0,authent:0,token:0,ejabberd:0,each:0,side:0,mean:0,domain:0,individu:0,realli:0,legwork:0,connect:0,happen:0,extract:0,special:0,variabl:0,shown:0,"3rd":0,space:0,miss:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,reason:0,releas:0,succesfulli:0,afterward:0,could:0,ask:0,keep:0,yui:0,turn:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,instruct:0,alreadi:0,done:0,owner:0,custom:0,jabber:0,differ:0,script:0,top:0,messag:0,attach:0,attack:0,master:0,jed:0,jcbrand:0,"final":0,luckili:0,option:0,tool:0,specifi:0,compressor:0,part:0,pars:0,grunt:0,than:0,serv:0,jump:0,kind:0,bloat:0,provid:0,remov:0,exampl:0,bridg:0,browser:0,pre:0,"function":0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,django:0,bosh_service_url:0,prebind:0,min:0,latter:0,note:0,also:0,contact:0,take:0,which:0,singl:0,sure:0,though:0,unsur:0,object:0,most:0,deploi:0,homepag:0,"class":0,don:0,url:0,request:0,doe:0,runtim:0,bower:0,usual:0,xdomainrequest:0,devdepend:0,show:0,german:0,text:0,session:0,fine:0,find:0,help:0,onli:0,exactli:0,locat:0,just:0,configur:0,apach:0,should:0,folder:0,local:0,meant:0,count:0,get:0,soon:0,opkod:0,nativ:0,cannot:0,requir:0,enabl:0,emb:0,mainspec:0,patch:0,reload:0,bad:0,integr:0,contain:0,where:0,set:0,habit:0,stroph:0,see:0,close:0,page:0,statu:0,said:0,extend:0,state:0,reus:0,between:0,experi:0,jasmin:0,screen:0,attribut:0,appreci:0,kei:0,hide_muc_serv:0,javascript:0,style:0,job:0,bosh:0,"5e64a30272af065bd72258c565a03f2f":0,both:0,cor:0,instant:0,shortliv:0,conversej:0,myself:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,instanti:0,pot:0,backend:0,quit:0,sucessfulli:0,rebuild:0,compon:0,json:0,much:0,besid:0,subscrib:0,blob:0,session_kei:0,convert:0,minifi:0,togeth:0,i18n:0,those:0,multi:0,main:0,look:0,servic:0,plugin:0,defin:0,abov:0,error:0,hightlight:0,chat:0,helper:0,demo:0,auto_subscrib:0,non:0,inform:0,rid:0,conn:0,develop:0,open:0,minim:0,receiv:0,media:0,make:0,minif:0,cross:0,same:0,read:0,onconnectfacebook:0,html:0,chatroom:0,document:0,medit:0,complet:0,signon:0,http:0,webserv:0,optim:0,upon:0,someon:0,hand:0,"50kb":0,user:0,xhr_user_search:0,recent:0,stateless:0,markup:0,well:0,without:0,command:0,wherebi:0,thi:0,choos:0,latest:0,plural_form:0,protocol:0,firstnam:0,when:0,jshint:0,languag:0,web:0,xmlhttprequest:0,had:0,onconnect:0,add:0,other:0,non_amd:0,input:0,yuicompressor:0,match:0,build:0,applic:0,format:0,webpag:0,amd:0,nginx:0,traffic:0,know:0,background:0,like:0,xss:0,backbon:0,success:0,server:0,collect:0,benefit:0,necessari:0,either:0,manag:0,facebookconnect:0,deal:0,nplural:0,some:0,back:0,librari:0,bottom:0,deploy:0,achiev:0,track:0,overcom:0,localhost:0,refer:0,who:0,run:0,host:0,although:0,panel:0,src:0,about:0,controlbox:0,unfortun:0,act:0,own:0,curiou:0,encod:0,automat:0,wrap:0,your:0,merg:0,log:0,wai:0,transfer:0,support:0,submit:0,happi:0,avail:0,includ:0,lot:0,suit:0,"var":0,analysi:0,head:0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,line:0,inlin:0,"true":0,bug:0,congratul:0,longer:0,info:0,pull:0,made:0,dirti:0,locale_data:0,possibl:0,"default":0,bugfix:0,displai:0,asynchron:0,below:0,tightli:0,otherwis:0,problem:0,expect:0,featur:0,creat:0,doesn:0,msgmerg:0,exist:0,file:0,face:0,check:0,want:0,tip:0,detail:0,gettext:0,field:0,valid:0,rememb:0,test:0,you:0,nice:0,node:0,intend:0,stai:0,lang:0,requirej:0,directori:0,getjson:0,potenti:0,time:0},objtypes:{},titles:["Quickstart (to get a demo up and running)"],objnames:{},filenames:["index"]})
\ No newline at end of file
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,punjab:0,present:0,under:0,spec:0,string:0,fals:0,account:0,facebook:0,jack:0,veri:0,tri:0,chatpanel:0,list:0,sane:0,div:0,pleas:0,prevent:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,click:0,even:0,index:0,what:0,hide:0,section:0,current:0,"public":0,version:0,"new":0,net:0,method:0,widget:0,themselv:0,gener:0,here:0,bodi:0,let:0,strong:0,modifi:0,valu:0,box:0,great:0,convers:0,ajax:0,fetch:0,implement:0,sorri:0,via:0,repositori:0,extra:0,solut:0,prefer:0,put:0,href:0,org:0,auto_list_room:0,instal:0,should:0,getsess:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,few:0,stylesheet:0,call:0,recommend:0,type:0,until:0,toggl:0,more:0,peopl:0,notic:0,site:0,particular:0,vcard:0,must:0,none:0,room:0,work:0,xhr:0,can:0,lc_messag:0,purpos:0,root:0,blogpost:0,control:0,quickstart:0,give:0,share:0,templat:0,tag:0,proprietari:0,explor:0,onlin:0,occup:0,end:0,goal:0,thing:0,write:0,how:0,sid:0,roster:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,underscor:0,data:0,demonstr:0,man:0,"short":0,practic:0,bind:0,show_controlbox_by_default:0,element:0,caus:0,inform:0,parti:0,mechan:0,order:0,feedback:0,chatbox:0,xmpp:0,over:0,becaus:0,through:0,streamlin:0,snippet:0,jid:0,"8147a27e4a7f9b55ffc85c2683f9529a":0,directli:0,fit:0,fix:0,"static":0,pend:0,hidden:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,edit:0,authent:0,token:0,ejabberd:0,each:0,debug:0,side:0,mean:0,domain:0,individu:0,realli:0,legwork:0,connect:0,happen:0,extract:0,special:0,variabl:0,shown:0,"3rd":0,space:0,miss:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,reason:0,releas:0,succesfulli:0,afterward:0,could:0,ask:0,keep:0,turn:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,instruct:0,alreadi:0,done:0,submit:0,owner:0,custom:0,jabber:0,differ:0,script:0,top:0,attack:0,messag:0,attach:0,stori:0,master:0,jed:0,jcbrand:0,"final":0,luckili:0,consol:0,option:0,tool:0,specifi:0,github:0,pars:0,grunt:0,haven:0,serv:0,jump:0,kind:0,bloat:0,provid:0,remov:0,exampl:0,bridg:0,browser:0,pre:0,"function":0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,django:0,bosh_service_url:0,prebind:0,min:0,latter:0,note:0,also:0,contact:0,take:0,which:0,singl:0,sure:0,though:0,unsur:0,who:0,most:0,deploi:0,homepag:0,"class":0,don:0,url:0,request:0,doe:0,part:0,runtim:0,bower:0,usual:0,xdomainrequest:0,devdepend:0,show:0,german:0,text:0,session:0,fine:0,find:0,help:0,onli:0,exactli:0,locat:0,just:0,configur:0,apach:0,than:0,folder:0,local:0,meant:0,count:0,get:0,soon:0,opkod:0,nativ:0,cannot:0,requir:0,enabl:0,emb:0,mainspec:0,patch:0,reload:0,bad:0,integr:0,contain:0,where:0,set:0,habit:0,stroph:0,see:0,close:0,page:0,statu:0,said:0,kei:0,state:0,between:0,experi:0,jasmin:0,hide_muc_serv:0,attribut:0,appreci:0,extend:0,screen:0,javascript:0,style:0,job:0,bosh:0,"5e64a30272af065bd72258c565a03f2f":0,both:0,cor:0,instant:0,shortliv:0,conversej:0,myself:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,pot:0,backend:0,quit:0,sucessfulli:0,addition:0,rebuild:0,compon:0,json:0,much:0,subscrib:0,blob:0,session_kei:0,convert:0,minifi:0,togeth:0,i18n:0,those:0,multi:0,main:0,look:0,servic:0,plugin:0,defin:0,abov:0,error:0,hightlight:0,chat:0,helper:0,demo:0,auto_subscrib:0,non:0,rid:0,conn:0,develop:0,open:0,receiv:0,media:0,make:0,minif:0,cross:0,same:0,read:0,onconnectfacebook:0,html:0,chatroom:0,document:0,medit:0,complet:0,signon:0,http:0,webserv:0,optim:0,upon:0,someon:0,hand:0,"50kb":0,user:0,xhr_user_search:0,cssmin:0,recent:0,stateless:0,markup:0,well:0,without:0,command:0,wherebi:0,thi:0,choos:0,latest:0,plural_form:0,protocol:0,firstnam:0,tip:0,jshint:0,languag:0,web:0,xmlhttprequest:0,had:0,add:0,other:0,non_amd:0,input:0,match:0,applic:0,format:0,webpag:0,amd:0,nginx:0,traffic:0,know:0,background:0,like:0,xss:0,backbon:0,specif:0,server:0,collect:0,benefit:0,either:0,output:0,manag:0,facebookconnect:0,deal:0,nplural:0,some:0,back:0,librari:0,bottom:0,deploy:0,achiev:0,track:0,overcom:0,localhost:0,refer:0,object:0,run:0,host:0,although:0,panel:0,src:0,about:0,controlbox:0,unfortun:0,act:0,own:0,curiou:0,encod:0,automat:0,wrap:0,your:0,merg:0,log:0,wai:0,transfer:0,support:0,"long":0,happi:0,avail:0,includ:0,lot:0,suit:0,analysi:0,head:0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,line:0,inlin:0,"true":0,bug:0,congratul:0,longer:0,info:0,pull:0,made:0,dirti:0,locale_data:0,possibl:0,"default":0,bugfix:0,displai:0,asynchron:0,below:0,tightli:0,otherwis:0,problem:0,expect:0,featur:0,creat:0,doesn:0,msgmerg:0,exist:0,file:0,face:0,check:0,want:0,when:0,detail:0,gettext:0,field:0,valid:0,rememb:0,test:0,you:0,nice:0,node:0,intend:0,stai:0,lang:0,requirej:0,directori:0,getjson:0,potenti:0,time:0},objtypes:{},titles:["Quickstart (to get a demo up and running)"],objnames:{},filenames:["index"]})
\ No newline at end of file
......@@ -48,9 +48,9 @@ copyright = u'2013, JC Brand'
# built documents.
#
# The short X.Y version.
version = '0.5.1'
version = '0.6.0'
# The full version, including alpha/beta/rc tags.
release = '0.5.1'
release = '0.6.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
......
......@@ -188,15 +188,17 @@ Jack Moffitt has a great `blogpost`_ about this and even provides an `example Dj
.. Note::
If you want to enable single session support, make sure to pass **prebind: true**
when you call **converse.initialize** (see ./index.html).
Additionally you need to pass in valid **jid**, **sid**, **rid** and
**bosh_service_url** values.
When you authenticate to the XMPP server on your backend, you'll receive two
tokens, RID (request ID) and SID (session ID).
These tokens then need to be passed back to the javascript running in your
browser, where you will need them attach to the existing session.
browser, where you will need them to attach to the existing session.
You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to you server and ask it to return them for you.
XMLHttpRequest call to your server and ask it to return them for you.
Below is one example of how this could work. An Ajax call is made to the
relative URL **/prebind** and it expects to receive JSON data back.
......@@ -204,26 +206,19 @@ relative URL **/prebind** and it expects to receive JSON data back.
::
$.getJSON('/prebind', function (data) {
var connection = new Strophe.Connection(converse.bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
converse.onConnected(connection)
}
});
}
converse.initialize({
prebind: true,
bosh_service_url: data.bosh_service_url,
jid: data.jid,
sid: data.sid,
rid: data.rid
});
);
**Here's what's happening:**
The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
BOSH connection manager is already set as a configuration setting on the
*converse* object (see ./main.js), so we can reuse it from there.
A new Strophe.Connection object is instantiated and then *attach* is called with
the user's JID, the necessary tokens and a callback function.
In the callback function, you call *converse.onConnected* together with the
connection object.
The JSON data contains the user's JID (jabber ID), RID, SID and the URL to the
BOSH connection manager.
Facebook integration
......@@ -463,25 +458,36 @@ a middle man between HTTP and XMPP.
See `here <http://metajack.im/2008/09/08/which-bosh-server-do-you-need>`_ for more information.
debug
-----
If set to true, debugging output will be logged to the browser console.
fullname
--------
If you are using prebinding, you need to specify the fullname of the currently
logged in user.
If you are using prebinding, can specify the fullname of the currently
logged in user, otherwise the user's vCard will be fetched.
hide_muc_server
---------------
Default = False
Default = false
Hide the ``server`` input field of the form inside the ``Room`` panel of the
controlbox. Useful if you want to restrict users to a specific XMPP server of
your choosing.
i18n
----
Specify the locale/language. The language must be in the ``locales`` object. Refer to
``./locale/locales.js`` to see which locales are supported.
prebind
--------
Default = False
Default = false
Use this option when you want to attach to an existing XMPP connection that was
already authenticated (usually on the backend before page load).
......@@ -489,26 +495,19 @@ already authenticated (usually on the backend before page load).
This is useful when you don't want to render the login form on the chat control
box with each page load.
When set to true, you'll need to make sure that the onConnected method is
called, and passed to it a Strophe connection object.
For prebinding to work, your backend server must authenticate for you, and
then return a JID (jabber ID), SID (session ID) and RID (Request ID).
Besides requiring the back-end to authenticate you, you'll also
have to write a Javascript snippet to attach to the set up connection::
If you set ``prebind`` to ``true``, you have to make sure to also pass in these
values as ``jid``, ``sid``, ``rid``.
$.JSON({
'url': 'mysite.com/xmpp-authenticate',
'success': function (data) {
connection = new Strophe.Connection(bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, converse.onConnected);
}
Additionally, you have to specify ``bosh_service_url``.
The backend must authenticate for you, and then return a SID (session ID) and
RID (Request ID), which you use when you attach to the connection.
show_controlbox_by_default
--------------------------
Default = False
Default = false
The "controlbox" refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.
......@@ -537,40 +536,27 @@ be used.
Minification
============
Minifying Javascript
====================
Minifying Javascript and CSS
============================
Please make sure to read the section `Development`_ and that you have installed
all development dependencies (long story short, you can run ``npm install``
and then ``grunt fetch``).
We use `require.js`_ to keep track of *Converse.js* and its dependencies and to
to bundle them together in a single minified file fit for deployment to a
production site.
To use the require.js's optimization tool, you'll need Node and it's package
manager, NPM.
You can then install install require.js for Node like so:
::
npm install requirejs
The minified javascript file is then created like this:
To minify the Javascript and CSS, run the following command:
::
r.js -o build.js
You should now have a new minified file (the name which is specified in build.js).
grunt minify
Javascript will be bundled and minified via `require.js`_'s optimization tool.
You can `read more about require.js's optimizer here`_.
Minifying CSS
=============
CSS can be minimized with Yahoo's yuicompressor tool:
::
yui-compressor --type=css converse.css -o converse.min.css
CSS is minified via `cssmin <https://github.com/gruntjs/grunt-contrib-cssmin>`_.
============
......
......@@ -33,3 +33,10 @@ h1 a {
ul {
margin-bottom: 5px;
}
tt.literal {
color: #222;
background-color: #fff;
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
font-size: 14px;
}
......@@ -23,7 +23,8 @@
'unauthorize': function () {},
'get': function () {},
'subscribe': function () {},
'registerCallback': function () {}
'registerCallback': function () {},
'remove': function (jid, callback) { callback(); }
},
'vcard': {
'get': function (callback, jid) {
......
......@@ -192,61 +192,33 @@
<div class="chatbox" id="37c0c87392010303765fe36b05c0967d62c6b70f" style="opacity: 1; display: inline;">
<div class="chat-head chat-head-chatbox">
<a class="close-chatbox-button icon-close"></a>
<a href="" target="_blank" class="user">
<div class="chat-title">John Smit</div>
<a href="http://opkode.com" target="_blank" class="user">
<canvas height="35px" width="35px" class="avatar" style="background-color: black"></canvas>
<div class="chat-title"> JC Brand </div>
</a>
<p class="user-custom-message"></p>
<p></p>
</div>
<div class="chat-content">
<div class="chat-info"><strong>/help</strong>:Show this menu</div>
<div class="chat-info"><strong>/me</strong>:Write in the third person</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-me">09:35 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
<div class="chat-message ">
<span class="chat-message-them">19:25 Benedict-John:&nbsp;</span>
<span class="chat-message-content">Dagsê</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
<span class="chat-message-content">This is a relatively long message to check that wrapping works as expected.</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:39 me:&nbsp;</span>
<span class="chat-message-content">Hello world</span>
<span class="chat-message-me">19:42 me:&nbsp;</span>
<span class="chat-message-content">Supercalifragilisticexpialidociousstillnotlongenough</span>
</div>
<div class="chat-event">JC Brand is busy</div>
</div>
<form class="sendXMPPMessage" action="" method="post">
<ul class="chat-toolbar">
......@@ -263,7 +235,7 @@
<div class="chat-head chat-head-chatroom">
<a class="close-chatbox-button icon-close"></a>
<a class="configure-chatroom-button icon-wrench" style=""></a>
<div class="chat-title"> converse.js </div>
<div class="chat-title"> Chatroom </div>
<p class="chatroom-topic"></p>
<p></p>
</div>
......@@ -272,14 +244,23 @@
<div class="chat-content">
<time class="chat-date" datetime="2013-06-04T00:00:00.000Z">Tue Jun 04 2013</time>
<div class="chat-message ">
<span class="chat-message-room">18:50 fires:&nbsp;</span>
<span class="chat-message-content">explodingcoder: hi :)</span>
<span class="chat-message-room">18:50 luke:&nbsp;</span>
<span class="chat-message-content">leia: hi :)</span>
</div>
<div class="chat-message ">
<span class="chat-message-me">19:40 me:&nbsp;</span>
<span class="chat-message-room">19:40 leia:&nbsp;</span>
<span class="chat-message-content">
I'll be gone for a while, will be back in about an hour</span>
</div>
<div class="chat-message ">
<span class="chat-message-room">19:40 Obi-wan Kenobi, Jedi Master:&nbsp;</span>
<span class="chat-message-content">
I'll be gone for a while, will be back in about an hour</span>
</div>
<div class="chat-message">
<span class="chat-message-me">19:42 me:&nbsp;</span>
<span class="chat-message-content">Supercalifragilisticexpialidociousstillnotlongenough</span>
</div>
</div>
<form class="sendXMPPMessage" action="" method="post">
<textarea type="text" class="chat-textarea" placeholder="Message"></textarea>
......@@ -287,9 +268,10 @@
</div>
<div class="participants">
<ul class="participant-list">
<li class="participant" title="This user can send messages in this room">jabberthehut</li>
<li class="participant" title="This user can send messages in this room">explodingcoder</li>
<li class="moderator" title="This user is a moderator">jcbrand</li>
<li class="participant" title="This user can send messages in this room">Obi-wan Kenobi, Jedi Master</li>
<li class="participant" title="This user can send messages in this room">jabber the hut</li>
<li class="participant" title="This user can send messages in this room">leia</li>
<li class="moderator" title="This user is a moderator">luke</li>
</ul>
</div>
</div>
......@@ -299,7 +281,7 @@
<div class="chat-head chat-head-chatroom">
<a class="close-chatbox-button icon-close"></a>
<a class="configure-chatroom-button" style="display:none">&nbsp;</a>
<div class="chat-title"> problematic </div>
<div class="chat-title"> Restricted Chatroom</div>
<p class="chatroom-topic"></p>
<p></p>
</div>
......
......@@ -16,7 +16,6 @@
<script type="text/javascript" src="components/underscore/underscore.js"></script>
<script type="text/javascript" src="components/backbone//backbone.js"></script>
<script type="text/javascript" src="components/backbone.localStorage/backbone.localStorage.js"></script>
<script type="text/javascript" src="components/sjcl/sjcl.js"></script>
<script type="text/javascript" src="components/tinysort/src/jquery.tinysort.js"></script>
<script type="text/javascript" src="components/jed/jed.js"></script>
<script type="text/javascript" src="locale/en/LC_MESSAGES/en.js"></script>
......
......@@ -135,7 +135,6 @@
.c('not-authorized').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderPasswordForm').andCallThrough();
runs(function () {
view.onChatRoomPresence(presence, {'nick': 'dummy'});
......@@ -159,7 +158,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'auth'})
.c('registration-required').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe('You are not on the member list of this room');
......@@ -175,7 +173,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'auth'})
.c('forbidden').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe('You have been banned from this room');
......@@ -191,7 +188,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'modify'})
.c('jid-malformed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe('No nickname was specified');
......@@ -207,7 +203,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'cancel'})
.c('not-allowed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe('You are not allowed to create new rooms');
......@@ -223,7 +218,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'cancel'})
.c('not-acceptable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe("Your nickname doesn't conform to this room's policies");
......@@ -239,7 +233,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'cancel'})
.c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe("Your nickname is already taken");
......@@ -255,7 +248,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'cancel'})
.c('item-not-found').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe("This room does not (yet) exist");
......@@ -271,7 +263,6 @@
.c('error').attrs({by:'coven@chat.shakespeare.lit', type:'cancel'})
.c('service-unavailable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(view.$el.find('.chat-body p').text()).toBe("This room has reached it's maximum number of occupants");
......
......@@ -12,7 +12,7 @@
'Louw Spekman', 'Mohamad Stet', 'Dominik Beyer'
];
var pend_names = [
'Suleyman van Beusichem', 'Nicole Diederich', 'Nanja van Yperen'
'Suleyman van Beusichem', 'Nanja van Yperen', 'Nicole Diederich'
];
var cur_names = [
'Max Frankfurter', 'Candice van der Knijff', 'Irini Vlastuin', 'Rinse Sommer', 'Annegreet Gomez',
......@@ -123,6 +123,48 @@
expect(this.rosterview.$el.find('dt#pending-xmpp-contacts').css('display')).toEqual('none');
}, converse));
it("can be added to the roster", $.proxy(function () {
spyOn(this.rosterview, 'render').andCallThrough();
spyOn(this.xmppstatus, 'sendPresence');
this.roster.create({
jid: pend_names[0].replace(' ','.').toLowerCase() + '@localhost',
subscription: 'none',
ask: 'subscribe',
fullname: pend_names[0],
is_last: true
});
expect(this.rosterview.$el.is(':visible')).toEqual(true);
expect(this.xmppstatus.sendPresence).toHaveBeenCalled();
expect(this.rosterview.render).toHaveBeenCalled();
}, converse));
it("can be removed by the user", $.proxy(function () {
var view = _.toArray(this.rosterview.rosteritemviews).pop();
spyOn(window, 'confirm').andReturn(true);
spyOn(this.connection.roster, 'remove').andCallThrough();
spyOn(this.connection.roster, 'unauthorize');
spyOn(this.rosterview.model, 'remove').andCallThrough();
//spyOn(view, 'removeContact').andCallThrough();
runs($.proxy(function () {
view.$el.find('.remove-xmpp-contact').click();
}, converse));
waits(500);
runs($.proxy(function () {
expect(window.confirm).toHaveBeenCalled();
//expect(view.removeContact).toHaveBeenCalled();
expect(this.connection.roster.remove).toHaveBeenCalled();
expect(this.connection.roster.unauthorize).toHaveBeenCalled();
expect(this.rosterview.model.remove).toHaveBeenCalled();
// The element must now be detached from the DOM.
expect(view.$el.closest('html').length).toBeFalsy();
}, converse));
}, converse));
it("will lose their own heading once the last one has been removed", $.proxy(function () {
expect(this.rosterview.$el.find('dt#pending-xmpp-contacts').is(':visible')).toBeFalsy();
}, converse));
it("can be added to the roster and they will be sorted alphabetically", $.proxy(function () {
var i, t, is_last;
spyOn(this.rosterview, 'render').andCallThrough();
......@@ -136,13 +178,10 @@
fullname: pend_names[i],
is_last: is_last
});
// For performance reasons, the roster should only be shown once
// the last contact has been added.
if (is_last) {
expect(this.rosterview.$el.is(':visible')).toEqual(true);
expect(this.xmppstatus.sendPresence).toHaveBeenCalled();
} else {
expect(this.rosterview.$el.is(':visible')).toEqual(false);
expect(this.xmppstatus.sendPresence).not.toHaveBeenCalled();
}
expect(this.rosterview.render).toHaveBeenCalled();
// Check that they are sorted alphabetically
......@@ -154,6 +193,7 @@
it("will have their own heading once they have been added", $.proxy(function () {
expect(this.rosterview.$el.find('dt#pending-xmpp-contacts').css('display')).toEqual('block');
}, converse));
}, converse));
describe("Existing Contacts", $.proxy(function () {
......
......@@ -68,37 +68,35 @@ require([
prebind: false,
xhr_user_search: false,
auto_subscribe: false,
animate: false
animate: false,
connection: mock_connection,
testing: true
}, function (converse) {
window.converse = converse;
require([
"jasmine-console-reporter",
"jasmine-junit-reporter",
"spec/MainSpec",
"spec/ChatRoomSpec"
], function () {
// Jasmine stuff
var jasmineEnv = jasmine.getEnv();
if (/PhantomJS/.test(navigator.userAgent)) {
jasmineEnv.addReporter(new jasmine.TrivialReporter());
jasmineEnv.addReporter(new jasmine.JUnitXmlReporter('./test-reports/'));
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.updateInterval = 0;
} else {
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
jasmineEnv.updateInterval = 200;
}
jasmineEnv.execute();
});
});
converse.onConnected(
mock_connection,
function (converse) {
window.converse = converse;
require([
"jasmine-console-reporter",
"jasmine-junit-reporter",
"spec/MainSpec",
"spec/ChatRoomSpec"
], function () {
// Jasmine stuff
var jasmineEnv = jasmine.getEnv();
if (/PhantomJS/.test(navigator.userAgent)) {
jasmineEnv.addReporter(new jasmine.TrivialReporter());
jasmineEnv.addReporter(new jasmine.JUnitXmlReporter('./test-reports/'));
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.updateInterval = 0;
} else {
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
jasmineEnv.updateInterval = 200;
}
jasmineEnv.execute();
});
}
);
}
);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment