mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 22:05:44 +00:00
Bug 784535 - enable opening chats from worker. r=jaws
This commit is contained in:
parent
fe3875a970
commit
28ac33ef34
@ -172,9 +172,9 @@ let SocialChatBar = {
|
||||
docElem.getAttribute("chromehidden").indexOf("extrachrome") >= 0;
|
||||
return Social.uiVisible && !chromeless;
|
||||
},
|
||||
newChat: function(aProvider, aURL, aCallback) {
|
||||
openChat: function(aProvider, aURL, aCallback, aMode) {
|
||||
if (this.canShow)
|
||||
this.chatbar.newChat(aProvider, aURL, aCallback);
|
||||
this.chatbar.openChat(aProvider, aURL, aCallback, aMode);
|
||||
},
|
||||
update: function() {
|
||||
if (!this.canShow)
|
||||
|
@ -135,6 +135,7 @@
|
||||
<field name="selectedChat"/>
|
||||
|
||||
<field name="menuitemMap">new WeakMap()</field>
|
||||
<field name="chatboxForURL">new Map();</field>
|
||||
|
||||
<property name="firstCollapsedChild">
|
||||
<getter><![CDATA[
|
||||
@ -240,6 +241,7 @@
|
||||
}
|
||||
this.removeChild(aChatbox);
|
||||
this.resize();
|
||||
this.chatboxForURL.delete(aChatbox.getAttribute('src'));
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
@ -248,18 +250,36 @@
|
||||
while (this.firstChild) {
|
||||
this.removeChild(this.firstChild);
|
||||
}
|
||||
this.chatboxForURL = new Map();
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
<method name="newChat">
|
||||
<method name="openChat">
|
||||
<parameter name="aProvider"/>
|
||||
<parameter name="aURL"/>
|
||||
<parameter name="aCallback"/>
|
||||
<parameter name="aMode"/>
|
||||
<body><![CDATA[
|
||||
let cb = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "chatbox");
|
||||
let cb = this.chatboxForURL.get(aURL);
|
||||
if (cb) {
|
||||
cb = cb.get();
|
||||
if (cb.parentNode) {
|
||||
// ensure this chatbox is visible
|
||||
if (this.selectedChat != cb)
|
||||
this.selectedChat = cb;
|
||||
if (cb.collapsed)
|
||||
this.showChat(cb);
|
||||
return;
|
||||
}
|
||||
this.chatboxForURL.delete(aURL);
|
||||
}
|
||||
cb = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "chatbox");
|
||||
if (aMode == "minimized")
|
||||
cb.minimized = true;
|
||||
this.selectedChat = cb;
|
||||
this.appendChild(cb);
|
||||
this.insertBefore(cb, this.firstChild);
|
||||
cb.init(aProvider, aURL, aCallback);
|
||||
this.chatboxForURL.set(aURL, Cu.getWeakReference(cb));
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
|
@ -55,7 +55,7 @@ var tests = {
|
||||
break;
|
||||
}
|
||||
}
|
||||
port.postMessage({topic: "test-init"});
|
||||
port.postMessage({topic: "test-init", data: { id: 1 }});
|
||||
},
|
||||
testManyChats: function(next) {
|
||||
// open enough chats to overflow the window, then check
|
||||
@ -87,8 +87,26 @@ var tests = {
|
||||
}
|
||||
let num = numToOpen;
|
||||
while (num-- > 0) {
|
||||
port.postMessage({topic: "test-chatbox-open"});
|
||||
port.postMessage({topic: "test-chatbox-open", data: { id: num }});
|
||||
}
|
||||
},
|
||||
testWorkerChatWindow: function(next) {
|
||||
let port = Social.provider.port;
|
||||
ok(port, "provider has a port");
|
||||
port.onmessage = function (e) {
|
||||
let topic = e.data.topic;
|
||||
switch (topic) {
|
||||
case "got-chatbox-message":
|
||||
ok(true, "got a chat window opened");
|
||||
let chats = document.getElementById("pinnedchats");
|
||||
while (chats.selectedChat) {
|
||||
chats.selectedChat.close();
|
||||
}
|
||||
ok(!chats.selectedChat, "chats are all closed");
|
||||
next();
|
||||
break;
|
||||
}
|
||||
}
|
||||
port.postMessage({topic: "test-worker-chat" });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,6 +54,7 @@ var tests = {
|
||||
ok(true, "panel hidden");
|
||||
next();
|
||||
}
|
||||
break;
|
||||
case "got-sidebar-message":
|
||||
// The sidebar message will always come first, since it loads by default
|
||||
ok(true, "got sidebar message");
|
||||
|
@ -12,11 +12,15 @@
|
||||
navigator.mozSocial.openPanel("social_flyout.html");
|
||||
break;
|
||||
case "test-chatbox-open":
|
||||
navigator.mozSocial.openChatWindow("social_chat.html",
|
||||
function(chatwin) {
|
||||
port.postMessage({topic: "chatbox-opened",
|
||||
result: chatwin ? "ok" : "failed"});
|
||||
});
|
||||
var url = "social_chat.html";
|
||||
var data = e.data.data;
|
||||
if (data && data.id) {
|
||||
url = url + "?id="+data.id;
|
||||
}
|
||||
navigator.mozSocial.openChatWindow(url, function(chatwin) {
|
||||
port.postMessage({topic: "chatbox-opened",
|
||||
result: chatwin ? "ok" : "failed"});
|
||||
});
|
||||
break;
|
||||
case "test-isVisible":
|
||||
port.postMessage({topic: "test-isVisible-response",
|
||||
|
@ -2,7 +2,7 @@
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
let testPort, sidebarPort;
|
||||
let testPort, sidebarPort, apiPort;
|
||||
|
||||
onconnect = function(e) {
|
||||
let port = e.ports[0];
|
||||
@ -46,7 +46,7 @@ onconnect = function(e) {
|
||||
testPort.postMessage({topic:"got-social-panel-visibility", result: event.data.result });
|
||||
break;
|
||||
case "test-chatbox-open":
|
||||
sidebarPort.postMessage({topic:"test-chatbox-open"});
|
||||
sidebarPort.postMessage( event.data );
|
||||
break;
|
||||
case "chatbox-message":
|
||||
testPort.postMessage({topic:"got-chatbox-message", result: event.data.result});
|
||||
@ -63,8 +63,12 @@ onconnect = function(e) {
|
||||
case "flyout-visibility":
|
||||
testPort.postMessage({topic:"got-flyout-visibility", result: event.data.result});
|
||||
break;
|
||||
case "test-worker-chat":
|
||||
apiPort.postMessage({topic: "social.request-chat", data: "https://example.com/browser/browser/base/content/test/social_chat.html" });
|
||||
break;
|
||||
case "social.initialize":
|
||||
// This is the workerAPI port, respond and set up a notification icon.
|
||||
apiPort = port;
|
||||
port.postMessage({topic: "social.initialize-response"});
|
||||
let profile = {
|
||||
portrait: "https://example.com/portrait.jpg",
|
||||
|
@ -198,11 +198,11 @@ function ensureProviderOrigin(provider, url) {
|
||||
return fullURL;
|
||||
}
|
||||
|
||||
function openChatWindow(chromeWindow, provider, url, callback) {
|
||||
function openChatWindow(chromeWindow, provider, url, callback, mode) {
|
||||
if (!chromeWindow.SocialChatBar)
|
||||
return;
|
||||
let fullURL = ensureProviderOrigin(provider, url);
|
||||
if (!fullURL)
|
||||
return;
|
||||
chromeWindow.SocialChatBar.newChat(provider, fullURL, callback);
|
||||
chromeWindow.SocialChatBar.openChat(provider, fullURL, callback, mode);
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "getFrameWorkerHandle", "resource://gre/modules/FrameWorker.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "openChatWindow", "resource://gre/modules/MozSocialAPI.jsm");
|
||||
|
||||
const EXPORTED_SYMBOLS = ["WorkerAPI"];
|
||||
|
||||
@ -70,6 +71,10 @@ WorkerAPI.prototype = {
|
||||
this._port.postMessage({topic: "social.cookies-get-response",
|
||||
data: results});
|
||||
},
|
||||
'social.request-chat': function(data) {
|
||||
let xulWindow = Services.wm.getMostRecentWindow("navigator:browser").getTopWin();
|
||||
openChatWindow(xulWindow, this._provider, data, null, "minimized");
|
||||
},
|
||||
'social.notification-create': function(data) {
|
||||
let port = this._port;
|
||||
let provider = this._provider;
|
||||
|
Loading…
Reference in New Issue
Block a user