document.getAnonymousElementByAttribute(this, "id", "notification-icon")); Social.setErrorListener(this.content, function(aBrowser) { aBrowser.webNavigation.loadURI("about:socialerror?mode=compactInfo", 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 => { chatbar.selectedChat.swapDocShells(this); 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(); ]]>