Bug 1260811 - Land version 1.2.4 of the Loop system add-on in mozilla-central. rs=Standard8 for already reviewed code.
authorMark Banner <standard8@mozilla.com>
Wed, 30 Mar 2016 18:16:57 +0100
changeset 291379 f689d7743268362b7924b7e4e1a9d196f56a9d79
parent 291378 8afd00a026c41cb6bfbad5a3df8b7fac7f0dcaec
child 291380 1ffc15e906033f2b4940eb81f4f252e0175dccf1
push id19656
push usergwagner@mozilla.com
push dateMon, 04 Apr 2016 13:43:23 +0000
treeherderb2g-inbound@e99061fde28a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersStandard8
bugs1260811
milestone48.0a1
Bug 1260811 - Land version 1.2.4 of the Loop system add-on in mozilla-central. rs=Standard8 for already reviewed code.
browser/extensions/loop/chrome/content/panels/css/desktop.css
browser/extensions/loop/chrome/content/panels/js/panel.js
browser/extensions/loop/chrome/content/panels/js/roomViews.js
browser/extensions/loop/chrome/content/preferences/prefs.js
browser/extensions/loop/chrome/content/shared/css/conversation.css
browser/extensions/loop/chrome/content/shared/js/textChatView.js
browser/extensions/loop/chrome/content/shared/js/views.js
browser/extensions/loop/chrome/content/shared/test/views_test.js
browser/extensions/loop/chrome/locale/fa/loop.properties
browser/extensions/loop/chrome/locale/fr/loop.properties
browser/extensions/loop/chrome/locale/id/loop.properties
browser/extensions/loop/chrome/locale/kk/loop.properties
browser/extensions/loop/chrome/locale/rm/loop.properties
browser/extensions/loop/install.rdf.in
browser/extensions/loop/jar.mn
--- a/browser/extensions/loop/chrome/content/panels/css/desktop.css
+++ b/browser/extensions/loop/chrome/content/panels/css/desktop.css
@@ -25,17 +25,16 @@
 .room-invitation-content {
   display: flex;
   flex-flow: column nowrap;
   margin: 12px 0;
   font-size: 1.4rem;
 }
 
 .room-invitation-content > * {
-  width: 100%;
   margin: 0 15px;
 }
 
 .room-context-header {
   font-weight: bold;
   font-size: 1.6rem;
   margin-bottom: 10px;
   text-align: center;
@@ -225,20 +224,16 @@ html[dir="rtl"] .share-panel-container >
   right: initial;
   transform: translate(-100%);
 }
 
 .share-panel-container > .room-invitation-overlay > .room-invitation-content {
   margin: 0 0 12px;
 }
 
-.share-panel-container > .room-invitation-overlay > .room-invitation-content > * {
-  width: initial;
-}
-
 .share-panel-open > .room-invitation-overlay,
 html[dir="rtl"] .share-panel-open > .room-invitation-overlay {
   transform: translateX(0);
 }
 
 .share-panel-open > .share-panel-overlay {
   display: block;
 }
--- a/browser/extensions/loop/chrome/content/panels/js/panel.js
+++ b/browser/extensions/loop/chrome/content/panels/js/panel.js
@@ -1086,22 +1086,22 @@ loop.panel = function (_, mozL10n) {
         this.setState({
           showPanel: true
         });
       }
     },
 
     handleClosePanel: function () {
       this.props.onSharePanelDisplayChange();
+      this.openRoom();
+      this.closeWindow();
+
       this.setState({
         showPanel: false
       });
-
-      this.openRoom();
-      this.closeWindow();
     },
 
     openRoom: function () {
       var activeRoom = this.state.activeRoom;
       this.props.dispatcher.dispatch(new sharedActions.OpenRoom({
         roomToken: activeRoom.roomToken
       }));
     },
--- a/browser/extensions/loop/chrome/content/panels/js/roomViews.js
+++ b/browser/extensions/loop/chrome/content/panels/js/roomViews.js
@@ -351,16 +351,17 @@ loop.roomViews = function (mozL10n) {
                   localVideoMuted: this.state.videoMuted,
                   matchMedia: this.state.matchMedia || window.matchMedia.bind(window),
                   remotePosterUrl: this.props.remotePosterUrl,
                   remoteSrcMediaElement: this.state.remoteSrcMediaElement,
                   renderRemoteVideo: this.shouldRenderRemoteVideo(),
                   screenShareMediaElement: this.state.screenShareMediaElement,
                   screenSharePosterUrl: null,
                   showInitialContext: false,
+                  showMediaWait: false,
                   showTile: false },
                 React.createElement(sharedViews.ConversationToolbar, {
                   audio: { enabled: !this.state.audioMuted, visible: true },
                   dispatcher: this.props.dispatcher,
                   hangup: this.leaveRoom,
                   showHangup: this.props.chatWindowDetached,
                   video: { enabled: !this.state.videoMuted, visible: true } }),
                 React.createElement(sharedDesktopViews.SharePanelView, {
--- a/browser/extensions/loop/chrome/content/preferences/prefs.js
+++ b/browser/extensions/loop/chrome/content/preferences/prefs.js
@@ -1,12 +1,17 @@
 pref("loop.enabled", true);
 pref("loop.remote.autostart", true);
+#ifdef LOOP_DEV_XPI
+pref("loop.server", "https://loop-dev.stage.mozaws.net/v0");
+pref("loop.linkClicker.url", "https://loop-webapp-dev.stage.mozaws.net/");
+#else
 pref("loop.server", "https://loop.services.mozilla.com/v0");
 pref("loop.linkClicker.url", "https://hello.firefox.com/");
+#endif
 pref("loop.gettingStarted.latestFTUVersion", 1);
 pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/");
 pref("loop.gettingStarted.resumeOnFirstJoin", false);
 pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/");
 pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/");
 pref("loop.do_not_disturb", false);
 pref("loop.retry_delay.start", 60000);
 pref("loop.retry_delay.limit", 300000);
--- a/browser/extensions/loop/chrome/content/shared/css/conversation.css
+++ b/browser/extensions/loop/chrome/content/shared/css/conversation.css
@@ -505,50 +505,84 @@ html, .fx-embedded, #main,
    fix its height. */
 .media-wrapper > .text-chat-view {
   flex: 0 0 auto;
   height: 100%;
   /* Text chat is a fixed 272px width for normal displays. */
   width: 272px;
 }
 
-.media-wrapper.showing-local-streams > .text-chat-view {
+.media-wrapper > .text-chat-view > .text-chat-entries > .text-chat-scroller > .welcome-message {
+  font-size: 1.2rem;
+  margin: 0 0 15px;
+  color: #5e5f64;
+  line-height: 20px;
+}
+
+.media-wrapper.showing-local-streams > .text-chat-view,
+.media-wrapper.showing-media-wait > .text-chat-view {
   /* When we're displaying the local streams, then we need to make the text
      chat view a bit shorter to give room. */
   height: calc(100% - 204px);
 }
 
+.media-wrapper.showing-media-wait > .text-chat-view {
+  order: 2;
+}
+
+.media-wrapper.showing-media-wait > .local {
+  /* Hides the local stream video box while we're asking the user for permissions */
+  display: none;
+}
+
 .media-wrapper.showing-local-streams.receiving-screen-share {
   position: relative;
 }
 
 .media-wrapper.showing-local-streams.receiving-screen-share > .text-chat-view {
   /* When we're displaying the local streams, then we need to make the text
-     chat view a bit shorter to give room. 2 streams x 204px each*/
-  height: calc(100% - 408px);
+     chat view a bit shorter to give room. 1 streams x 204px */
+  height: calc(100% - 204px);
 }
 
 .media-wrapper.receiving-screen-share > .screen {
   order: 1;
 }
 
-.media-wrapper.receiving-screen-share > .text-chat-view {
-  order: 2;
+.media-wrapper.receiving-screen-share > .text-chat-view,
+.media-wrapper.showing-local-streams > .text-chat-view  {
+  order: 4;
 }
 
 .media-wrapper.receiving-screen-share > .remote {
   flex: 0 1 auto;
-  order: 3;
+  order: 2;
   /* to keep the 4:3 ratio set both height and width */
   height: 204px;
   width: 272px;
 }
 
 .media-wrapper.receiving-screen-share > .local {
-  order: 4;
+  order: 3;
+}
+
+.media-wrapper.receiving-screen-share.showing-remote-streams > .local {
+  position: absolute;
+  z-index: 2;
+  padding: 8px;
+  right: 0;
+  left: auto;
+  top: 124px;
+  /* to keep the 4:3 ratio 80x60px + 16px padding + 4px border */
+  width: calc(80px + 16px + 4px);
+  height: calc(60px + 16px + 4px);
+}
+
+.media-wrapper.receiving-screen-share.showing-remote-streams > .local > .remote-video-box {
+  border: solid 2px #fff;
 }
 
 @media screen and (max-width:640px) {
   .media-layout > .media-wrapper {
     flex-direction: row;
     margin: 0;
     width: 100%;
   }
@@ -625,34 +659,36 @@ html, .fx-embedded, #main,
     max-width: 50%;
   }
 
   .media-wrapper.receiving-screen-share > .remote .remote-video {
       /* Reset the object-fit for this. */
     object-fit: contain;
   }
 
-  .media-wrapper.receiving-screen-share > .local {
+  .media-wrapper.receiving-screen-share.showing-remote-streams > .local {
     /* Screen shares have remote & local video side-by-side on narrow screens */
     order: 3;
     flex: 1 1 auto;
     height: 20%;
     /* Ensure no previously specified widths take effect, and we take up no more
        than half the width. */
     width: auto;
     max-width: 50%;
     /* This cancels out the absolute positioning when it's just remote video. */
     position: relative;
+    top: auto;
     bottom: auto;
     right: auto;
     margin: 0;
+    padding: 0;
   }
 
-  .media-wrapper.receiving-screen-share > .text-chat-view {
-    order: 4;
+  .media-wrapper.receiving-screen-share.showing-remote-streams > .local > .remote-video-box {
+    border: 0;
   }
 }
 
 /* e.g. very narrow widths similar to conversation window.
    Note: on some displays (e.g. windows / medium size) the width
    may be very slightly over the expected width, so we add on 2px
    just in case. */
 @media screen and (max-width:352px) {
--- a/browser/extensions/loop/chrome/content/shared/js/textChatView.js
+++ b/browser/extensions/loop/chrome/content/shared/js/textChatView.js
@@ -211,16 +211,21 @@ loop.shared.views.chat = function (mozL1
       });
 
       return React.createElement(
         "div",
         { className: entriesClasses },
         React.createElement(
           "div",
           { className: "text-chat-scroller" },
+          loop.shared.utils.isDesktop() ? null : React.createElement(
+            "p",
+            { className: "welcome-message" },
+            mozL10n.get("rooms_welcome_text_chat_label", { clientShortname: mozL10n.get("clientShortname2") })
+          ),
           this.props.messageList.map(function (entry, i) {
             if (entry.type === CHAT_MESSAGE_TYPES.SPECIAL) {
               if (!this.props.showInitialContext) {
                 return null;
               }
               switch (entry.contentType) {
                 case CHAT_CONTENT_TYPES.ROOM_NAME:
                   return React.createElement(TextChatRoomName, {
--- a/browser/extensions/loop/chrome/content/shared/js/views.js
+++ b/browser/extensions/loop/chrome/content/shared/js/views.js
@@ -880,16 +880,17 @@ loop.shared.views = function (_, mozL10n
       matchMedia: React.PropTypes.func.isRequired,
       remotePosterUrl: React.PropTypes.string,
       remoteSrcMediaElement: React.PropTypes.object,
       renderRemoteVideo: React.PropTypes.bool.isRequired,
       screenShareMediaElement: React.PropTypes.object,
       screenSharePosterUrl: React.PropTypes.string,
       screenSharingPaused: React.PropTypes.bool,
       showInitialContext: React.PropTypes.bool.isRequired,
+      showMediaWait: React.PropTypes.bool.isRequired,
       showTile: React.PropTypes.bool.isRequired
     },
 
     isLocalMediaAbsolutelyPositioned: function (matchMedia) {
       if (!matchMedia) {
         matchMedia = this.props.matchMedia;
       }
       return matchMedia && (
@@ -937,32 +938,57 @@ loop.shared.views = function (_, mozL10n
           displayAvatar: this.props.localVideoMuted,
           isLoading: this.props.isLocalLoading,
           mediaType: "local",
           posterUrl: this.props.localPosterUrl,
           srcMediaElement: this.props.localSrcMediaElement })
       );
     },
 
+    renderMediaWait: function () {
+      var msg = mozL10n.get("call_progress_getting_media_description", { clientShortname: mozL10n.get("clientShortname2") });
+      var utils = loop.shared.utils;
+      var isChrome = utils.isChrome(navigator.userAgent);
+      var isFirefox = utils.isFirefox(navigator.userAgent);
+      var isOpera = utils.isOpera(navigator.userAgent);
+      var promptMediaMessageClasses = classNames({
+        "prompt-media-message": true,
+        "chrome": isChrome,
+        "firefox": isFirefox,
+        "opera": isOpera,
+        "other": !isChrome && !isFirefox && !isOpera
+      });
+      return React.createElement(
+        "div",
+        { className: "prompt-media-message-wrapper" },
+        React.createElement(
+          "p",
+          { className: promptMediaMessageClasses },
+          msg
+        )
+      );
+    },
+
     render: function () {
       var remoteStreamClasses = classNames({
         "remote": true,
         "focus-stream": !this.props.displayScreenShare
       });
 
       var screenShareStreamClasses = classNames({
         "screen": true,
         "focus-stream": this.props.displayScreenShare,
         "screen-sharing-paused": this.props.screenSharingPaused
       });
 
       var mediaWrapperClasses = classNames({
         "media-wrapper": true,
         "receiving-screen-share": this.props.displayScreenShare,
         "showing-local-streams": this.props.localSrcMediaElement || this.props.localPosterUrl,
+        "showing-media-wait": this.props.showMediaWait,
         "showing-remote-streams": this.props.remoteSrcMediaElement || this.props.remotePosterUrl || this.props.isRemoteLoading
       });
 
       return React.createElement(
         "div",
         { className: "media-layout" },
         React.createElement(
           "div",
@@ -998,17 +1024,18 @@ loop.shared.views = function (_, mozL10n
               shareCursor: true,
               srcMediaElement: this.props.screenShareMediaElement }),
             this.props.displayScreenShare ? this.props.children : null
           ),
           React.createElement(loop.shared.views.chat.TextChatView, {
             dispatcher: this.props.dispatcher,
             showInitialContext: this.props.showInitialContext,
             showTile: this.props.showTile }),
-          this.state.localMediaAboslutelyPositioned ? null : this.renderLocalVideo()
+          this.state.localMediaAboslutelyPositioned ? null : this.renderLocalVideo(),
+          this.props.showMediaWait ? this.renderMediaWait() : null
         )
       );
     }
   });
 
   var RemoteCursorView = React.createClass({
     displayName: "RemoteCursorView",
 
--- a/browser/extensions/loop/chrome/content/shared/test/views_test.js
+++ b/browser/extensions/loop/chrome/content/shared/test/views_test.js
@@ -826,16 +826,17 @@ describe("loop.shared.views", function()
         displayScreenShare: false,
         isLocalLoading: false,
         isRemoteLoading: false,
         isScreenShareLoading: false,
         localVideoMuted: false,
         matchMedia: window.matchMedia,
         renderRemoteVideo: false,
         showInitialContext: false,
+        showMediaWait: false,
         showTile: false
       };
 
       return TestUtils.renderIntoDocument(
         React.createElement(sharedViews.MediaLayoutView,
           _.extend(defaultProps, extraProps)));
     }
 
@@ -963,16 +964,34 @@ describe("loop.shared.views", function()
       view = mountTestComponent({
         remoteSrcMediaElement: {},
         remotePosterUrl: "fake/url"
       });
 
       expect(view.getDOMNode().querySelector(".media-wrapper")
         .classList.contains("showing-remote-streams")).eql(true);
     });
+
+    it("should mark the wrapper as showing media wait tile when asking for user media", function() {
+      view = mountTestComponent({
+        showMediaWait: true
+      });
+
+      expect(view.getDOMNode().querySelector(".media-wrapper")
+        .classList.contains("showing-media-wait")).eql(true);
+    });
+
+    it("should display a media wait tile when asking for user media", function() {
+      view = mountTestComponent({
+        showMediaWait: true
+      });
+
+      expect(view.getDOMNode().querySelector(".prompt-media-message-wrapper"))
+        .not.eql(null);
+    });
   });
 
   describe("RemoteCursorView", function() {
     var view;
     var fakeVideoElementSize;
     var remoteCursorStore;
 
     function mountTestComponent(props) {
--- a/browser/extensions/loop/chrome/locale/fa/loop.properties
+++ b/browser/extensions/loop/chrome/locale/fa/loop.properties
@@ -1,16 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # Panel Strings
 
-
-
 ## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
 ## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
 ## use "..." if \u2026 doesn't suit traditions in your locale.
 loopMenuItem_label=شروع یک گفت‌وگو…
 loopMenuItem_accesskey=t
 
 ## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
 ## These are displayed together at the top of the panel when a user is needed to
@@ -39,32 +37,32 @@ first_time_experience_content=برای برنامه‌ریزی گروهی، کار کردن گروهی و خندیدن با هم استفاده کنید.
 first_time_experience_content2=برای به سرانجام رساندن کارها از آن استفاده کنید: با هم برنامه‌ریزی کنید، با هم بخندید، با هم کار کنید.
 first_time_experience_button_label2=نحوه کار را یاد بگیرید
 
 ## First Time Experience Slides
 fte_slide_1_title=صفحات وب را با یک دوست مرور کنید
 ## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
 ## will be replaced by the short name 2.
 fte_slide_1_copy=اگر در حال برنامه‌ریزی برای یک سفر هستید یا قصد خرید یک هدیه را دارید، {{clientShortname2}} به شما اجازه می‌دهد تا زمانی کوتاه تصمیمات سریع‌تر بگیرید.
-fte_slide_2_title=با هم هماهنگ باشید
-fte_slide_2_copy=از سیستم گپ ویدئویی یا متنی برای به اشتراک گذاشتن ایده‌ها، مقایسه گزینه‌ها و رسیدن به تفاهم، استفاده کنید.
+fte_slide_2_title2=ساخته شده برای اشتراک گذاری وب
+## LOCALIZATION_NOTE(fte_slide_2_copy2): {{clientShortname2}}
+## will be replaced by the short name 2.
+fte_slide_2_copy2=حالا اگر یک دوست خود را به یک نشست دعوت کنید، {{clientShortname2}} بطور خودکار هر صفحه وبی که دیدن می‌کنید را به اشتراک می‌گذارد. باهم. برنامه‌ریزی کنید. خرید کنید. تصمیم بگیرد.
 fte_slide_3_title=یک دوست را با ارسال یک پیوند دعوت کنید
 ## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 fte_slide_3_copy={{clientSuperShortname}} با اکثر مرورگرهای رومیزی کار می‌کند. هیچ حسابی لازم نیست و هر کسی می‌تواند به رایگان متصل شود.
 ## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 fte_slide_4_title=شمایل {{clientSuperShortname}} را برای شروع پیدا کنید
 ## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
 ## will be replaced by the brand short name.
 fte_slide_4_copy=زمانی که صفحه‌ای پیدا کردید تا موردش بحث کنید، بر روی شمایل {{brandShortname}} کلیک کنید تا یک پیوند بسازید. سپس آن را هر طور که دوست دارید برای دوست خود ارسال کنید!
 
-invite_header_text_bold=یک نفر را برای همراهی در مرور اینه صفحه دعوت کنید!
 invite_header_text_bold2=از یک دوست برای پیوستن به شما دعوت کنید!
-invite_header_text3=برای کار کردن با Firefox Hello باید دو نفر باشید، پس برای دوست خود یک پیوند بفرستید تا وب را با هم مرور کنید!
 invite_header_text4=این پیوند را برای شروع مرور وب با هم به اشتراک بگذارید.
 ## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
 ## invite_email_link_button, invite_facebook_button2): These labels appear under
 ## an iconic button for the invite view.
 invite_copy_link_button=رونوشت از پیوند
 invite_copied_link_button=رونوشت شد!
 invite_email_link_button=پست پیوند
 invite_facebook_button3=فیس‌بوک
@@ -102,16 +100,17 @@ share_email_footer2=\n\n____________\n Firefox Hello به شما اجازه می‌دهد تا وب را با دوستان خود مرور کنید. از آن وقتی که می‌خواهید کارها به سرانجام برسد استفاده کنید: باهم برنامه‌ریزی کنید، باهم بخندید. در http://www.firefox.com/hello بیشتر مطلع شوید
 share_tweet=به من در یک گفت‌وگو ویدئویی در {{clientShortname2}} بپیوندید!
 
 share_add_service_button=اضافه کردن یک سرویس
 
 ## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
 ## These menu items are displayed from a panel's context menu for a conversation.
 copy_link_menuitem=رونوشت پیوند
 email_link_menuitem=پست کردن پیوند
+edit_name_menuitem=ویرایش نام
 delete_conversation_menuitem2=حذف
 
 panel_footer_signin_or_signup_link=ورود یا ثبت‌نام
 
 settings_menu_item_account=حساب
 settings_menu_item_settings=تنظیمات
 settings_menu_item_signout=خروج
 settings_menu_item_signin=ورود
--- a/browser/extensions/loop/chrome/locale/fr/loop.properties
+++ b/browser/extensions/loop/chrome/locale/fr/loop.properties
@@ -29,17 +29,17 @@ panel_disconnect_button=Déconnexion
 ## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
 ## user to create his or her first conversation.
 first_time_experience_subheading2=Cliquez sur le bouton Hello pour consulter des pages web avec une autre personne.
 first_time_experience_subheading_button_above=Cliquez sur le bouton ci-dessus pour naviguer sur le Web avec une autre personne.
 
 ## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
 ## ways to use Hello project.
 first_time_experience_content=Utilisez-le pour vous organiser, travailler et rire ensemble.
-first_time_experience_content2=Utilisez vous pour réaliser vos projets : vous organiser, travailler et rire ensemble.
+first_time_experience_content2=Utilisez-le pour réaliser vos projets : vous organiser, travailler et rire ensemble.
 first_time_experience_button_label2=Principe de fonctionnement
 
 ## First Time Experience Slides
 fte_slide_1_title=Naviguez sur le Web avec une autre personne
 ## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
 ## will be replaced by the short name 2.
 fte_slide_1_copy=Que ce soit pour planifier un voyage ou l’achat d’un cadeau, {{clientShortname2}} vous permet de prendre des décisions plus rapidement.
 fte_slide_2_title2=Conçu pour partager le Web
@@ -92,17 +92,17 @@ share_email_body7=Une autre personne vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur une page web ensemble : {{callUrl}}
 ## LOCALIZATION NOTE (share_email_body_context3): In this item, don't translate
 ## the part between {{..}} and leave the \n\n part alone.
 share_email_body_context3=Une autre personne vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur {{title}} ensemble : {{callUrl}}
 ## LOCALIZATION NOTE (share_email_footer2): Common footer content for both email types
 share_email_footer2=\n\n____________\nFirefox Hello vous permet de naviguer sur le Web avec vos amis. Vous pouvez faire des tas de choses : planifier, travailler ou rire ensemble. Apprenez-en davantage sur http://www.firefox.com/hello
 ## 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=Rejoignez-moi pour une conversation vidéo sur {{clientShortname2}} !
+share_tweet=Rejoignez-moi pour une conversation vidéo sur {{clientShortname2}} !
 
 share_add_service_button=Ajouter un service
 
 ## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
 ## These menu items are displayed from a panel's context menu for a conversation.
 copy_link_menuitem=Copier le lien
 email_link_menuitem=Envoyer le lien
 edit_name_menuitem=Modifier le nom
--- a/browser/extensions/loop/chrome/locale/id/loop.properties
+++ b/browser/extensions/loop/chrome/locale/id/loop.properties
@@ -1,16 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # Panel Strings
 
-
-
 ## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
 ## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
 ## use "..." if \u2026 doesn't suit traditions in your locale.
 loopMenuItem_label=Mulai sebuah percakapan …
 loopMenuItem_accesskey=t
 
 ## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
 ## These are displayed together at the top of the panel when a user is needed to
@@ -39,32 +37,32 @@ first_time_experience_content=Gunakan in
 first_time_experience_content2=Pergunakanlah untuk menyelesaikan sesuatu: merencanakan bersama, tertawa bersama, bekerja bersama.
 first_time_experience_button_label2=Lihat cara kerja
 
 ## First Time Experience Slides
 fte_slide_1_title=Menjelajahi laman Web bersama teman
 ## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
 ## will be replaced by the short name 2.
 fte_slide_1_copy=Baik merencanakan perjalanan atau berbelanja hadiah, {{clientShortname2}} memungkinkan anda membuat keputusan lebih cepat dalam waktu singkat.
-fte_slide_2_title=Memiliki pemahaman yang sama
-fte_slide_2_copy=Menggunakan teks atau percakapan video yang tersedia untuk berbagi gagasan, emmbandingkan pilihan dan bermufakat.
+fte_slide_2_title2=Dirancang untuk berbagi Web
+## LOCALIZATION_NOTE(fte_slide_2_copy2): {{clientShortname2}}
+## will be replaced by the short name 2.
+fte_slide_2_copy2=Sekarang saat Anda mengundang teman ke sebuah sesi, {{clientShortname2}} akan otomatis bagikan laman Web yang sedang Anda lihat. Rencanakan. Belanja. Tentukan. Bersama.
 fte_slide_3_title=Mengundang teman dengan mengirimkan tautan
 ## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 fte_slide_3_copy={{clientSuperShortname}} bekerja dengan hampir semua peramban. Tidak perlu membuat akun dan setiap orang terhubung secara gratis.
 ## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 fte_slide_4_title=Temukan ikon {{clientSuperShortname}} untuk memulai
 ## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
 ## will be replaced by the brand short name.
 fte_slide_4_copy=Saat Anda menemukan laman yang ingin didiskusikan, klik ikon {{brandShortname}} untuk membuat tautan. Lalu kirimkan ke teman seperti yang Anda inginkan!
 
-invite_header_text_bold=Undang seseorang untuk jelajahi laman ini bersama Anda!
 invite_header_text_bold2=Mengundang teman untuk bergabung!
-invite_header_text3=Membutuhkan 2 orang untuk menggunakan Firefox Hello, jadi kirimkan tautan ke teman untuk menjelajah Web bersama Anda!
 invite_header_text4=Bagikan tautan ini supaya anda bisa mulai menjelajahi Web bersama.
 ## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
 ## invite_email_link_button, invite_facebook_button2): These labels appear under
 ## an iconic button for the invite view.
 invite_copy_link_button=Salin Tautan
 invite_copied_link_button=Tersalin!
 invite_email_link_button=Kirim Tautan
 invite_facebook_button3=Facebook
@@ -102,16 +100,17 @@ share_email_footer2=\n\n____________\nFi
 share_tweet=Gabung dengan saya untuk percakapan video pada {{clientShortname2}}!
 
 share_add_service_button=Tambah Layanan
 
 ## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
 ## These menu items are displayed from a panel's context menu for a conversation.
 copy_link_menuitem=Salin Tautan
 email_link_menuitem=Kirim Tautan
+edit_name_menuitem=Ubah nama
 delete_conversation_menuitem2=Hapus
 
 panel_footer_signin_or_signup_link=Masuk atau Daftar
 
 settings_menu_item_account=Akun
 settings_menu_item_settings=Pengaturan
 settings_menu_item_signout=Keluar
 settings_menu_item_signin=Masuk
--- a/browser/extensions/loop/chrome/locale/kk/loop.properties
+++ b/browser/extensions/loop/chrome/locale/kk/loop.properties
@@ -1,16 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # Panel Strings
 
-
-
 ## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
 ## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
 ## use "..." if \u2026 doesn't suit traditions in your locale.
 loopMenuItem_label=Сөйлесуді бастау…
 loopMenuItem_accesskey=т
 
 ## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
 ## These are displayed together at the top of the panel when a user is needed to
@@ -38,27 +36,26 @@ first_time_experience_subheading_button_above=Веб парақтарды достармен бірге қарау үшін жоғарыдағы батырманы басыңыз.
 first_time_experience_content=Оны достармен бірге жоспарлау, жұмыс жасау және бірге күлу үшін қолданыңыз.
 first_time_experience_content2=Оны істерді бітіру үшін қолданыңыз: достармен бірге жоспарлау, жұмыс жасау және бірге күлу.
 first_time_experience_button_label2=Бұл қалай жұмыс жасайтынын қарау
 
 ## First Time Experience Slides
 fte_slide_1_title=Веб парақтарды досыңызбен бірге шолу
 ## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
 ## will be replaced by the short name 2.
-fte_slide_2_title=Бір парақты ашыңыз
+## LOCALIZATION_NOTE(fte_slide_2_copy2): {{clientShortname2}}
+## will be replaced by the short name 2.
 fte_slide_3_title=Досыңызды сөйлесуге оған сілтемені жіберу арқылы шақырыңыз
 ## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 ## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
 ## will be replaced by the super short brand name.
 ## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
 ## will be replaced by the brand short name.
 
-invite_header_text_bold=Біреуді бұл парақты сізбен бірге шолуға шақырыңыз!
-invite_header_text3=Firefox Hello қолдану үшін екі адам керек, сондықтан, досыңызға интернетті бірге шолуға сілтемені жіберіңіз!
 ## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
 ## invite_email_link_button, invite_facebook_button2): These labels appear under
 ## an iconic button for the invite view.
 invite_copy_link_button=Сілтемені көшіріп алу
 invite_copied_link_button=Көшірілген!
 invite_email_link_button=Сілтемені эл. поштамен жіберу
 invite_facebook_button3=Facebook
 invite_your_link=Сіздің сілтемеңіз:
@@ -94,16 +91,17 @@ share_email_body_context3=Досыңыз сізді Firefox Hello-да күтіп тұр. Байланысты орнату және {{title}} бірге шолу үшін сілтемені шертіңіз: {{callUrl}}
 share_tweet=Менімен {{clientShortname2}} видео сөйлесуіне қатысыңыз!
 
 share_add_service_button=Қызметті қосу
 
 ## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
 ## These menu items are displayed from a panel's context menu for a conversation.
 copy_link_menuitem=Сілтемені көшіріп алу
 email_link_menuitem=Сілтемені эл. поштамен жіберу
+edit_name_menuitem=Атын түзету
 delete_conversation_menuitem2=Өшіру
 
 panel_footer_signin_or_signup_link=Кіру немесе тіркелгіні жасау
 
 settings_menu_item_account=Тіркелгі
 settings_menu_item_settings=Баптаулар
 settings_menu_item_signout=Шығу
 settings_menu_item_signin=Кіру
@@ -241,16 +239,19 @@ rooms_room_full_call_to_action_label={{clientShortname}} туралы көбірек біліңіз »
 rooms_room_full_call_to_action_nonFx_label=Өз сөйлесуіңізді бастау үшін {{brandShortname}} жүктеп алыңыз
 rooms_room_full_label=Бұл сөйлесуге екі адам қатысуда.
 rooms_room_join_label=Сөйлесуге қосылу
 rooms_room_joined_owner_connected_label2=Сіздің досыңыз енді байланысқан, және сіздің браузер беттерін көре алады.
 rooms_room_joined_owner_not_connected_label=Сіздің досыңыз {{roomURLHostname}} сайтын бірге қарауға сізді күтіп тұр.
 
 self_view_hidden_message=Өздік көрініс жасырылған, бірақ, жіберілуде; көрсету үшін терезе өлшемін өзгертіңіз
 
+peer_left_session=Досыңыз шықты.
+peer_unexpected_quit=Досыңыз күтпегенде үзілген.
+
 ## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
 ## as this will be replaced by clientShortname2.
 tos_failure_message={{clientShortname}} сіздің еліңізде қолжетерсіз.
 
 display_name_guest=Қонақ
 
 ## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
 ## should remain "Hello" for all locales.
--- a/browser/extensions/loop/chrome/locale/rm/loop.properties
+++ b/browser/extensions/loop/chrome/locale/rm/loop.properties
@@ -1,16 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # Panel Strings
 
-
-
 ## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
 ## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
 ## use "..." if \u2026 doesn't suit traditions in your locale.
 loopMenuItem_label=Cumenzar ina conversaziun…
 loopMenuItem_accesskey=t
 
 ## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
 ## These are displayed together at the top of the panel when a user is needed to
@@ -23,39 +21,46 @@ sign_in_again_title_line_two2=per cuntin
 sign_in_again_button=S'annunziar
 ## LOCALIZATION_NOTE(sign_in_again_use_as_guest_button2): {{clientSuperShortname}}
 ## will be replaced by the super short brandname.
 sign_in_again_use_as_guest_button2=Utilisar {{clientSuperShortname}} sco giast
 
 panel_browse_with_friend_button=Navigar cun in ami en questa pagina
 panel_disconnect_button=Deconnectar
 
-## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
+## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
 ## user to create his or her first conversation.
 first_time_experience_subheading2=Clicca sin il buttun da Hello per navigar cun in ami en il web.
 
-## LOCALIZATION_NOTE(first_time_experience_content): Message describing
+## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
 ## ways to use Hello project.
 first_time_experience_content=Fa diever da la funcziun per planisar ensemen, lavurar ensemen, rir ensemen.
 first_time_experience_button_label2=Mussar co che quai funcziunescha
 
-invite_header_text_bold=Envida insatgi a navigar cun tai sin questa pagina!
-invite_header_text3=I dovra dus per utilisar Firefox Hello. Trametta pia ina colliaziun ad in ami per ch'el possia navigar en il web cun tai!
+## First Time Experience Slides
+## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
+## will be replaced by the short name 2.
+## LOCALIZATION_NOTE(fte_slide_2_copy2): {{clientShortname2}}
+## will be replaced by the short name 2.
+## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
+## will be replaced by the super short brand name.
+## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
+## will be replaced by the super short brand name.
+## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
+## will be replaced by the brand short name.
+
 ## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
 ## invite_email_link_button, invite_facebook_button2): These labels appear under
 ## an iconic button for the invite view.
 invite_copy_link_button=Copiar la colliaziun
 invite_copied_link_button=Copià!
 invite_email_link_button=Trametter la colliaziun via e-mail
 invite_facebook_button3=Facebook
 invite_your_link=Tia colliaziun:
 
-# Status text
-display_name_guest=Giast
-
 # Error bars
 ## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
 ## These may be displayed at the top of the panel.
 session_expired_error_description=La sessiun è scrudada. Tut las URLs che ti has creà e cundividì fin ussa na vegnan betg pli a funcziunar.
 could_not_authenticate=Impussibel dad autentifitgar
 password_changed_question=Has ti midà tes pled-clav?
 try_again_later=Emprova p.pl. pli tard anc ina giada
 could_not_connect=Impussibel da connectar cun il server
--- a/browser/extensions/loop/install.rdf.in
+++ b/browser/extensions/loop/install.rdf.in
@@ -4,17 +4,17 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>loop@mozilla.org</em:id>
     <em:bootstrap>true</em:bootstrap>
-    <em:version>1.2.2</em:version>
+    <em:version>1.2.4</em:version>
     <em:type>2</em:type>
 
     <!-- Target Application this extension can install into,
          with minimum and maximum supported versions. -->
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>46.0a1</em:minVersion>
--- a/browser/extensions/loop/jar.mn
+++ b/browser/extensions/loop/jar.mn
@@ -1,17 +1,17 @@
 #filter substitution
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 [features/loop@mozilla.org] chrome.jar:
 % content loop %content/ contentaccessible=yes
 % content loop-locale-fallback %content/locale-fallback/en-US/
-% skin loop classic/1.0 %skin/linux/ os=Linux
+% skin loop classic/1.0 %skin/linux/
 % skin loop classic/1.0 %skin/osx/ os=Darwin
 % skin loop classic/1.0 %skin/windows/ os=WINNT
 % skin loop-shared classic/1.0 %skin/shared/
 % override chrome://loop/skin/menuPanel.png       chrome://loop/skin/menuPanel-yosemite.png       os=Darwin osversion>=10.10
 % override chrome://loop/skin/menuPanel@2x.png    chrome://loop/skin/menuPanel-yosemite@2x.png    os=Darwin osversion>=10.10
 % override chrome://loop/skin/toolbar.png         chrome://loop/skin/toolbar-yosemite.png         os=Darwin osversion>=10.10
 % override chrome://loop/skin/toolbar@2x.png      chrome://loop/skin/toolbar-yosemite@2x.png      os=Darwin osversion>=10.10
 # Windows 10+ uses the default toolbar.png