Backed out 5 changesets (bug 1132301) for mochitest-bc leaks and test failures.
authorRyan VanderMeulen <ryanvm@gmail.com>
Fri, 27 Mar 2015 11:04:38 -0400
changeset 266458 3f3bb18b9f04ff7f2cce748f18df41bf3ba2e1f1
parent 266457 fde5601c5dd4bf12138d70bb24644c90a49888f4
child 266459 e4232403fc75f781f499b76691afbbd62ce5936b
push id830
push userraliiev@mozilla.com
push dateFri, 19 Jun 2015 19:24:37 +0000
treeherdermozilla-release@932614382a68 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1132301
milestone39.0a1
backs outef364246350a5f0af2b57fcfac7fb23188e8384e
0e57fb772be5ffe2628824d30fc562a4cf75e571
d241102c104c2a9d1eef2a84efcae657c7f3d967
7d3633bdd4a33914fccbb1d7d7eced48018d865a
3d3ff867d390ec8419f5e34fe44479fd2b6e2176
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 5 changesets (bug 1132301) for mochitest-bc leaks and test failures. Backed out changeset ef364246350a (bug 1132301) Backed out changeset 0e57fb772be5 (bug 1132301) Backed out changeset d241102c104c (bug 1132301) Backed out changeset 7d3633bdd4a3 (bug 1132301) Backed out changeset 3d3ff867d390 (bug 1132301)
browser/components/customizableui/CustomizableWidgets.jsm
browser/components/loop/MozLoopAPI.jsm
browser/components/loop/content/css/contacts.css
browser/components/loop/content/css/panel.css
browser/components/loop/content/js/panel.js
browser/components/loop/content/js/panel.jsx
browser/components/loop/content/js/roomViews.js
browser/components/loop/content/js/roomViews.jsx
browser/components/loop/content/shared/css/common.css
browser/components/loop/content/shared/css/conversation.css
browser/components/loop/content/shared/img/icons-16x16.svg
browser/components/loop/content/shared/js/actions.js
browser/components/loop/content/shared/js/activeRoomStore.js
browser/components/loop/content/shared/js/mixins.js
browser/components/loop/content/shared/js/roomStore.js
browser/components/loop/standalone/content/img/logo.png
browser/components/loop/standalone/content/index.html
browser/components/loop/test/desktop-local/panel_test.js
browser/components/loop/test/desktop-local/roomViews_test.js
browser/components/loop/test/mochitest/browser.ini
browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js
browser/components/loop/test/mochitest/head.js
browser/components/loop/test/shared/activeRoomStore_test.js
browser/components/loop/test/shared/roomStore_test.js
browser/components/loop/ui/ui-showcase.js
browser/components/loop/ui/ui-showcase.jsx
browser/locales/en-US/chrome/browser/loop/loop.properties
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -408,41 +408,16 @@ const CustomizableWidgets = [
       node.setAttribute("id", this.id);
       node.classList.add("toolbarbutton-1");
       node.classList.add("chromeclass-toolbar-additional");
       node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label"));
       node.setAttribute("tooltiptext", CustomizableUI.getLocalizedProperty(this, "tooltiptext"));
       node.setAttribute("removable", "true");
       node.setAttribute("observes", "Social:PageShareOrMark");
       node.setAttribute("command", "Social:SharePage");
-
-      let listener = {
-        onWidgetAdded: (aWidgetId) => {
-          if (aWidgetId != this.id)
-            return;
-
-          Services.obs.notifyObservers(null, "social:" + this.id + "-added", null);
-        },
-
-        onWidgetRemoved: aWidgetId => {
-          if (aWidgetId != this.id)
-            return;
-
-          Services.obs.notifyObservers(null, "social:" + this.id + "-removed", null);
-        },
-
-        onWidgetInstanceRemoved: (aWidgetId, aDoc) => {
-          if (aWidgetId != this.id || aDoc != aDocument)
-            return;
-
-          CustomizableUI.removeListener(listener);
-        }
-      };
-      CustomizableUI.addListener(listener);
-
       return node;
     }
   }, {
     id: "add-ons-button",
     shortcutId: "key_openAddons",
     tooltiptext: "add-ons-button.tooltiptext3",
     defaultArea: CustomizableUI.AREA_PANEL,
     onCommand: function(aEvent) {
--- a/browser/components/loop/MozLoopAPI.jsm
+++ b/browser/components/loop/MozLoopAPI.jsm
@@ -22,18 +22,16 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose",
                                         "resource://gre/modules/MozSocialAPI.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PageMetadata",
                                         "resource://gre/modules/PageMetadata.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
                                         "resource://gre/modules/PluralForm.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "UITour",
                                         "resource:///modules/UITour.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Social",
-                                        "resource:///modules/Social.jsm");
 XPCOMUtils.defineLazyGetter(this, "appInfo", function() {
   return Cc["@mozilla.org/xre/app-info;1"]
            .getService(Ci.nsIXULAppInfo)
            .QueryInterface(Ci.nsIXULRuntime);
 });
 XPCOMUtils.defineLazyServiceGetter(this, "clipboardHelper",
                                          "@mozilla.org/widget/clipboardhelper;1",
                                          "nsIClipboardHelper");
@@ -196,20 +194,16 @@ const injectObjectAPI = function(api, ta
 function injectLoopAPI(targetWindow) {
   let ringer;
   let ringerStopper;
   let appVersionInfo;
   let contactsAPI;
   let roomsAPI;
   let callsAPI;
   let savedWindowListeners = new Map();
-  let socialProviders;
-  const kShareWidgetId = "social-share-button";
-  let socialShareButtonListenersAdded = false;
-
 
   let api = {
     /**
      * Gets an object with data that represents the currently
      * authenticated user's identity.
      *
      * @return null if user not logged in; profile object otherwise
      */
@@ -913,215 +907,30 @@ function injectLoopAPI(targetWindow) {
      * @param {Boolean} active  Whether or not screen sharing is now active.
      */
     setScreenShareState: {
       enumerable: true,
       writable: true,
       value: function(windowId, active) {
         MozLoopService.setScreenShareState(windowId, active);
       }
-    },
-
-    /**
-     * Checks if the Social Share widget is available in any of the registered
-     * widget areas (navbar, MenuPanel, etc).
-     *
-     * @return {Boolean} `true` if the widget is available and `false` when it's
-     *                   still in the Customization palette.
-     */
-    isSocialShareButtonAvailable: {
-      enumerable: true,
-      writable: true,
-      value: function() {
-        let win = Services.wm.getMostRecentWindow("navigator:browser");
-        if (!win || !win.CustomizableUI) {
-          return false;
-        }
-
-        let widget = win.CustomizableUI.getWidget(kShareWidgetId);
-        if (widget) {
-          if (!socialShareButtonListenersAdded) {
-            let eventName = "social:" + kShareWidgetId;
-            Services.obs.addObserver(onShareWidgetChanged, eventName + "-added", false);
-            Services.obs.addObserver(onShareWidgetChanged, eventName + "-removed", false);
-            socialShareButtonListenersAdded = true;
-          }
-          return !!widget.areaType;
-        }
-
-        return false;
-      }
-    },
-
-    /**
-     * Add the Social Share widget to the navbar area, but only when it's not
-     * located anywhere else than the Customization palette.
-     */
-    addSocialShareButton: {
-      enumerable: true,
-      writable: true,
-      value: function() {
-        // Don't do anything if the button is already available.
-        if (api.isSocialShareButtonAvailable.value()) {
-          return;
-        }
-
-        let win = Services.wm.getMostRecentWindow("navigator:browser");
-        if (!win || !win.CustomizableUI) {
-          return;
-        }
-        win.CustomizableUI.addWidgetToArea(kShareWidgetId, win.CustomizableUI.AREA_NAVBAR);
-      }
-    },
-
-    /**
-     * Activates the Social Share panel with the Social Provider panel opened
-     * when the popup open.
-     */
-    addSocialShareProvider: {
-      enumerable: true,
-      writable: true,
-      value: function() {
-        // Don't do anything if the button is _not_ available.
-        if (!api.isSocialShareButtonAvailable.value()) {
-          return;
-        }
-
-        let win = Services.wm.getMostRecentWindow("navigator:browser");
-        if (!win || !win.SocialShare) {
-          return;
-        }
-        win.SocialShare.showDirectory();
-      }
-    },
-
-    /**
-     * Returns a sorted list of Social Providers that can share URLs. See
-     * `updateSocialProvidersCache()` for more information.
-     * 
-     * @return {Array} Sorted list of share-capable Social Providers.
-     */
-    getSocialShareProviders: {
-      enumerable: true,
-      writable: true,
-      value: function() {
-        if (socialProviders) {
-          return socialProviders;
-        }
-        return updateSocialProvidersCache();
-      }
-    },
-
-    /**
-     * Share a room URL through a Social Provider with the provided title message.
-     * This action will open the share panel, which is anchored to the Social
-     * Share widget.
-     *
-     * @param {String} providerOrigin Identifier of the targeted Social Provider
-     * @param {String} roomURL        URL that points to the standalone client
-     * @param {String} title          Message that augments the URL inside the
-     *                                share message
-     * @param {String} [body]         Optional longer message to be displayed
-     *                                similar to the body of an email 
-     */
-    socialShareRoom: {
-      enumerable: true,
-      writable: true,
-      value: function(providerOrigin, roomURL, title, body = null) {
-        let win = Services.wm.getMostRecentWindow("navigator:browser");
-        if (!win || !win.SocialShare) {
-          return;
-        }
-
-        let graphData = {
-          url: roomURL,
-          title: title
-        };
-        if (body) {
-          graphData.body = body;
-        }
-        win.SocialShare.sharePage(providerOrigin, graphData);
-      }
     }
   };
 
-  /**
-   * Send an event to the content window to indicate that the state on the chrome
-   * side was updated.
-   *
-   * @param  {name} name Name of the event, defaults to 'LoopStatusChanged'
-   */
-  function sendEvent(name = "LoopStatusChanged") {
-    let event = new targetWindow.CustomEvent(name);
+  function onStatusChanged(aSubject, aTopic, aData) {
+    let event = new targetWindow.CustomEvent("LoopStatusChanged");
     targetWindow.dispatchEvent(event);
-  }
-
-  function onStatusChanged(aSubject, aTopic, aData) {
-    sendEvent();
-  }
+  };
 
   function onDOMWindowDestroyed(aSubject, aTopic, aData) {
     if (targetWindow && aSubject != targetWindow)
       return;
     Services.obs.removeObserver(onDOMWindowDestroyed, "dom-window-destroyed");
     Services.obs.removeObserver(onStatusChanged, "loop-status-changed");
-    // Stop listening for changes in the social provider list, if necessary.
-    if (socialProviders)
-      Services.obs.removeObserver(updateSocialProvidersCache, "social:providers-changed");
-    if (socialShareButtonListenersAdded) {
-      let eventName = "social:" + kShareWidgetId;
-      Services.obs.removeObserver(onShareWidgetChanged, eventName + "-added");
-      Services.obs.removeObserver(onShareWidgetChanged, eventName + "-removed");
-    }
-  }
-
-  function onShareWidgetChanged(aSubject, aTopic, aData) {
-    sendEvent("LoopShareWidgetChanged");
-  }
-
-  /**
-   * Retrieves a list of Social Providers from the Social API that are explicitly
-   * capable of sharing URLs.
-   * It also adds a listener that is fired whenever a new Provider is added or
-   * removed.
-   *
-   * @return {Array} Sorted list of share-capable Social Providers.
-   */
-  function updateSocialProvidersCache() {
-    let providers = [];
-
-    for (let provider of Social.providers) {
-      if (!provider.shareURL) {
-        continue;
-      }
-
-      // Only pass the relevant data on to content.
-      providers.push({
-        iconURL: provider.iconURL,
-        name: provider.name,
-        origin: provider.origin
-      });
-    }
-
-    let providersWasSet = !!socialProviders;
-    // Replace old with new.
-    socialProviders = cloneValueInto(providers.sort((a, b) =>
-      a.name.toLowerCase().localeCompare(b.name.toLowerCase())), targetWindow);
-
-    // Start listening for changes in the social provider list, if we're not
-    // doing that yet.
-    if (!providersWasSet) {
-      Services.obs.addObserver(updateSocialProvidersCache, "social:providers-changed", false);
-    } else {
-      // Dispatch an event to content to let stores freshen-up.
-      sendEvent("LoopSocialProvidersChanged");
-    }
-
-    return socialProviders;
-  }
+  };
 
   let contentObj = Cu.createObjectIn(targetWindow);
   Object.defineProperties(contentObj, api);
   Object.seal(contentObj);
   Cu.makeObjectPropsNormal(contentObj);
   Services.obs.addObserver(onStatusChanged, "loop-status-changed", false);
   Services.obs.addObserver(onDOMWindowDestroyed, "dom-window-destroyed", false);
 
--- a/browser/components/loop/content/css/contacts.css
+++ b/browser/components/loop/content/css/contacts.css
@@ -189,21 +189,22 @@
 }
 
 .contact > .dropdown-menu-up {
   bottom: 10px;
   top: auto;
 }
 
 .contact > .dropdown-menu > .dropdown-menu-item > .icon {
+  display: inline-block;
   width: 20px;
   height: 10px;
   background-position: center left;
   background-size: 10px 10px;
-  margin-top: 3px;
+  background-repeat: no-repeat;
 }
 
 .contact > .dropdown-menu > .dropdown-menu-item > .icon-audio-call {
   background-image: url("../shared/img/icons-16x16.svg#audio");
 }
 
 .contact > .dropdown-menu > .dropdown-menu-item > .icon-video-call {
   background-image: url("../shared/img/icons-16x16.svg#video");
--- a/browser/components/loop/content/css/panel.css
+++ b/browser/components/loop/content/css/panel.css
@@ -450,16 +450,54 @@ body[dir=rtl] .rooms > div > .context > 
 }
 
 .button-close:hover,
 .button-close:hover:active {
   background-color: transparent;
   border: none;
 }
 
+/* Dropdown menu */
+
+.dropdown {
+  position: relative;
+}
+
+.dropdown-menu {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  background-color: #fdfdfd;
+  box-shadow: 0 1px 3px rgba(0,0,0,.3);
+  list-style: none;
+  padding: 5px;
+  border-radius: 2px;
+}
+
+body[dir=rtl] .dropdown-menu-item {
+  left: auto;
+  right: 10px;
+}
+
+.dropdown-menu-item {
+  text-align: start;
+  margin: .3em 0;
+  padding: .2em .5em;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  font-size: 1em;
+  white-space: nowrap;
+}
+
+.dropdown-menu-item:hover {
+  border: 1px solid #ccc;
+  background-color: #eee;
+}
+
 /* Spinner */
 
 @keyframes spinnerRotate {
   to { transform: rotate(360deg); }
 }
 
 .spinner {
   width: 16px;
@@ -691,21 +729,21 @@ body[dir=rtl] .generate-url-spinner {
      set by .dropdown-menu */
   top: auto;
   left: auto;
   bottom: -8px;
   right: 14px;
 }
 
 .settings-menu .icon {
+  display: inline-block;
   background-size: contain;
   width: 12px;
   height: 12px;
   margin-right: 1em;
-  margin-top: 2px;
 }
 
 .settings-menu .icon-settings {
   background: transparent url(../shared/img/svg/glyph-settings-16x16.svg) no-repeat center center;
 }
 
 .settings-menu .icon-tour {
   background: transparent url("../shared/img/icons-16x16.svg#tour") no-repeat center center;
--- a/browser/components/loop/content/js/panel.js
+++ b/browser/components/loop/content/js/panel.js
@@ -162,17 +162,18 @@ loop.panel = (function(_, mozL10n) {
                               mozL10n.get("display_name_available_status");
 
       return (
         React.createElement("div", {className: "dropdown"}, 
           React.createElement("p", {className: "dnd-status", onClick: this.showDropdownMenu}, 
             React.createElement("span", null, availabilityText), 
             React.createElement("i", {className: availabilityStatus})
           ), 
-          React.createElement("ul", {className: availabilityDropdown}, 
+          React.createElement("ul", {className: availabilityDropdown, 
+              onMouseLeave: this.hideDropdownMenu}, 
             React.createElement("li", {onClick: this.changeAvailability("available"), 
                 className: "dropdown-menu-item dnd-make-available"}, 
               React.createElement("i", {className: "status status-available"}), 
               React.createElement("span", null, mozL10n.get("display_name_available_status"))
             ), 
             React.createElement("li", {onClick: this.changeAvailability("do-not-disturb"), 
                 className: "dropdown-menu-item dnd-make-unavailable"}, 
               React.createElement("i", {className: "status status-dnd"}), 
@@ -339,17 +340,18 @@ loop.panel = (function(_, mozL10n) {
 
     render: function() {
       var cx = React.addons.classSet;
 
       return (
         React.createElement("div", {className: "settings-menu dropdown"}, 
           React.createElement("a", {className: "button-settings", onClick: this.showDropdownMenu, 
              title: mozL10n.get("settings_menu_button_tooltip")}), 
-          React.createElement("ul", {className: cx({"dropdown-menu": true, hide: !this.state.showMenu})}, 
+          React.createElement("ul", {className: cx({"dropdown-menu": true, hide: !this.state.showMenu}), 
+              onMouseLeave: this.hideDropdownMenu}, 
             React.createElement(SettingsDropdownEntry, {label: mozL10n.get("settings_menu_item_settings"), 
                                    onClick: this.handleClickSettingsEntry, 
                                    displayed: false, 
                                    icon: "settings"}), 
             React.createElement(SettingsDropdownEntry, {label: mozL10n.get("settings_menu_item_account"), 
                                    onClick: this.handleClickAccountEntry, 
                                    icon: "account", 
                                    displayed: this._isSignedIn() && navigator.mozLoop.fxAEnabled}), 
--- a/browser/components/loop/content/js/panel.jsx
+++ b/browser/components/loop/content/js/panel.jsx
@@ -162,17 +162,18 @@ loop.panel = (function(_, mozL10n) {
                               mozL10n.get("display_name_available_status");
 
       return (
         <div className="dropdown">
           <p className="dnd-status" onClick={this.showDropdownMenu}>
             <span>{availabilityText}</span>
             <i className={availabilityStatus}></i>
           </p>
-          <ul className={availabilityDropdown}>
+          <ul className={availabilityDropdown}
+              onMouseLeave={this.hideDropdownMenu}>
             <li onClick={this.changeAvailability("available")}
                 className="dropdown-menu-item dnd-make-available">
               <i className="status status-available"></i>
               <span>{mozL10n.get("display_name_available_status")}</span>
             </li>
             <li onClick={this.changeAvailability("do-not-disturb")}
                 className="dropdown-menu-item dnd-make-unavailable">
               <i className="status status-dnd"></i>
@@ -339,17 +340,18 @@ loop.panel = (function(_, mozL10n) {
 
     render: function() {
       var cx = React.addons.classSet;
 
       return (
         <div className="settings-menu dropdown">
           <a className="button-settings" onClick={this.showDropdownMenu}
              title={mozL10n.get("settings_menu_button_tooltip")} />
-          <ul className={cx({"dropdown-menu": true, hide: !this.state.showMenu})}>
+          <ul className={cx({"dropdown-menu": true, hide: !this.state.showMenu})}
+              onMouseLeave={this.hideDropdownMenu}>
             <SettingsDropdownEntry label={mozL10n.get("settings_menu_item_settings")}
                                    onClick={this.handleClickSettingsEntry}
                                    displayed={false}
                                    icon="settings" />
             <SettingsDropdownEntry label={mozL10n.get("settings_menu_item_account")}
                                    onClick={this.handleClickAccountEntry}
                                    icon="account"
                                    displayed={this._isSignedIn() && navigator.mozLoop.fxAEnabled} />
--- a/browser/components/loop/content/js/roomViews.js
+++ b/browser/components/loop/content/js/roomViews.js
@@ -50,120 +50,21 @@ loop.roomViews = (function(mozL10n) {
       var storeState = this.props.roomStore.getStoreState("activeRoom");
       return _.extend({
         // Used by the UI showcase.
         roomState: this.props.roomState || storeState.roomState
       }, storeState);
     }
   };
 
-  var SocialShareDropdown = React.createClass({displayName: "SocialShareDropdown",
-    mixins: [ActiveRoomStoreMixin],
-
-    propTypes: {
-      dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
-      show: React.PropTypes.bool.isRequired
-    },
-
-    handleToolbarAddButtonClick: function(event) {
-      event.preventDefault();
-
-      this.props.dispatcher.dispatch(new sharedActions.AddSocialShareButton());
-    },
-
-    handleAddServiceClick: function(event) {
-      event.preventDefault();
-
-      this.props.dispatcher.dispatch(new sharedActions.AddSocialShareProvider());
-    },
-
-    handleProviderClick: function(event) {
-      event.preventDefault();
-
-      var origin = event.currentTarget.dataset.provider;
-      var provider = this.state.socialShareProviders.filter(function(provider) {
-        return provider.origin == origin;
-      })[0];
-
-      this.props.dispatcher.dispatch(new sharedActions.ShareRoomUrl({
-        provider: provider,
-        roomUrl: this.state.roomUrl,
-        previews: []
-      }));
-    },
-
-    render: function() {
-      // Don't render a thing when no data has been fetched yet.
-      if (!this.state.socialShareProviders) {
-        return null;
-      }
-
-      var cx = React.addons.classSet;
-      var shareDropdown = cx({
-        "share-service-dropdown": true,
-        "dropdown-menu": true,
-        "share-button-unavailable": !this.state.socialShareButtonAvailable,
-        "hide": !this.props.show
-      });
-
-      // When the button is not yet available, we offer to put it in the navbar
-      // for the user.
-      if (!this.state.socialShareButtonAvailable) {
-        return (
-          React.createElement("div", {className: shareDropdown}, 
-            React.createElement("div", {className: "share-panel-header"}, 
-              mozL10n.get("share_panel_header")
-            ), 
-            React.createElement("div", {className: "share-panel-body"}, 
-              
-                mozL10n.get("share_panel_body", {
-                  brandShortname: mozL10n.get("brandShortname"),
-                  clientSuperShortname: mozL10n.get("clientSuperShortname"),
-                })
-              
-            ), 
-            React.createElement("button", {className: "btn btn-info btn-toolbar-add", 
-                    onClick: this.handleToolbarAddButtonClick}, 
-              mozL10n.get("add_to_toolbar_button")
-            )
-          )
-        );
-      }
-
-      return (
-        React.createElement("ul", {className: shareDropdown}, 
-          React.createElement("li", {className: "dropdown-menu-item", onClick: this.handleAddServiceClick}, 
-            React.createElement("i", {className: "icon icon-add-share-service"}), 
-            React.createElement("span", null, mozL10n.get("share_add_service_button"))
-          ), 
-          this.state.socialShareProviders.length ? React.createElement("li", {className: "dropdown-menu-separator"}) : null, 
-          
-            this.state.socialShareProviders.map(function(provider, idx) {
-              return (
-                React.createElement("li", {className: "dropdown-menu-item", 
-                    key: "provider-" + idx, 
-                    "data-provider": provider.origin, 
-                    onClick: this.handleProviderClick}, 
-                  React.createElement("img", {className: "icon", src: provider.iconURL}), 
-                  React.createElement("span", null, provider.name)
-                )
-              );
-            }.bind(this))
-          
-        )
-      );
-    }
-  });
-
   /**
    * Desktop room invitation view (overlay).
    */
   var DesktopRoomInvitationView = React.createClass({displayName: "DesktopRoomInvitationView",
-    mixins: [ActiveRoomStoreMixin, React.addons.LinkedStateMixin,
-             sharedMixins.DropdownMenuMixin],
+    mixins: [ActiveRoomStoreMixin, React.addons.LinkedStateMixin],
 
     propTypes: {
       dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired
     },
 
     getInitialState: function() {
       return {
         copiedUrl: false,
@@ -211,22 +112,16 @@ loop.roomViews = (function(mozL10n) {
       event.preventDefault();
 
       this.props.dispatcher.dispatch(
         new sharedActions.CopyRoomUrl({roomUrl: this.state.roomUrl}));
 
       this.setState({copiedUrl: true});
     },
 
-    handleShareButtonClick: function(event) {
-      event.preventDefault();
-
-      this.toggleDropdownMenu();
-    },
-
     onRoomError: function() {
       // Only update the state if we're mounted, to avoid the problem where
       // stopListening doesn't nuke the active listeners during a event
       // processing.
       if (this.isMounted()) {
         this.setState({error: this.props.roomStore.getStoreState("error")});
       }
     },
@@ -245,33 +140,24 @@ loop.roomViews = (function(mozL10n) {
               onBlur: this.handleFormSubmit, 
               onKeyDown: this.handleTextareaKeyDown, 
               placeholder: mozL10n.get("rooms_name_this_room_label")})
           ), 
           React.createElement("p", null, mozL10n.get("invite_header_text")), 
           React.createElement("div", {className: "btn-group call-action-group"}, 
             React.createElement("button", {className: "btn btn-info btn-email", 
                     onClick: this.handleEmailButtonClick}, 
-              mozL10n.get("email_link_button")
+              mozL10n.get("share_button2")
             ), 
             React.createElement("button", {className: "btn btn-info btn-copy", 
                     onClick: this.handleCopyButtonClick}, 
               this.state.copiedUrl ? mozL10n.get("copied_url_button") :
                                       mozL10n.get("copy_url_button2")
-            ), 
-            React.createElement("button", {className: "btn btn-info btn-share", 
-                    ref: "anchor", 
-                    onClick: this.handleShareButtonClick}, 
-              mozL10n.get("share_button3")
             )
-          ), 
-          React.createElement(SocialShareDropdown, {dispatcher: this.props.dispatcher, 
-                               roomStore: this.props.roomStore, 
-                               show: this.state.showMenu, 
-                               ref: "menu"})
+          )
         )
       );
     }
   });
 
   /**
    * Desktop room conversation view.
    */
@@ -397,14 +283,13 @@ loop.roomViews = (function(mozL10n) {
           );
         }
       }
     }
   });
 
   return {
     ActiveRoomStoreMixin: ActiveRoomStoreMixin,
-    SocialShareDropdown: SocialShareDropdown,
     DesktopRoomConversationView: DesktopRoomConversationView,
     DesktopRoomInvitationView: DesktopRoomInvitationView
   };
 
 })(document.mozL10n || navigator.mozL10n);
--- a/browser/components/loop/content/js/roomViews.jsx
+++ b/browser/components/loop/content/js/roomViews.jsx
@@ -50,120 +50,21 @@ loop.roomViews = (function(mozL10n) {
       var storeState = this.props.roomStore.getStoreState("activeRoom");
       return _.extend({
         // Used by the UI showcase.
         roomState: this.props.roomState || storeState.roomState
       }, storeState);
     }
   };
 
-  var SocialShareDropdown = React.createClass({
-    mixins: [ActiveRoomStoreMixin],
-
-    propTypes: {
-      dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
-      show: React.PropTypes.bool.isRequired
-    },
-
-    handleToolbarAddButtonClick: function(event) {
-      event.preventDefault();
-
-      this.props.dispatcher.dispatch(new sharedActions.AddSocialShareButton());
-    },
-
-    handleAddServiceClick: function(event) {
-      event.preventDefault();
-
-      this.props.dispatcher.dispatch(new sharedActions.AddSocialShareProvider());
-    },
-
-    handleProviderClick: function(event) {
-      event.preventDefault();
-
-      var origin = event.currentTarget.dataset.provider;
-      var provider = this.state.socialShareProviders.filter(function(provider) {
-        return provider.origin == origin;
-      })[0];
-
-      this.props.dispatcher.dispatch(new sharedActions.ShareRoomUrl({
-        provider: provider,
-        roomUrl: this.state.roomUrl,
-        previews: []
-      }));
-    },
-
-    render: function() {
-      // Don't render a thing when no data has been fetched yet.
-      if (!this.state.socialShareProviders) {
-        return null;
-      }
-
-      var cx = React.addons.classSet;
-      var shareDropdown = cx({
-        "share-service-dropdown": true,
-        "dropdown-menu": true,
-        "share-button-unavailable": !this.state.socialShareButtonAvailable,
-        "hide": !this.props.show
-      });
-
-      // When the button is not yet available, we offer to put it in the navbar
-      // for the user.
-      if (!this.state.socialShareButtonAvailable) {
-        return (
-          <div className={shareDropdown}>
-            <div className="share-panel-header">
-              {mozL10n.get("share_panel_header")}
-            </div>
-            <div className="share-panel-body">
-              {
-                mozL10n.get("share_panel_body", {
-                  brandShortname: mozL10n.get("brandShortname"),
-                  clientSuperShortname: mozL10n.get("clientSuperShortname"),
-                })
-              }
-            </div>
-            <button className="btn btn-info btn-toolbar-add"
-                    onClick={this.handleToolbarAddButtonClick}>
-              {mozL10n.get("add_to_toolbar_button")}
-            </button>
-          </div>
-        );
-      }
-
-      return (
-        <ul className={shareDropdown}>
-          <li className="dropdown-menu-item" onClick={this.handleAddServiceClick}>
-            <i className="icon icon-add-share-service"></i>
-            <span>{mozL10n.get("share_add_service_button")}</span>
-          </li>
-          {this.state.socialShareProviders.length ? <li className="dropdown-menu-separator"/> : null}
-          {
-            this.state.socialShareProviders.map(function(provider, idx) {
-              return (
-                <li className="dropdown-menu-item"
-                    key={"provider-" + idx}
-                    data-provider={provider.origin}
-                    onClick={this.handleProviderClick}>
-                  <img className="icon" src={provider.iconURL}/>
-                  <span>{provider.name}</span>
-                </li>
-              );
-            }.bind(this))
-          }
-        </ul>
-      );
-    }
-  });
-
   /**
    * Desktop room invitation view (overlay).
    */
   var DesktopRoomInvitationView = React.createClass({
-    mixins: [ActiveRoomStoreMixin, React.addons.LinkedStateMixin,
-             sharedMixins.DropdownMenuMixin],
+    mixins: [ActiveRoomStoreMixin, React.addons.LinkedStateMixin],
 
     propTypes: {
       dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired
     },
 
     getInitialState: function() {
       return {
         copiedUrl: false,
@@ -211,22 +112,16 @@ loop.roomViews = (function(mozL10n) {
       event.preventDefault();
 
       this.props.dispatcher.dispatch(
         new sharedActions.CopyRoomUrl({roomUrl: this.state.roomUrl}));
 
       this.setState({copiedUrl: true});
     },
 
-    handleShareButtonClick: function(event) {
-      event.preventDefault();
-
-      this.toggleDropdownMenu();
-    },
-
     onRoomError: function() {
       // Only update the state if we're mounted, to avoid the problem where
       // stopListening doesn't nuke the active listeners during a event
       // processing.
       if (this.isMounted()) {
         this.setState({error: this.props.roomStore.getStoreState("error")});
       }
     },
@@ -245,33 +140,24 @@ loop.roomViews = (function(mozL10n) {
               onBlur={this.handleFormSubmit}
               onKeyDown={this.handleTextareaKeyDown}
               placeholder={mozL10n.get("rooms_name_this_room_label")} />
           </form>
           <p>{mozL10n.get("invite_header_text")}</p>
           <div className="btn-group call-action-group">
             <button className="btn btn-info btn-email"
                     onClick={this.handleEmailButtonClick}>
-              {mozL10n.get("email_link_button")}
+              {mozL10n.get("share_button2")}
             </button>
             <button className="btn btn-info btn-copy"
                     onClick={this.handleCopyButtonClick}>
               {this.state.copiedUrl ? mozL10n.get("copied_url_button") :
                                       mozL10n.get("copy_url_button2")}
             </button>
-            <button className="btn btn-info btn-share"
-                    ref="anchor"
-                    onClick={this.handleShareButtonClick}>
-              {mozL10n.get("share_button3")}
-            </button>
           </div>
-          <SocialShareDropdown dispatcher={this.props.dispatcher}
-                               roomStore={this.props.roomStore}
-                               show={this.state.showMenu}
-                               ref="menu"/>
         </div>
       );
     }
   });
 
   /**
    * Desktop room conversation view.
    */
@@ -397,14 +283,13 @@ loop.roomViews = (function(mozL10n) {
           );
         }
       }
     }
   });
 
   return {
     ActiveRoomStoreMixin: ActiveRoomStoreMixin,
-    SocialShareDropdown: SocialShareDropdown,
     DesktopRoomConversationView: DesktopRoomConversationView,
     DesktopRoomInvitationView: DesktopRoomInvitationView
   };
 
 })(document.mozL10n || navigator.mozL10n);
--- a/browser/components/loop/content/shared/css/common.css
+++ b/browser/components/loop/content/shared/css/common.css
@@ -11,17 +11,16 @@
 *, *:before, *:after {
   box-sizing: border-box;
 }
 
 body {
   font: message-box;
   font-size: 12px;
   background: #fbfbfb;
-  overflow: hidden;
 }
 
 img {
   border: none;
 }
 
 h1, h2, h3 {
   color: #666;
@@ -403,58 +402,8 @@ p {
 
 .firefox-logo {
   margin: 0 auto; /* horizontal block centering */
   width: 100px;
   height: 100px;
   background: transparent url(../img/firefox-logo.png) no-repeat center center;
   background-size: contain;
 }
-
-/* Dropdown menu */
-
-.dropdown {
-  position: relative;
-}
-
-.dropdown-menu {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  background-color: #fdfdfd;
-  box-shadow: 0 1px 3px rgba(0,0,0,.3);
-  list-style: none;
-  padding: 5px;
-  border-radius: 2px;
-}
-
-body[dir=rtl] .dropdown-menu-item {
-  left: auto;
-  right: 10px;
-}
-
-.dropdown-menu-item {
-  text-align: start;
-  margin: .3em 0;
-  padding: .2em .5em;
-  cursor: pointer;
-  border: 1px solid transparent;
-  border-radius: 2px;
-  font-size: 1em;
-  white-space: nowrap;
-}
-
-.dropdown-menu-item:hover {
-  border: 1px solid #ccc;
-  background-color: #eee;
-}
-
-.dropdown-menu-item > .icon {
-  background-repeat: no-repeat;
-  display: inline-block;
-}
-
-.dropdown-menu-separator {
-  height: 1px;
-  margin: 2px -2px 1px -2px;
-  border-top: 1px solid #dedede;
-  background-color: #fff;
-}
--- a/browser/components/loop/content/shared/css/conversation.css
+++ b/browser/components/loop/content/shared/css/conversation.css
@@ -897,73 +897,16 @@ html, .fx-embedded, #main,
   border-radius: .5em;
 }
 
 .room-invitation-overlay .btn-group {
   position: absolute;
   bottom: 10px;
 }
 
-.share-service-dropdown {
-  color: #000;
-  text-align: start;
-  bottom: auto;
-  top: 0;
-}
-
-.share-service-dropdown.share-button-unavailable {
-  width: 230px;
-  padding: 8px;
-}
-
-.share-service-dropdown > .dropdown-menu-item > .icon {
-  width: 14px;
-  height: 14px;
-  margin-right: 4px;
-}
-
-.share-service-dropdown .share-panel-header {
-  background-image: url("../img/icons-16x16.svg#share-darkgrey");
-  background-size: 3em 3em;
-  background-repeat: no-repeat;
-  min-height: 3em;
-  font-weight: bold;
-  margin-bottom: 1em;
-  padding-left: 4.5em;
-}
-
-body[dir=rtl] .share-service-dropdown .share-panel-header {
-  background-position: top right;
-  padding-left: 0;
-  padding-right: 4.5em;
-}
-
-.share-service-dropdown .btn-toolbar-add {
-  padding: 4px 2px;
-  border-radius: 2px;
-  margin-top: 1em;
-  width: 100%;
-}
-
-.dropdown-menu-item > .icon-add-share-service {
-  background-image: url("../img/icons-16x16.svg#add");
-  background-repeat: no-repeat;
-  background-size: 12px 12px;
-  width: 12px;
-  height: 12px;
-}
-
-.dropdown-menu-item:hover > .icon-add-share-service {
-  background-image: url("../img/icons-16x16.svg#add-hover");
-}
-
-.dropdown-menu-item:hover:active > .icon-add-share-service {
-  background-image: url("../img/icons-16x16.svg#add-active");
-}
-
 /* Standalone rooms */
 
 .standalone .room-conversation-wrapper {
   position: relative;
   height: 100%;
   background: #000;
 }
 
--- a/browser/components/loop/content/shared/img/icons-16x16.svg
+++ b/browser/components/loop/content/shared/img/icons-16x16.svg
@@ -28,27 +28,21 @@ use[id$="-active"] {
 use[id$="-red"] {
   fill: #d74345
 }
 
 use[id$="-white"] {
   fill: #fff;
 }
 
-use[id$="-darkgrey"] {
-  fill: #666;
-}
-
 use[id$="-disabled"] {
   fill: rgba(255,255,255,.6);
 }
 </style>
 <defs style="display:none">
-  <polygon id="add-shape" fill-rule="evenodd" clip-rule="evenodd" points="16,6.4 9.6,6.4 9.6,0 6.4,0 6.4,6.4 0,6.4 0,9.6
-    6.4,9.6 6.4,16 9.6,16 9.6,9.6 16,9.6"/>
   <path id="audio-shape" fill-rule="evenodd" clip-rule="evenodd" d="M11.429,6.857v2.286c0,1.894-1.535,3.429-3.429,3.429
     c-1.894,0-3.429-1.535-3.429-3.429V6.857H3.429v2.286c0,2.129,1.458,3.913,3.429,4.422v1.293H6.286
     c-0.746,0-1.379,0.477-1.615,1.143h6.658c-0.236-0.665-0.869-1.143-1.615-1.143H9.143v-1.293c1.971-0.508,3.429-2.292,3.429-4.422
     V6.857H11.429z M8,12c1.578,0,2.857-1.279,2.857-2.857V2.857C10.857,1.279,9.578,0,8,0C6.422,0,5.143,1.279,5.143,2.857v6.286
     C5.143,10.721,6.422,12,8,12z"/>
   <path id="block-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,0C3.582,0,0,3.582,0,8c0,4.418,3.582,8,8,8
     c4.418,0,8-3.582,8-8C16,3.582,12.418,0,8,0z M8,2.442c1.073,0,2.075,0.301,2.926,0.821l-7.673,7.673
     C2.718,10.085,2.408,9.079,2.408,8C2.408,4.931,4.911,2.442,8,2.442z M8,13.557c-1.073,0-2.075-0.301-2.926-0.821l7.673-7.673
@@ -85,27 +79,16 @@ use[id$="-disabled"] {
     l-0.209,0.596c-0.874-0.205-1.692-0.553-2.434-1.011l0.272-0.567c0.171-0.355-0.17-1.066-0.739-1.635
     c-0.568-0.568-1.279-0.909-1.635-0.738l-0.568,0.273c-0.46-0.741-0.79-1.566-0.998-2.439l0.584-0.205
     C0.969,9.547,1.231,8.804,1.231,8c0-0.804-0.262-1.548-0.634-1.678L0,6.112c0.206-0.874,0.565-1.685,1.025-2.427l0.554,0.266
     c0.355,0.171,1.066-0.17,1.635-0.738c0.569-0.568,0.909-1.28,0.739-1.635L3.686,1.025c0.742-0.46,1.553-0.818,2.427-1.024
     l0.209,0.596C6.453,0.969,7.197,1.23,8.001,1.23s1.548-0.262,1.678-0.634l0.209-0.596c0.874,0.205,1.692,0.553,2.434,1.011
     l-0.272,0.567c-0.171,0.355,0.17,1.066,0.738,1.635c0.569,0.568,1.279,0.909,1.635,0.738l0.568-0.273
     c0.46,0.741,0.79,1.566,0.998,2.438l-0.584,0.205C15.032,6.452,14.77,7.196,14.77,8z M8.001,3.661C5.604,3.661,3.661,5.603,3.661,8
     c0,2.397,1.943,4.34,4.339,4.34c2.397,0,4.339-1.943,4.339-4.34C12.34,5.603,10.397,3.661,8.001,3.661z"/>
-  <g id="share-shape">
-    <path fill="transparent" d="M11.704,12.375H7.556c-0.183,0-0.353-0.071-0.48-0.199c-0.124-0.125-0.191-0.29-0.19-0.464V10.09h-2.59
-      c-0.37,0-0.671-0.296-0.671-0.661V4.286c0-0.365,0.301-0.661,0.671-0.661h3.384L7.817,3.73l1.299,1.254v0.927h1.851
-      l1.408,1.359v4.444C12.375,12.079,12.074,12.375,11.704,12.375z M7.635,11.625h3.989V7.588l-0.961-0.927H7.635V11.625z
-      M4.375,9.34h2.5V6.561c0-0.365,0.301-0.661,0.671-0.661h0.82V5.302L7.405,4.375h-3.03V9.34z"/>
-    <polygon fill="transparent" points="10.222,8 10.222,6.857 11.407,8"/>
-    <polygon fill="transparent" points="6.963,5.714 6.963,4.571 8.148,5.714"/>
-    <path fill-rule="evenodd" clip-rule="evenodd" d="M8.999,10.654L8.69,10.6L8.999,16l2.56-3.754L8.999,10.654z
-      M8.658,10.041l0.341-0.043l6,2.898V0L1,10.998l4.55-0.569L8.999,16l-1.892-5.68l-0.283-0.05l0.256-0.032L7,9.998l6.999-8.003
-      L8.656,9.998L8.658,10.041z"/>
-  </g>
   <path id="tag-shape" fill-rule="evenodd" clip-rule="evenodd" d="M15.578,7.317L9.659,1.398
     C9.374,1.033,8.955,0.777,8.471,0.761L2.556,0C1.72-0.027-0.027,1.72,0,2.556l0.761,5.916c0.016,0.484,0.272,0.902,0.637,1.188
     l5.919,5.919c0.591,0.591,1.584,0.557,2.218-0.076l5.966-5.966C16.135,8.902,16.169,7.909,15.578,7.317z M4.222,4.163
     c-0.511,0.511-1.339,0.511-1.85,0c-0.511-0.511-0.511-1.339,0-1.85c0.511-0.511,1.339-0.511,1.85,0
     C4.733,2.823,4.733,3.652,4.222,4.163z"/>
   <path id="unblock-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,16c-4.418,0-8-3.582-8-8c0-4.418,3.582-8,8-8
     c4.418,0,8,3.582,8,8C16,12.418,12.418,16,8,16z M8,2.442C4.911,2.442,2.408,4.931,2.408,8c0,3.069,2.504,5.557,5.592,5.557
     S13.592,11.069,13.592,8C13.592,4.931,11.089,2.442,8,2.442z"/>
@@ -160,19 +143,16 @@ use[id$="-disabled"] {
   <g id="screenmute-shape">
     <path fill-rule="evenodd" clip-rule="evenodd" d="M13.55,4.73h-0.54l-8.13,8.13L4.2,13.53
       C4.46,13.82,4.84,14,5.25,14h8.3c0.8,0,1.45-0.68,1.45-1.52V6.24C15,5.41,14.35,4.73,13.55,4.73z"/>
     <path fill-rule="evenodd" clip-rule="evenodd" d="M14.21,2.72l-0.99-0.99l-1.15,1.15C11.83,2.36,11.33,2,10.75,2
       h-8.3C1.65,2,1,2.68,1,3.52v6.24c0,0.83,0.65,1.51,1.45,1.51h0.52V5.43c0-0.84,0.65-1.51,1.45-1.51h6.61l-0.81,
       0.81H5.25 c-0.8,0-1.45,0.68-1.45,1.51v4.91l-1.89,1.89l0.99,0.99l1-1l8.3-8.3L14.21,2.72z"/>
   </g>
 </defs>
-<use id="add"                 xlink:href="#add-shape"/>
-<use id="add-hover"           xlink:href="#add-shape"/>
-<use id="add-active"          xlink:href="#add-shape"/>
 <use id="audio"               xlink:href="#audio-shape"/>
 <use id="audio-hover"         xlink:href="#audio-shape"/>
 <use id="audio-active"        xlink:href="#audio-shape"/>
 <use id="block"               xlink:href="#block-shape"/>
 <use id="block-red"           xlink:href="#block-shape"/>
 <use id="block-hover"         xlink:href="#block-shape"/>
 <use id="block-active"        xlink:href="#block-shape"/>
 <use id="contacts"            xlink:href="#contacts-shape"/>
@@ -188,17 +168,16 @@ use[id$="-disabled"] {
 <use id="history-active"      xlink:href="#history-shape"/>
 <use id="leave"               xlink:href="#leave-shape"/>
 <use id="precall"             xlink:href="#precall-shape"/>
 <use id="precall-hover"       xlink:href="#precall-shape"/>
 <use id="precall-active"      xlink:href="#precall-shape"/>
 <use id="settings"            xlink:href="#settings-shape"/>
 <use id="settings-hover"      xlink:href="#settings-shape"/>
 <use id="settings-active"     xlink:href="#settings-shape"/>
-<use id="share-darkgrey"      xlink:href="#share-shape"/>
 <use id="tag"                 xlink:href="#tag-shape"/>
 <use id="tag-hover"           xlink:href="#tag-shape"/>
 <use id="tag-active"          xlink:href="#tag-shape"/>
 <use id="trash"               xlink:href="#trash-shape"/>
 <use id="unblock"             xlink:href="#unblock-shape"/>
 <use id="unblock-hover"       xlink:href="#unblock-shape"/>
 <use id="unblock-active"      xlink:href="#unblock-shape"/>
 <use id="video"               xlink:href="#video-shape"/>
--- a/browser/components/loop/content/shared/js/actions.js
+++ b/browser/components/loop/content/shared/js/actions.js
@@ -353,39 +353,16 @@ loop.shared.actions = (function() {
      * Email a room url.
      * XXX: should move to some roomActions module - refs bug 1079284
      */
     EmailRoomUrl: Action.define("emailRoomUrl", {
       roomUrl: String
     }),
 
     /**
-     * Share a room url via the Social API.
-     * XXX: should move to some roomActions module - refs bug 1079284
-     */
-    ShareRoomUrl: Action.define("shareRoomUrl", {
-      provider: Object,
-      roomUrl: String
-    }),
-
-    /**
-     * Add the Social Share button to the browser toolbar.
-     * XXX: should move to some roomActions module - refs bug 1079284
-     */
-    AddSocialShareButton: Action.define("addSocialShareButton", {
-    }),
-
-    /**
-     * Open the share panel to add a Social share provider.
-     * XXX: should move to some roomActions module - refs bug 1079284
-     */
-    AddSocialShareProvider: Action.define("addSocialShareProvider", {
-    }),
-
-    /**
      * XXX: should move to some roomActions module - refs bug 1079284
      */
     RoomFailure: Action.define("roomFailure", {
       error: Object,
       // True when the failures occurs in the join room request to the loop-server.
       failedJoinRequest: Boolean
     }),
 
@@ -394,43 +371,32 @@ loop.shared.actions = (function() {
      * XXX: should move to some roomActions module - refs bug 1079284
      *
      * @see https://wiki.mozilla.org/Loop/Architecture/Rooms#GET_.2Frooms.2F.7Btoken.7D
      */
     SetupRoomInfo: Action.define("setupRoomInfo", {
       // roomName: String - Optional.
       roomOwner: String,
       roomToken: String,
-      roomUrl: String,
-      socialShareButtonAvailable: Boolean,
-      socialShareProviders: Array
+      roomUrl: String
     }),
 
     /**
      * Updates the room information when it is received.
      * XXX: should move to some roomActions module - refs bug 1079284
      *
      * @see https://wiki.mozilla.org/Loop/Architecture/Rooms#GET_.2Frooms.2F.7Btoken.7D
      */
     UpdateRoomInfo: Action.define("updateRoomInfo", {
       // roomName: String - Optional.
       roomOwner: String,
       roomUrl: String
     }),
 
     /**
-     * Updates the Social API information when it is received.
-     * XXX: should move to some roomActions module - refs bug 1079284
-     */
-    UpdateSocialShareInfo: Action.define("updateSocialShareInfo", {
-      socialShareButtonAvailable: Boolean,
-      socialShareProviders: Array
-    }),
-
-    /**
      * Starts the process for the user to join the room.
      * XXX: should move to some roomActions module - refs bug 1079284
      */
     JoinRoom: Action.define("joinRoom", {
     }),
 
     /**
      * Signals the user has successfully joined the room on the loop-server.
--- a/browser/components/loop/content/shared/js/activeRoomStore.js
+++ b/browser/components/loop/content/shared/js/activeRoomStore.js
@@ -71,20 +71,17 @@ loop.store.ActiveRoomStore = (function()
         // Tracks if the room has been used during this
         // session. 'Used' means at least one call has been placed
         // with it. Entering and leaving the room without seeing
         // anyone is not considered as 'used'
         used: false,
         localVideoDimensions: {},
         remoteVideoDimensions: {},
         screenSharingState: SCREEN_SHARE_STATES.INACTIVE,
-        receivingScreenShare: false,
-        // Social API state.
-        socialShareButtonAvailable: false,
-        socialShareProviders: null
+        receivingScreenShare: false
       };
     },
 
     /**
      * Handles a room failure.
      *
      * @param {sharedActions.RoomFailure} actionData
      */
@@ -130,18 +127,17 @@ loop.store.ActiveRoomStore = (function()
         "receivingScreenShare",
         "remotePeerDisconnected",
         "remotePeerConnected",
         "windowUnload",
         "leaveRoom",
         "feedbackComplete",
         "videoDimensionsChanged",
         "startScreenShare",
-        "endScreenShare",
-        "updateSocialShareInfo"
+        "endScreenShare"
       ]);
     },
 
     /**
      * Execute setupWindowData event action from the dispatcher. This gets
      * the room data from the mozLoop api, and dispatches an UpdateRoomInfo event.
      * It also dispatches JoinRoom as this action is only applicable to the desktop
      * client, and needs to auto-join.
@@ -171,19 +167,17 @@ loop.store.ActiveRoomStore = (function()
             }));
             return;
           }
 
           this.dispatchAction(new sharedActions.SetupRoomInfo({
             roomToken: actionData.roomToken,
             roomName: roomData.roomName,
             roomOwner: roomData.roomOwner,
-            roomUrl: roomData.roomUrl,
-            socialShareButtonAvailable: this._mozLoop.isSocialShareButtonAvailable(),
-            socialShareProviders: this._mozLoop.getSocialShareProviders()
+            roomUrl: roomData.roomUrl
           }));
 
           // For the conversation window, we need to automatically
           // join the room.
           this.dispatchAction(new sharedActions.JoinRoom());
         }.bind(this));
     },
 
@@ -238,58 +232,40 @@ loop.store.ActiveRoomStore = (function()
         return;
       }
 
       this.setStoreState({
         roomName: actionData.roomName,
         roomOwner: actionData.roomOwner,
         roomState: ROOM_STATES.READY,
         roomToken: actionData.roomToken,
-        roomUrl: actionData.roomUrl,
-        socialShareButtonAvailable: actionData.socialShareButtonAvailable,
-        socialShareProviders: actionData.socialShareProviders
+        roomUrl: actionData.roomUrl
       });
 
       this._onUpdateListener = this._handleRoomUpdate.bind(this);
       this._onDeleteListener = this._handleRoomDelete.bind(this);
-      this._onSocialShareUpdate = this._handleSocialShareUpdate.bind(this);
 
       this._mozLoop.rooms.on("update:" + actionData.roomToken, this._onUpdateListener);
       this._mozLoop.rooms.on("delete:" + actionData.roomToken, this._onDeleteListener);
-      window.addEventListener("LoopShareWidgetChanged", this._onSocialShareUpdate);
-      window.addEventListener("LoopSocialProvidersChanged", this._onSocialShareUpdate);
     },
 
     /**
      * Handles the updateRoomInfo action. Updates the room data.
      *
      * @param {sharedActions.UpdateRoomInfo} actionData
      */
     updateRoomInfo: function(actionData) {
       this.setStoreState({
         roomName: actionData.roomName,
         roomOwner: actionData.roomOwner,
         roomUrl: actionData.roomUrl
       });
     },
 
     /**
-     * Handles the updateSocialShareInfo action. Updates the room data with new
-     * Social API info.
-     *
-     * @param  {sharedActions.UpdateSocialShareInfo} actionData
-     */
-    updateSocialShareInfo: function(actionData) {
-      this.setStoreState({
-        socialShareButtonAvailable: actionData.socialShareButtonAvailable,
-        socialShareProviders: actionData.socialShareProviders
-      });
-    },
-
-    /**
      * Handles room updates notified by the mozLoop rooms API.
      *
      * @param {String} eventName The name of the event
      * @param {Object} roomData  The new roomData.
      */
     _handleRoomUpdate: function(eventName, roomData) {
       this.dispatchAction(new sharedActions.UpdateRoomInfo({
         roomName: roomData.roomName,
@@ -306,27 +282,16 @@ loop.store.ActiveRoomStore = (function()
      */
     _handleRoomDelete: function(eventName, roomData) {
       this._sdkDriver.forceDisconnectAll(function() {
         window.close();
       });
     },
 
     /**
-     * Handles an update of the position of the Share widget and changes to list
-     * of Social API providers, notified by the mozLoop API.
-     */
-    _handleSocialShareUpdate: function() {
-      this.dispatchAction(new sharedActions.UpdateSocialShareInfo({
-        socialShareButtonAvailable: this._mozLoop.isSocialShareButtonAvailable(),
-        socialShareProviders: this._mozLoop.getSocialShareProviders()
-      }));
-    },
-
-    /**
      * Handles the action to join to a room.
      */
     joinRoom: function() {
       // Reset the failure reason if necessary.
       if (this.getStoreState().failureReason) {
         this.setStoreState({failureReason: undefined});
       }
 
@@ -567,22 +532,18 @@ loop.store.ActiveRoomStore = (function()
       if (!this._onUpdateListener) {
         return;
       }
 
       // If we're closing the window, we can stop listening to updates.
       var roomToken = this.getStoreState().roomToken;
       this._mozLoop.rooms.off("update:" + roomToken, this._onUpdateListener);
       this._mozLoop.rooms.off("delete:" + roomToken, this._onDeleteListener);
-      window.removeEventListener("LoopShareWidgetChanged", this._onShareWidgetUpdate);
-      window.removeEventListener("LoopSocialProvidersChanged", this._onSocialProvidersUpdate);
       delete this._onUpdateListener;
       delete this._onDeleteListener;
-      delete this._onShareWidgetUpdate;
-      delete this._onSocialProvidersUpdate;
     },
 
     /**
      * Handles a room being left.
      */
     leaveRoom: function() {
       this._leaveRoom(ROOM_STATES.ENDED);
     },
--- a/browser/components/loop/content/shared/js/mixins.js
+++ b/browser/components/loop/content/shared/js/mixins.js
@@ -93,87 +93,61 @@ loop.shared.mixins = (function() {
     getInitialState: function() {
       return {showMenu: false};
     },
 
     _onBodyClick: function() {
       this.setState({showMenu: false});
     },
 
-    _correctMenuPosition: function() {
-      var menu = this.refs.menu && this.refs.menu.getDOMNode();
+    componentDidMount: function() {
+      this.documentBody.addEventListener("click", this._onBodyClick);
+      this.documentBody.addEventListener("blur", this.hideDropdownMenu);
+
+      var menu = this.refs.menu;
       if (!menu) {
         return;
       }
 
-      // Correct the position of the menu only if necessary.
-      var x, y;
-      var menuNodeRect = menu.getBoundingClientRect();
-      var x = menuNodeRect.left;
-      var y = menuNodeRect.top;
-      // Amount of pixels that the dropdown needs to stay away from the edges of
-      // the page body.
-      var bodyMargin = 10;
+      // Correct the position of the menu if necessary.
+      var menuNode = menu.getDOMNode();
+      var menuNodeRect = menuNode.getBoundingClientRect();
       var bodyRect = {
-        height: this.documentBody.offsetHeight - bodyMargin,
-        width: this.documentBody.offsetWidth - bodyMargin
+        height: this.documentBody.offsetHeight,
+        width: this.documentBody.offsetWidth
       };
 
-      // If there's an anchor present, position it relative to it first.
-      var anchor = this.refs.anchor && this.refs.anchor.getDOMNode();
-      if (anchor) {
-        // XXXmikedeboer: at the moment we only support positioning centered above
-        //                anchor node. Please add more modes as necessary.
-        var anchorNodeRect = anchor.getBoundingClientRect();
-        // Because we're _correcting_ the position of the dropdown, we assume that
-        // the node is positioned absolute at 0,0 coordinates (top left).
-        x = anchorNodeRect.left - (menuNodeRect.width / 2) + (anchorNodeRect.width / 2);
-        y = anchorNodeRect.top - menuNodeRect.height - anchorNodeRect.height;
+      // First we check the vertical overflow.
+      var y = menuNodeRect.top + menuNodeRect.height;
+      if (y >= bodyRect.height) {
+        menuNode.style.marginTop = bodyRect.height - y + "px";
       }
 
-      var overflowX = false;
-      var overflowY = false;
-      // Check the horizontal overflow.
-      if (x + menuNodeRect.width > bodyRect.width) {
-        // Anchor positioning is already relative, so don't subtract it again.
-        x = bodyRect.width - ((anchor ? 0 : x) + menuNodeRect.width);
-        overflowX = true;
+      // Then we check the horizontal overflow.
+      var x = menuNodeRect.left + menuNodeRect.width;
+      if (x >= bodyRect.width) {
+        menuNode.style.marginLeft = bodyRect.width - x + "px";
       }
-      // Check the vertical overflow.
-      if (y + menuNodeRect.height > bodyRect.height) {
-        // Anchor positioning is already relative, so don't subtract it again.
-        y = bodyRect.height - ((anchor ? 0 : y) + menuNodeRect.height);
-        overflowY = true;
-      }
-
-      menu.style.marginLeft = (anchor || overflowX) ? x + "px" : "auto";
-      menu.style.marginTop = (anchor || overflowY) ? y + "px" : "auto";
-    },
-
-    componentDidMount: function() {
-      this.documentBody.addEventListener("click", this._onBodyClick);
-      rootObject.addEventListener("blur", this.hideDropdownMenu);
     },
 
     componentWillUnmount: function() {
       this.documentBody.removeEventListener("click", this._onBodyClick);
-      rootObject.removeEventListener("blur", this.hideDropdownMenu);
+      this.documentBody.removeEventListener("blur", this.hideDropdownMenu);
     },
 
     showDropdownMenu: function() {
       this.setState({showMenu: true});
-      rootObject.setTimeout(this._correctMenuPosition, 0);
     },
 
     hideDropdownMenu: function() {
       this.setState({showMenu: false});
     },
 
     toggleDropdownMenu: function() {
-      this[this.state.showMenu ? "hideDropdownMenu" : "showDropdownMenu"]();
+      this.setState({showMenu: !this.state.showMenu});
     },
   };
 
   /**
    * Document visibility mixin. Allows defining the following hooks for when the
    * document visibility status changes:
    *
    * - {Function} onDocumentVisible For when the document becomes visible.
--- a/browser/components/loop/content/shared/js/roomStore.js
+++ b/browser/components/loop/content/shared/js/roomStore.js
@@ -85,31 +85,28 @@ loop.store = loop.store || {};
      */
     defaultExpiresIn: DEFAULT_EXPIRES_IN,
 
     /**
      * Registered actions.
      * @type {Array}
      */
     actions: [
-      "addSocialShareButton",
-      "addSocialShareProvider",
       "createRoom",
       "createdRoom",
       "createRoomError",
       "copyRoomUrl",
       "deleteRoom",
       "deleteRoomError",
       "emailRoomUrl",
       "getAllRooms",
       "getAllRoomsError",
       "openRoom",
       "renameRoom",
       "renameRoomError",
-      "shareRoomUrl",
       "updateRoomList"
     ],
 
     initialize: function(options) {
       if (!options.mozLoop) {
         throw new Error("Missing option mozLoop");
       }
       this._mozLoop = options.mozLoop;
@@ -340,69 +337,16 @@ loop.store = loop.store || {};
      * @param  {sharedActions.EmailRoomUrl} actionData The action data.
      */
     emailRoomUrl: function(actionData) {
       loop.shared.utils.composeCallUrlEmail(actionData.roomUrl);
       this._mozLoop.notifyUITour("Loop:RoomURLEmailed");
     },
 
     /**
-     * Share a room url.
-     *
-     * @param  {sharedActions.ShareRoomUrl} actionData The action data.
-     */
-    shareRoomUrl: function(actionData) {
-      var providerOrigin = new URL(actionData.provider.origin).hostname;
-      var shareTitle = "";
-      var shareBody = null;
-
-      switch (providerOrigin) {
-        case "mail.google.com":
-          shareTitle = mozL10n.get("share_email_subject5", {
-            clientShortname2: mozL10n.get("clientShortname2")
-          });
-          shareBody = mozL10n.get("share_email_body5", {
-            callUrl: actionData.roomUrl,
-            brandShortname: mozL10n.get("brandShortname"),
-            clientShortname2: mozL10n.get("clientShortname2"),
-            clientSuperShortname: mozL10n.get("clientSuperShortname"),
-            learnMoreUrl: this._mozLoop.getLoopPref("learnMoreUrl")
-          });
-        case "twitter.com":
-        default:
-          shareTitle = mozL10n.get("share_tweet", {
-            clientShortname2: mozL10n.get("clientShortname2")
-          });
-          break;
-      }
-
-      this._mozLoop.socialShareRoom(actionData.provider.origin, actionData.roomUrl,
-        shareTitle, shareBody);
-      this._mozLoop.notifyUITour("Loop:RoomURLShared");
-    },
-
-    /**
-     * Add the Social Share button to the browser toolbar.
-     *
-     * @param {sharedActions.AddSocialShareButton} actionData The action data.
-     */
-    addSocialShareButton: function(actionData) {
-      this._mozLoop.addSocialShareButton();
-    },
-
-    /**
-     * Open the share panel to add a Social share provider.
-     *
-     * @param {sharedActions.AddSocialShareProvider} actionData The action data.
-     */
-    addSocialShareProvider: function(actionData) {
-      this._mozLoop.addSocialShareProvider();
-    },
-
-    /**
      * Creates a new room.
      *
      * @param {sharedActions.DeleteRoom} actionData The action data.
      */
     deleteRoom: function(actionData) {
       this._mozLoop.rooms.delete(actionData.roomToken, function(err) {
         if (err) {
          this.dispatchAction(new sharedActions.DeleteRoomError({error: err}));
deleted file mode 100644
index 2de263f511e864a149b72d2f67589f072a3ec041..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/components/loop/standalone/content/index.html
+++ b/browser/components/loop/standalone/content/index.html
@@ -131,14 +131,10 @@
     <script type="text/javascript" src="js/webapp.js"></script>
 
     <script>
       // Wait for all the localization notes to load
       window.addEventListener('localized', function() {
         loop.webapp.init();
       }, false);
     </script>
-
-    <noscript>
-      <img src="img/logo.png" border="0" alt="Logo"/>
-    </noscript>
   </body>
 </html>
--- a/browser/components/loop/test/desktop-local/panel_test.js
+++ b/browser/components/loop/test/desktop-local/panel_test.js
@@ -23,19 +23,17 @@ describe("loop.panel", function() {
     requests = [];
     // https://github.com/cjohansen/Sinon.JS/issues/393
     fakeXHR.xhr.onCreate = function (xhr) {
       requests.push(xhr);
     };
 
     fakeWindow = {
       close: sandbox.stub(),
-      addEventListener: function() {},
-      document: { addEventListener: function(){} },
-      setTimeout: function(callback) { callback(); }
+      document: { addEventListener: function(){} }
     };
     loop.shared.mixins.setRootObject(fakeWindow);
 
     notifications = new loop.shared.models.NotificationCollection();
 
     fakeMozLoop = navigator.mozLoop = {
       doNotDisturb: true,
       fxAEnabled: true,
--- a/browser/components/loop/test/desktop-local/roomViews_test.js
+++ b/browser/components/loop/test/desktop-local/roomViews_test.js
@@ -13,29 +13,27 @@ describe("loop.roomViews", function () {
 
   beforeEach(function() {
     sandbox = sinon.sandbox.create();
 
     dispatcher = new loop.Dispatcher();
 
     fakeMozLoop = {
       getAudioBlob: sinon.stub(),
-      getLoopPref: sinon.stub(),
-      isSocialShareButtonAvailable: sinon.stub()
+      getLoopPref: sinon.stub()
     };
 
     fakeWindow = {
       close: sinon.stub(),
       document: {},
       navigator: {
         mozLoop: fakeMozLoop
       },
       addEventListener: function() {},
-      removeEventListener: function() {},
-      setTimeout: function(callback) { callback(); }
+      removeEventListener: function() {}
     };
     loop.shared.mixins.setRootObject(fakeWindow);
 
     // XXX These stubs should be hoisted in a common file
     // Bug 1040968
     sandbox.stub(document.mozL10n, "get", function(x) {
       return x;
     });
@@ -195,31 +193,16 @@ describe("loop.roomViews", function () {
           var copyBtn = view.getDOMNode().querySelector('.btn-copy');
 
           React.addons.TestUtils.Simulate.click(copyBtn);
 
           // copied_url_button is the l10n string.
           expect(copyBtn.textContent).eql("copied_url_button");
       });
     });
-
-    describe("Share button", function() {
-      beforeEach(function() {
-        view = mountTestComponent();
-      });
-
-      it("should toggle the share dropdown when the share button is clicked", function() {
-        var shareBtn = view.getDOMNode().querySelector(".btn-share");
-
-        React.addons.TestUtils.Simulate.click(shareBtn);
-
-        expect(view.state.showMenu).to.eql(true);
-        expect(view.refs.menu.props.show).to.eql(true);
-      });
-    });
   });
 
   describe("DesktopRoomConversationView", function() {
     var view;
 
     beforeEach(function() {
       loop.store.StoreMixin.register({
         feedbackStore: new loop.store.FeedbackStore(dispatcher, {
@@ -445,145 +428,9 @@ describe("loop.roomViews", function () {
 
           view = mountTestComponent();
 
           expect(view.getDOMNode().querySelector(".local-stream-audio"))
             .not.eql(null);
         });
     });
   });
-
-  describe("SocialShareDropdown", function() {
-    var view, fakeProvider;
-
-    beforeEach(function() {
-      sandbox.stub(dispatcher, "dispatch");
-
-      fakeProvider = {
-        name: "foo",
-        origin: "https://foo",
-        iconURL: "http://example.com/foo.png"
-      };
-    });
-
-    afterEach(function() {
-      view = fakeProvider = null;
-    });
-
-    function mountTestComponent() {
-      return TestUtils.renderIntoDocument(
-        React.createElement(loop.roomViews.SocialShareDropdown, {
-          dispatcher: dispatcher,
-          roomStore: roomStore,
-          show: true
-        })
-      );
-    }
-
-    describe("#render", function() {
-      it("should show no contents when the Social Providers have not been fetched yet", function() {
-        view = mountTestComponent();
-
-        expect(view.getDOMNode()).to.eql(null);
-      });
-
-      it("should show different contents when the Share XUL button is not available", function() {
-        activeRoomStore.setStoreState({
-          socialShareProviders: []
-        });
-        view = mountTestComponent();
-
-        var node = view.getDOMNode();
-        expect(node.querySelector(".share-panel-header")).to.not.eql(null);
-      });
-
-      it("should show an empty list when no Social Providers are available", function() {
-        activeRoomStore.setStoreState({
-          socialShareButtonAvailable: true,
-          socialShareProviders: []
-        });
-
-        view = mountTestComponent();
-
-        var node = view.getDOMNode();
-        expect(node.querySelector(".icon-add-share-service")).to.not.eql(null);
-        expect(node.querySelectorAll(".dropdown-menu-item").length).to.eql(1);
-      });
-
-      it("should show a list of available Social Providers", function() {
-        activeRoomStore.setStoreState({
-          socialShareButtonAvailable: true,
-          socialShareProviders: [fakeProvider]
-        });
-
-        view = mountTestComponent();
-
-        var node = view.getDOMNode();
-        expect(node.querySelector(".icon-add-share-service")).to.not.eql(null);
-        expect(node.querySelector(".dropdown-menu-separator")).to.not.eql(null);
-
-        var dropdownNodes = node.querySelectorAll(".dropdown-menu-item");
-        expect(dropdownNodes.length).to.eql(2);
-        expect(dropdownNodes[1].querySelector("img").src).to.eql(fakeProvider.iconURL);
-        expect(dropdownNodes[1].querySelector("span").textContent)
-          .to.eql(fakeProvider.name);
-      });
-    });
-
-    describe("#handleToolbarAddButtonClick", function() {
-      it("should dispatch an action when the 'add to toolbar' button is clicked", function() {
-        activeRoomStore.setStoreState({
-          socialShareProviders: []
-        });
-
-        view = mountTestComponent();
-
-        var addButton = view.getDOMNode().querySelector(".btn-toolbar-add");
-        React.addons.TestUtils.Simulate.click(addButton);
-
-        sinon.assert.calledOnce(dispatcher.dispatch);
-        sinon.assert.calledWithExactly(dispatcher.dispatch,
-          new sharedActions.AddSocialShareButton());
-      });
-    });
-
-    describe("#handleAddServiceClick", function() {
-      it("should dispatch an action when the 'add provider' item is clicked", function() {
-        activeRoomStore.setStoreState({
-          socialShareProviders: [],
-          socialShareButtonAvailable: true
-        });
-
-        view = mountTestComponent();
-
-        var addItem = view.getDOMNode().querySelector(".dropdown-menu-item:first-child");
-        React.addons.TestUtils.Simulate.click(addItem);
-
-        sinon.assert.calledOnce(dispatcher.dispatch);
-        sinon.assert.calledWithExactly(dispatcher.dispatch,
-          new sharedActions.AddSocialShareProvider());
-      });
-    });
-
-    describe("#handleProviderClick", function() {
-      it("should dispatch an action when a provider item is clicked", function() {
-        activeRoomStore.setStoreState({
-          roomUrl: "http://example.com",
-          socialShareButtonAvailable: true,
-          socialShareProviders: [fakeProvider]
-        });
-
-        view = mountTestComponent();
-
-        var providerItem = view.getDOMNode().querySelector(".dropdown-menu-item:last-child");
-        React.addons.TestUtils.Simulate.click(providerItem);
-
-        sinon.assert.calledOnce(dispatcher.dispatch);
-        sinon.assert.calledWithExactly(dispatcher.dispatch,
-          new sharedActions.ShareRoomUrl({
-            provider: fakeProvider,
-            roomUrl: activeRoomStore.getStoreState().roomUrl,
-            previews: []
-          }));
-      });
-    });
-  });
 });
--- a/browser/components/loop/test/mochitest/browser.ini
+++ b/browser/components/loop/test/mochitest/browser.ini
@@ -17,12 +17,11 @@ skip-if = e10s
 [browser_LoopContacts.js]
 [browser_mozLoop_appVersionInfo.js]
 [browser_mozLoop_prefs.js]
 [browser_mozLoop_doNotDisturb.js]
 skip-if = buildapp == 'mulet'
 [browser_mozLoop_pluralStrings.js]
 [browser_mozLoop_sharingListeners.js]
 skip-if = e10s
-[browser_mozLoop_socialShare.js]
 [browser_mozLoop_telemetry.js]
 skip-if = e10s
 [browser_toolbarbutton.js]
deleted file mode 100644
--- a/browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * This is an integration test from navigator.mozLoop through to the end
- * effects - rather than just testing MozLoopAPI alone.
- */
-
-Cu.import("resource://gre/modules/Promise.jsm");
-const {SocialService} = Cu.import("resource://gre/modules/SocialService.jsm", {});
-
-add_task(loadLoopPanel);
-
-const kShareWidgetId = "social-share-button";
-const kShareProvider = {
-  name: "provider 1",
-  origin: "https://example.com",
-  workerURL: "https://example.com/browser/browser/base/content/test/social/social_worker.js",
-  iconURL: "https://example.com/browser/browser/base/content/test/general/moz.png",
-  shareURL: "https://example.com/browser/browser/base/content/test/social/share.html"
-};
-const kShareProviderInvalid = {
-  name: "provider 1",
-  origin: "https://example2.com"
-};
-
-add_task(function* test_mozLoop_isSocialShareButtonAvailable() {
-  Assert.ok(gMozLoopAPI, "mozLoop should exist");
-
-  // First make sure the Social Share button is not available. This is probably
-  // already the case, but make it explicit here.
-  CustomizableUI.removeWidgetFromArea(kShareWidgetId);
-
-  Assert.ok(!gMozLoopAPI.isSocialShareButtonAvailable(),
-    "Social Share button should not be available");
-
-  // Add the widget to the navbar.
-  CustomizableUI.addWidgetToArea(kShareWidgetId, CustomizableUI.AREA_NAVBAR);
-
-  Assert.ok(gMozLoopAPI.isSocialShareButtonAvailable(),
-    "Social Share button should be available");
-
-  // Add the widget to the MenuPanel.
-  CustomizableUI.addWidgetToArea(kShareWidgetId, CustomizableUI.AREA_PANEL);
-
-  Assert.ok(gMozLoopAPI.isSocialShareButtonAvailable(),
-    "Social Share button should still be available");
-
-  // Test button removal during the same session.
-  CustomizableUI.removeWidgetFromArea(kShareWidgetId);
-
-  Assert.ok(!gMozLoopAPI.isSocialShareButtonAvailable(),
-    "Social Share button should not be available");
-});
-
-add_task(function* test_mozLoop_addSocialShareButton() {
-  gMozLoopAPI.addSocialShareButton();
-
-  Assert.ok(gMozLoopAPI.isSocialShareButtonAvailable(),
-    "Social Share button should be available");
-
-  let widget = CustomizableUI.getWidget(kShareWidgetId);
-  Assert.strictEqual(widget.areaType, CustomizableUI.TYPE_TOOLBAR,
-    "Social Share button should be placed in the navbar");
-
-  CustomizableUI.removeWidgetFromArea(kShareWidgetId);
-});
-
-add_task(function* test_mozLoop_addSocialShareProvider() {
-  gMozLoopAPI.addSocialShareButton();
-
-  gMozLoopAPI.addSocialShareProvider();
-
-  yield promiseWaitForCondition(() => SocialShare.panel.state == "open");
-
-  Assert.equal(SocialShare.iframe.getAttribute("src"), "about:providerdirectory",
-    "Provider directory page should be visible");
-
-  SocialShare.panel.hidePopup();
-  CustomizableUI.removeWidgetFromArea(kShareWidgetId);
-});
-
-add_task(function* test_mozLoop_getSocialShareProviders() {
-  Assert.strictEqual(gMozLoopAPI.getSocialShareProviders().length, 0,
-    "Provider list should be empty initially");
-
-  // Add a provider.
-  yield new Promise(resolve => SocialService.addProvider(kShareProvider, resolve));
-
-  let providers = gMozLoopAPI.getSocialShareProviders();
-  Assert.strictEqual(providers.length, 1,
-    "The newly added provider should be part of the list");
-  let provider = providers[0];
-  Assert.strictEqual(provider.iconURL, kShareProvider.iconURL, "Icon URLs should match");
-  Assert.strictEqual(provider.name, kShareProvider.name, "Names should match");
-  Assert.strictEqual(provider.origin, kShareProvider.origin, "Origins should match");
-
-  // Add another provider that should not be picked up by Loop.
-  yield new Promise(resolve => SocialService.addProvider(kShareProviderInvalid, resolve));
-
-  providers = gMozLoopAPI.getSocialShareProviders();
-  Assert.strictEqual(providers.length, 1,
-    "The newly added provider should not be part of the list");
-
-  // Let's add a valid second provider object.
-  let provider2 = Object.create(kShareProvider);
-  provider2.name = "Wildly different name";
-  provider2.origin = "https://example3.com";
-  yield new Promise(resolve => SocialService.addProvider(provider2, resolve));
-
-  providers = gMozLoopAPI.getSocialShareProviders();
-  Assert.strictEqual(providers.length, 2,
-    "The newly added provider should be part of the list");
-  Assert.strictEqual(providers[1].name, provider2.name,
-    "Providers should be ordered alphabetically");
-
-  // Remove the second valid provider.
-  yield new Promise(resolve => SocialService.disableProvider(provider2.origin, resolve));
-  providers = gMozLoopAPI.getSocialShareProviders();
-  Assert.strictEqual(providers.length, 1,
-    "The uninstalled provider should not be part of the list");
-  Assert.strictEqual(providers[0].name, kShareProvider.name, "Names should match");
-});
-
-add_task(function* test_mozLoop_socialShareRoom() {
-  gMozLoopAPI.addSocialShareButton();
-
-  gMozLoopAPI.socialShareRoom(kShareProvider.origin, "https://someroom.com", "Some Title");
-
-  yield promiseWaitForCondition(() => SocialShare.panel.state == "open");
-
-  Assert.equal(SocialShare.iframe.getAttribute("origin"), kShareProvider.origin,
-    "Origins should match");
-  Assert.equal(SocialShare.iframe.getAttribute("src"), kShareProvider.shareURL,
-    "Provider's share page should be displayed");
-
-  SocialShare.panel.hidePopup();
-  CustomizableUI.removeWidgetFromArea(kShareWidgetId);
-});
--- a/browser/components/loop/test/mochitest/head.js
+++ b/browser/components/loop/test/mochitest/head.js
@@ -66,44 +66,16 @@ function promiseGetMozLoopAPI() {
       let frame = document.getElementById(frameId);
       if (frame) {
         frame.remove();
       }
     });
   });
 }
 
-function waitForCondition(condition, nextTest, errorMsg) {
-  var tries = 0;
-  var interval = setInterval(function() {
-    if (tries >= 30) {
-      ok(false, errorMsg);
-      moveOn();
-    }
-    var conditionPassed;
-    try {
-      conditionPassed = condition();
-    } catch (e) {
-      ok(false, e + "\n" + e.stack);
-      conditionPassed = false;
-    }
-    if (conditionPassed) {
-      moveOn();
-    }
-    tries++;
-  }, 100);
-  var moveOn = function() { clearInterval(interval); nextTest(); };
-}
-
-function promiseWaitForCondition(aConditionFn) {
-  let deferred = Promise.defer();
-  waitForCondition(aConditionFn, deferred.resolve, "Condition didn't pass.");
-  return deferred.promise;
-}
-
 /**
  * Loads the loop panel by clicking the button and waits for its open to complete.
  * It also registers
  *
  * This assumes that the tests are running in a generatorTest.
  */
 function loadLoopPanel(aOverrideOptions = {}) {
   // Turn off the network for loop tests, so that we don't
--- a/browser/components/loop/test/shared/activeRoomStore_test.js
+++ b/browser/components/loop/test/shared/activeRoomStore_test.js
@@ -29,19 +29,17 @@ describe("loop.store.ActiveRoomStore", f
         get: sinon.stub(),
         join: sinon.stub(),
         refreshMembership: sinon.stub(),
         leave: sinon.stub(),
         on: sinon.stub(),
         off: sinon.stub()
       },
       setScreenShareState: sinon.stub(),
-      getActiveTabWindowId: sandbox.stub().callsArgWith(0, null, 42),
-      isSocialShareButtonAvailable: sinon.stub().returns(false),
-      getSocialShareProviders: sinon.stub().returns([])
+      getActiveTabWindowId: sandbox.stub().callsArgWith(0, null, 42)
     };
 
     fakeSdkDriver = {
       connectSession: sinon.stub(),
       disconnectSession: sinon.stub(),
       forceDisconnectAll: sinon.stub().callsArg(0),
       retryPublishWithoutVideo: sinon.stub(),
       startScreenShare: sinon.stub(),
@@ -274,19 +272,17 @@ describe("loop.store.ActiveRoomStore", f
           windowId: "42",
           type: "room",
           roomToken: fakeToken
         }));
 
         sinon.assert.calledTwice(dispatcher.dispatch);
         sinon.assert.calledWithExactly(dispatcher.dispatch,
           new sharedActions.SetupRoomInfo(_.extend({
-            roomToken: fakeToken,
-            socialShareButtonAvailable: false,
-            socialShareProviders: []
+            roomToken: fakeToken
           }, fakeRoomData)));
       });
 
     it("should dispatch a JoinRoom action if the get is successful",
       function() {
         store.setupWindowData(new sharedActions.SetupWindowData({
           windowId: "42",
           type: "room",
@@ -412,19 +408,17 @@ describe("loop.store.ActiveRoomStore", f
   describe("#setupRoomInfo", function() {
     var fakeRoomInfo;
 
     beforeEach(function() {
       fakeRoomInfo = {
         roomName: "Its a room",
         roomOwner: "Me",
         roomToken: "fakeToken",
-        roomUrl: "http://invalid",
-        socialShareButtonAvailable: false,
-        socialShareProviders: []
+        roomUrl: "http://invalid"
       };
     });
 
     it("should set the state to READY", function() {
       store.setupRoomInfo(new sharedActions.SetupRoomInfo(fakeRoomInfo));
 
       expect(store._storeState.roomState).eql(ROOM_STATES.READY);
     });
@@ -432,18 +426,16 @@ describe("loop.store.ActiveRoomStore", f
     it("should save the room information", function() {
       store.setupRoomInfo(new sharedActions.SetupRoomInfo(fakeRoomInfo));
 
       var state = store.getStoreState();
       expect(state.roomName).eql(fakeRoomInfo.roomName);
       expect(state.roomOwner).eql(fakeRoomInfo.roomOwner);
       expect(state.roomToken).eql(fakeRoomInfo.roomToken);
       expect(state.roomUrl).eql(fakeRoomInfo.roomUrl);
-      expect(state.socialShareButtonAvailable).eql(false);
-      expect(state.socialShareProviders).eql([]);
     });
   });
 
   describe("#updateRoomInfo", function() {
     var fakeRoomInfo;
 
     beforeEach(function() {
       fakeRoomInfo = {
@@ -458,41 +450,16 @@ describe("loop.store.ActiveRoomStore", f
 
       var state = store.getStoreState();
       expect(state.roomName).eql(fakeRoomInfo.roomName);
       expect(state.roomOwner).eql(fakeRoomInfo.roomOwner);
       expect(state.roomUrl).eql(fakeRoomInfo.roomUrl);
     });
   });
 
-  describe("#updateSocialShareInfo", function() {
-    var fakeSocialShareInfo;
-
-    beforeEach(function() {
-      fakeSocialShareInfo = {
-        socialShareButtonAvailable: true,
-        socialShareProviders: [{
-          name: "foo",
-          origin: "https://example.com",
-          iconURL: "icon.png"
-        }]
-      };
-    });
-
-    it("should save the Social API information", function() {
-      store.updateSocialShareInfo(new sharedActions.UpdateSocialShareInfo(fakeSocialShareInfo));
-
-      var state = store.getStoreState();
-      expect(state.socialShareButtonAvailable)
-        .eql(fakeSocialShareInfo.socialShareButtonAvailable);
-      expect(state.socialShareProviders)
-        .eql(fakeSocialShareInfo.socialShareProviders);
-    });
-  });
-
   describe("#joinRoom", function() {
     it("should reset failureReason", function() {
       store.setStoreState({failureReason: "Test"});
 
       store.joinRoom();
 
       expect(store.getStoreState().failureReason).eql(undefined);
     });
@@ -1122,46 +1089,24 @@ describe("loop.store.ActiveRoomStore", f
 
     it("should set the state to ENDED", function() {
       store.leaveRoom();
 
       expect(store._storeState.roomState).eql(ROOM_STATES.ENDED);
     });
   });
 
-  describe("#_handleSocialShareUpdate", function() {
-    it("should dispatch an UpdateRoomInfo action", function() {
-      store._handleSocialShareUpdate();
-
-      sinon.assert.calledOnce(dispatcher.dispatch);
-      sinon.assert.calledWithExactly(dispatcher.dispatch,
-        new sharedActions.UpdateSocialShareInfo({
-          socialShareButtonAvailable: false,
-          socialShareProviders: []
-        }));
-    });
-
-    it("should call respective mozLoop methods", function() {
-      store._handleSocialShareUpdate();
-
-      sinon.assert.calledOnce(fakeMozLoop.isSocialShareButtonAvailable);
-      sinon.assert.calledOnce(fakeMozLoop.getSocialShareProviders);
-    });
-  });
-
   describe("Events", function() {
     describe("update:{roomToken}", function() {
       beforeEach(function() {
         store.setupRoomInfo(new sharedActions.SetupRoomInfo({
           roomName: "Its a room",
           roomOwner: "Me",
           roomToken: "fakeToken",
-          roomUrl: "http://invalid",
-          socialShareButtonAvailable: false,
-          socialShareProviders: []
+          roomUrl: "http://invalid"
         }));
       });
 
       it("should dispatch an UpdateRoomInfo action", function() {
         sinon.assert.calledTwice(fakeMozLoop.rooms.on);
 
         var fakeRoomData = {
           roomName: "fakeName",
@@ -1181,22 +1126,17 @@ describe("loop.store.ActiveRoomStore", f
       var fakeRoomData = {
         roomName: "Its a room",
         roomOwner: "Me",
         roomToken: "fakeToken",
         roomUrl: "http://invalid"
       };
 
       beforeEach(function() {
-        store.setupRoomInfo(new sharedActions.SetupRoomInfo(
-          _.extend(fakeRoomData, {
-            socialShareButtonAvailable: false,
-            socialShareProviders: []
-          })
-        ));
+        store.setupRoomInfo(new sharedActions.SetupRoomInfo(fakeRoomData));
       });
 
       it("should disconnect all room connections", function() {
         fakeMozLoop.rooms.on.callArgWith(1, "delete:" + fakeRoomData.roomToken, fakeRoomData);
 
         sinon.assert.calledOnce(fakeSdkDriver.forceDisconnectAll);
       });
 
--- a/browser/components/loop/test/shared/roomStore_test.js
+++ b/browser/components/loop/test/shared/roomStore_test.js
@@ -72,19 +72,16 @@ describe("loop.store.RoomStore", functio
       pendingInitialRetrieval: false,
       rooms: [],
       activeRoom: {}
     };
 
     beforeEach(function() {
       fakeMozLoop = {
         copyString: function() {},
-        getLoopPref: function(pref) {
-          return pref;
-        },
         notifyUITour: function() {},
         rooms: {
           create: function() {},
           getAll: function() {},
           open: function() {},
           rename: function() {},
           on: sandbox.stub()
         }
@@ -366,72 +363,16 @@ describe("loop.store.RoomStore", functio
         }));
 
         sinon.assert.calledOnce(sharedUtils.composeCallUrlEmail);
         sinon.assert.calledWithExactly(sharedUtils.composeCallUrlEmail,
           "http://invalid");
       });
     });
 
-    describe("#shareRoomUrl", function() {
-      beforeEach(function() {
-        fakeMozLoop.socialShareRoom = sinon.stub();
-      });
-
-      it("should pass the correct data for GMail sharing", function() {
-        var roomUrl = "http://invalid";
-        var origin = "https://mail.google.com/v1";
-        store.shareRoomUrl(new sharedActions.ShareRoomUrl({
-          roomUrl: roomUrl,
-          provider: {
-            origin: origin
-          }
-        }));
-
-        sinon.assert.calledOnce(fakeMozLoop.socialShareRoom);
-        sinon.assert.calledWithExactly(fakeMozLoop.socialShareRoom, origin,
-          roomUrl, "", "");
-      });
-
-      it("should pass the correct data for all other Social Providers", function() {
-        var roomUrl = "http://invalid2";
-        var origin = "https://twitter.com/share";
-        store.shareRoomUrl(new sharedActions.ShareRoomUrl({
-          roomUrl: roomUrl,
-          provider: {
-            origin: origin
-          }
-        }));
-
-        sinon.assert.calledOnce(fakeMozLoop.socialShareRoom);
-        sinon.assert.calledWithExactly(fakeMozLoop.socialShareRoom, origin,
-          roomUrl, "", null);
-      });
-    });
-
-    describe("#addSocialShareButton", function() {
-      it("should invoke to the correct mozLoop function", function() {
-        fakeMozLoop.addSocialShareButton = sinon.stub();
-
-        store.addSocialShareButton(new sharedActions.AddSocialShareButton());
-
-        sinon.assert.calledOnce(fakeMozLoop.addSocialShareButton);
-      });
-    });
-
-    describe("#addSocialShareProvider", function() {
-      it("should invoke to the correct mozLoop function", function() {
-        fakeMozLoop.addSocialShareProvider = sinon.stub();
-
-        store.addSocialShareProvider(new sharedActions.AddSocialShareProvider());
-
-        sinon.assert.calledOnce(fakeMozLoop.addSocialShareProvider);
-      });
-    });
-
     describe("#setStoreState", function() {
       it("should update store state data", function() {
         store.setStoreState({pendingCreation: true});
 
         expect(store.getStoreState().pendingCreation).eql(true);
       });
 
       it("should trigger a `change` event", function(done) {
--- a/browser/components/loop/ui/ui-showcase.js
+++ b/browser/components/loop/ui/ui-showcase.js
@@ -171,24 +171,24 @@
       "14x14": ["audio", "audio-active", "audio-disabled", "facemute",
         "facemute-active", "facemute-disabled", "hangup", "hangup-active",
         "hangup-disabled", "incoming", "incoming-active", "incoming-disabled",
         "link", "link-active", "link-disabled", "mute", "mute-active",
         "mute-disabled", "pause", "pause-active", "pause-disabled", "video",
         "video-white", "video-active", "video-disabled", "volume", "volume-active",
         "volume-disabled"
       ],
-      "16x16": ["add", "add-hover", "add-active", "audio", "audio-hover", "audio-active",
-        "block", "block-red", "block-hover", "block-active", "contacts", "contacts-hover",
-        "contacts-active", "copy", "checkmark", "google", "google-hover", "google-active",
-        "history", "history-hover", "history-active", "leave", "precall", "precall-hover",
+      "16x16": ["audio", "audio-hover", "audio-active", "block", "block-red",
+        "block-hover", "block-active", "contacts", "contacts-hover", "contacts-active",
+        "copy", "checkmark", "google", "google-hover", "google-active", "history",
+        "history-hover", "history-active", "leave", "precall", "precall-hover",
         "precall-active", "screen-white", "screenmute-white", "settings",
-        "settings-hover", "settings-active", "share-darkgrey", "tag", "tag-hover",
-        "tag-active", "trash", "unblock", "unblock-hover", "unblock-active", "video",
-        "video-hover", "video-active", "tour"
+        "settings-hover", "settings-active", "tag", "tag-hover", "tag-active",
+        "trash", "unblock", "unblock-hover", "unblock-active", "video", "video-hover",
+        "video-active", "tour"
       ]
     },
 
     render: function() {
       var icons = this.shapes[this.props.size].map(function(shapeId, i) {
         return (
           React.createElement("li", {key: this.props.size + "-" + i, className: "svg-icon-entry"}, 
             React.createElement("p", null, React.createElement(SVGIcon, {shapeId: shapeId, size: this.props.size})), 
--- a/browser/components/loop/ui/ui-showcase.jsx
+++ b/browser/components/loop/ui/ui-showcase.jsx
@@ -171,24 +171,24 @@
       "14x14": ["audio", "audio-active", "audio-disabled", "facemute",
         "facemute-active", "facemute-disabled", "hangup", "hangup-active",
         "hangup-disabled", "incoming", "incoming-active", "incoming-disabled",
         "link", "link-active", "link-disabled", "mute", "mute-active",
         "mute-disabled", "pause", "pause-active", "pause-disabled", "video",
         "video-white", "video-active", "video-disabled", "volume", "volume-active",
         "volume-disabled"
       ],
-      "16x16": ["add", "add-hover", "add-active", "audio", "audio-hover", "audio-active",
-        "block", "block-red", "block-hover", "block-active", "contacts", "contacts-hover",
-        "contacts-active", "copy", "checkmark", "google", "google-hover", "google-active",
-        "history", "history-hover", "history-active", "leave", "precall", "precall-hover",
+      "16x16": ["audio", "audio-hover", "audio-active", "block", "block-red",
+        "block-hover", "block-active", "contacts", "contacts-hover", "contacts-active",
+        "copy", "checkmark", "google", "google-hover", "google-active", "history",
+        "history-hover", "history-active", "leave", "precall", "precall-hover",
         "precall-active", "screen-white", "screenmute-white", "settings",
-        "settings-hover", "settings-active", "share-darkgrey", "tag", "tag-hover",
-        "tag-active", "trash", "unblock", "unblock-hover", "unblock-active", "video",
-        "video-hover", "video-active", "tour"
+        "settings-hover", "settings-active", "tag", "tag-hover", "tag-active",
+        "trash", "unblock", "unblock-hover", "unblock-active", "video", "video-hover",
+        "video-active", "tour"
       ]
     },
 
     render: function() {
       var icons = this.shapes[this.props.size].map(function(shapeId, i) {
         return (
           <li key={this.props.size + "-" + i} className="svg-icon-entry">
             <p><SVGIcon shapeId={shapeId} size={this.props.size} /></p>
--- a/browser/locales/en-US/chrome/browser/loop/loop.properties
+++ b/browser/locales/en-US/chrome/browser/loop/loop.properties
@@ -43,28 +43,18 @@ problem_accessing_account=There Was A Pr
 ## the appropriate action.
 ## See https://people.mozilla.org/~dhenein/labs/loop-mvp-spec/#error for location
 retry_button=Retry
 
 share_email_subject5={{clientShortname2}} — Join the conversation
 ## LOCALIZATION NOTE (share_email_body4): In this item, don't translate the
 ## part between {{..}} and leave the \n\n part alone
 share_email_body5=Hello!\n\nJoin me for a video conversation on {{clientShortname2}}.\n\nIt's the easiest way to connect by video with anyone anywhere.  With {{clientSuperShortname}}, you don't have to download or install anything. Just click or paste this link into your {{brandShortname}}, Opera, or Chrome browser to join the conversation:\n\n{{callUrl}}\n\nIf you'd like to learn more about {{clientSuperShortname}} and how you can start your own free video conversations, visit {{learnMoreUrl}}\n\nTalk to you soon!
-## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
-## between {{..}}. Please keep the text below 117 characters to make sure it fits
-## in a tweet.
-share_tweet=Join me for a video conversation on {{clientShortname2}}!
 
-share_button3=Share Link
-share_add_service_button=Add a Service
-add_to_toolbar_button=Add the Share panel to my toolbar
-share_panel_header=Share the web with your friends!
-## LOCALIZATION NOTE (share_panel_body): In this item, don't translate the part
-## between {{..}}.
-share_panel_body={{brandShortname}}'s new Share panel allows you to quickly share links or {{clientSuperShortname}} invitations with your favourite social networks.
+share_button2=Email Link
 copy_url_button2=Copy Link
 copied_url_button=Copied!
 
 panel_footer_signin_or_signup_link=Sign In or Sign Up
 
 settings_menu_item_account=Account
 settings_menu_item_settings=Settings
 settings_menu_item_signout=Sign Out