diff -r 000000000000 -r 6474c204b198 browser/base/content/socialchat.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/base/content/socialchat.xml Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + document.getAnonymousElementByAttribute(this, "anonid", "notification-icon")); + Social.setErrorListener(this.content, function(aBrowser) { + aBrowser.webNavigation.loadURI("about:socialerror?mode=compactInfo&origin=" + + encodeURIComponent(aBrowser.getAttribute("origin")), + null, null, null, null); + }); + if (!this.chatbar) { + document.getAnonymousElementByAttribute(this, "anonid", "minimize").hidden = true; + document.getAnonymousElementByAttribute(this, "anonid", "close").hidden = true; + } + let contentWindow = this.contentWindow; + this.addEventListener("DOMContentLoaded", function DOMContentLoaded(event) { + if (event.target != this.contentDocument) + return; + this.removeEventListener("DOMContentLoaded", DOMContentLoaded, true); + this.isActive = !this.minimized; + // process this._callbacks, then set to null so the chatbox creator + // knows to make new callbacks immediately. + if (this._callbacks) { + for (let callback of this._callbacks) { + if (callback) + callback(contentWindow); + } + this._callbacks = null; + } + + // content can send a socialChatActivity event to have the UI update. + let chatActivity = function() { + this.setAttribute("activity", true); + if (this.chatbar) + this.chatbar.updateTitlebar(this); + }.bind(this); + contentWindow.addEventListener("socialChatActivity", chatActivity); + contentWindow.addEventListener("unload", function unload() { + contentWindow.removeEventListener("unload", unload); + contentWindow.removeEventListener("socialChatActivity", chatActivity); + }); + }, true); + if (this.src) + this.setAttribute("src", this.src); + ]]> + + + document.getAnonymousElementByAttribute(this, "anonid", "content"); + + + + + return this.content.contentWindow; + + + + + + return this.content.contentDocument; + + + + + + return this.getAttribute("minimized") == "true"; + + + + + + + if (this.parentNode.nodeName == "chatbar") + return this.parentNode; + return null; + + + + + + return this.content.docShell.isActive; + + + this.content.docShell.isActive = !!val; + + // let the chat frame know if it is being shown or hidden + let evt = this.contentDocument.createEvent("CustomEvent"); + evt.initCustomEvent(val ? "socialFrameShow" : "socialFrameHide", true, true, {}); + this.contentDocument.documentElement.dispatchEvent(evt); + + + + + + + + + + + + + + + + + + + + + + + { + win.document.title = provider.name; + }); + } else { + // attach this chatbox to the topmost browser window + let findChromeWindowForChats = Cu.import("resource://gre/modules/MozSocialAPI.jsm").findChromeWindowForChats; + let win = findChromeWindowForChats(); + let chatbar = win.SocialChatBar.chatbar; + chatbar.openChat(provider, "about:blank", win => { + let cb = chatbar.selectedChat; + this.swapDocShells(cb); + + // chatboxForURL is a map of URL -> chatbox used to avoid opening + // duplicate chat windows. Ensure reattached chat windows aren't + // registered with about:blank as their URL, otherwise reattaching + // more than one chat window isn't possible. + chatbar.chatboxForURL.delete("about:blank"); + chatbar.chatboxForURL.set(this.src, Cu.getWeakReference(cb)); + + chatbar.focus(); + this.close(); + }); + } + ]]> + + + + + + + + + + if (this.chatbar) + this.chatbar.selectedChat = this; + + + + + if (this.isActive == this.minimized) + this.isActive = !this.minimized; + + + + + + + + + + + + + + + + + + // to avoid reflows we cache the width of the nub. + this.cachedWidthNub = 0; + this._selectedChat = null; + + + + document.getAnonymousElementByAttribute(this, "anonid", "innerbox"); + + + + document.getAnonymousElementByAttribute(this, "anonid", "nubMenu"); + + + + document.getAnonymousElementByAttribute(this, "anonid", "nub"); + + + + + + + + + + + + + + + + + new WeakMap() + new Map(); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + as it + // must exist before the (possibly delayed) bindings are created. + cb._callbacks = [aCallback]; + // src also a javascript property; the src attribute is set in the ctor. + cb.src = aURL; + if (aMode == "minimized") + cb.setAttribute("minimized", "true"); + cb.setAttribute("origin", aProvider.origin); + this.insertBefore(cb, this.firstChild); + this.selectedChat = cb; + this.chatboxForURL.set(aURL, Cu.getWeakReference(cb)); + this.resize(); + ]]> + + + + availWidth) { + // we need to collapse some. + let toCollapse = []; + for (let child of this.collapsibleChildren) { + if (currentWidth <= availWidth) + break; + toCollapse.push(child); + currentWidth -= this.getTotalChildWidth(child); + } + if (toCollapse.length) { + for (let child of toCollapse) + this.collapseChat(child); + } + } else if (currentWidth < availWidth) { + // we *might* be able to expand some - see how many. + // XXX - if this was clever, it could know when removing the nub + // leaves enough space to show all collapsed + let toShow = []; + for (let child of this.collapsedChildren) { + currentWidth += this.getTotalChildWidth(child); + if (currentWidth > availWidth) + break; + toShow.push(child); + } + for (let child of toShow) + this._showChat(child); + + // If none remain collapsed remove the nub. + if (!this.hasCollapsedChildren) { + this.nub.collapsed = true; + } + } + // else: achievement unlocked - we are pixel-perfect! + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + win.document.title = provider.name; + }); + + event.stopPropagation(); + ]]> + + + +