Bug 784535 - enable opening chats from worker. r=jaws

This commit is contained in:
Shane Caraveo 2012-08-26 16:51:24 -07:00
parent fe3875a970
commit 28ac33ef34
8 changed files with 69 additions and 17 deletions

View File

@ -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)

View File

@ -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>

View File

@ -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" });
}
}

View File

@ -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");

View File

@ -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",

View File

@ -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",

View File

@ -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);
}

View File

@ -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;