소스 검색

Parse and save jabber:x:data formdata from a disco#info result

JC Brand 7 년 전
부모
커밋
076ace3fad
2개의 변경된 파일18개의 추가작업 그리고 0개의 파일을 삭제
  1. 1 0
      spec/http-file-upload.js
  2. 17 0
      src/converse-disco.js

+ 1 - 0
spec/http-file-upload.js

@@ -162,6 +162,7 @@
                                 function (result) {
                                     expect(result.length).toBe(1);
                                     expect(result[0].get('jid')).toBe('upload.localhost');
+                                    expect(result[0].dataforms.where({'FORM_TYPE': {value: "urn:xmpp:http:upload:0", type: "hidden"}}).length).toBe(1);
                                     done();
                                 }
                             );

+ 17 - 0
src/converse-disco.js

@@ -37,6 +37,11 @@
                 initialize () {
                     this.waitUntilFeaturesDiscovered = utils.getResolveablePromise();
 
+                    this.dataforms = new Backbone.Collection();
+                    this.dataforms.browserStorage = new Backbone.BrowserStorage[_converse.storage](
+                        b64_sha1(`converse.dataforms-{this.get('jid')}`)
+                    );
+
                     this.features = new Backbone.Collection();
                     this.features.browserStorage = new Backbone.BrowserStorage[_converse.storage](
                         b64_sha1(`converse.features-${this.get('jid')}`)
@@ -155,6 +160,18 @@
                             'name': identity.getAttribute('name')
                         });
                     });
+
+                    _.each(sizzle('x[type="result"][xmlns="jabber:x:data"]', stanza), (form) => {
+                        const data = {};
+                        _.each(form.querySelectorAll('field'), (field) => {
+                            data[field.getAttribute('var')] = {
+                                'value': _.get(field.querySelector('value'), 'textContent'),
+                                'type': field.getAttribute('type')
+                            };
+                        });
+                        this.dataforms.create(data);
+                    });
+
                     if (stanza.querySelector('feature[var="'+Strophe.NS.DISCO_ITEMS+'"]')) {
                         this.queryForItems();
                     }