diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 5a962fb80809..acec12093ab6 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -627,7 +627,9 @@ pref("app.update.socket.maxErrors", 20); pref("app.update.log", true); // SystemUpdate API +#ifdef MOZ_WIDGET_GONK pref("dom.system_update.active", "@mozilla.org/updates/update-prompt;1"); +#endif #else // Explicitly disable the shutdown watchdog. It's enabled by default. // When the updater is disabled, we want to know about shutdown hangs. diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css index 0ee040ada8c5..fe095bb30fef 100644 --- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -724,6 +724,10 @@ input[type=button] { color: #4A90E2; } +#newtab-intro-footer > ul > li > a:hover { + color: #000000; +} + #newtab-intro-body { position: relative; display: block; diff --git a/browser/base/content/test/plugins/browser.ini b/browser/base/content/test/plugins/browser.ini index e01114880f81..a3d633d62255 100644 --- a/browser/base/content/test/plugins/browser.ini +++ b/browser/base/content/test/plugins/browser.ini @@ -55,7 +55,6 @@ skip-if = !crashreporter [browser_CTP_data_urls.js] [browser_CTP_drag_drop.js] [browser_CTP_hide_overlay.js] -skip-if = true # Bug 1160788 [browser_CTP_iframe.js] skip-if = os == 'linux' || os == 'mac' # Bug 984821 [browser_CTP_multi_allow.js] diff --git a/browser/components/loop/content/conversation.html b/browser/components/loop/content/conversation.html index a88300687d49..7631a74452e4 100644 --- a/browser/components/loop/content/conversation.html +++ b/browser/components/loop/content/conversation.html @@ -21,7 +21,6 @@ - diff --git a/browser/components/loop/content/js/client.js b/browser/components/loop/content/js/client.js index 3be748cbd962..4463146a9207 100644 --- a/browser/components/loop/content/js/client.js +++ b/browser/components/loop/content/js/client.js @@ -3,7 +3,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ var loop = loop || {}; -loop.Client = (function($) { +loop.Client = (function() { "use strict"; // THe expected properties to be returned from the POST /calls request. @@ -116,4 +116,4 @@ loop.Client = (function($) { }; return Client; -})(jQuery); +})(); diff --git a/browser/components/loop/content/panel.html b/browser/components/loop/content/panel.html index d2aa202189be..6af78664cf72 100644 --- a/browser/components/loop/content/panel.html +++ b/browser/components/loop/content/panel.html @@ -16,7 +16,6 @@ - diff --git a/browser/components/loop/content/shared/css/common.css b/browser/components/loop/content/shared/css/common.css index 92b03dabdd19..aa13075e8b60 100644 --- a/browser/components/loop/content/shared/css/common.css +++ b/browser/components/loop/content/shared/css/common.css @@ -549,6 +549,9 @@ html[dir="rtl"] .context-wrapper > .context-preview { flex: 0 1 auto; display: block; color: black; + /* 16px for the preview, plus its .8em margin */ + max-width: calc(100% - 16px - .8em); + word-wrap: break-word; } .context-wrapper > .context-description > .context-url { diff --git a/browser/components/loop/content/shared/js/store.js b/browser/components/loop/content/shared/js/store.js index e537d6d42566..20301cdcee45 100644 --- a/browser/components/loop/content/shared/js/store.js +++ b/browser/components/loop/content/shared/js/store.js @@ -143,5 +143,11 @@ loop.store.StoreMixin = (function() { StoreMixin.register = function(stores) { _.extend(_stores, stores); }; + /** + * Used for test purposes, to clear the list of registered stores. + */ + StoreMixin.clearRegisteredStores = function() { + _stores = {}; + }; return StoreMixin; })(); diff --git a/browser/components/loop/content/shared/js/views.js b/browser/components/loop/content/shared/js/views.js index 98c410de6b5f..4384485bbcc2 100644 --- a/browser/components/loop/content/shared/js/views.js +++ b/browser/components/loop/content/shared/js/views.js @@ -944,6 +944,81 @@ loop.shared.views = (function(_, mozL10n) { } }); + var MediaLayoutView = React.createClass({displayName: "MediaLayoutView", + propTypes: { + dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired, + displayScreenShare: React.PropTypes.bool.isRequired, + isLocalLoading: React.PropTypes.bool.isRequired, + isRemoteLoading: React.PropTypes.bool.isRequired, + isScreenShareLoading: React.PropTypes.bool.isRequired, + // The poster URLs are for UI-showcase testing and development. + localPosterUrl: React.PropTypes.string, + localSrcVideoObject: React.PropTypes.object, + localVideoMuted: React.PropTypes.bool.isRequired, + remotePosterUrl: React.PropTypes.string, + remoteSrcVideoObject: React.PropTypes.object, + renderRemoteVideo: React.PropTypes.bool.isRequired, + screenSharePosterUrl: React.PropTypes.string, + screenShareVideoObject: React.PropTypes.object, + showContextRoomName: React.PropTypes.bool.isRequired, + useDesktopPaths: React.PropTypes.bool.isRequired + }, + + render: function() { + var remoteStreamClasses = React.addons.classSet({ + "remote": true, + "focus-stream": !this.props.displayScreenShare + }); + + var screenShareStreamClasses = React.addons.classSet({ + "screen": true, + "focus-stream": this.props.displayScreenShare + }); + + var mediaWrapperClasses = React.addons.classSet({ + "media-wrapper": true, + "receiving-screen-share": this.props.displayScreenShare, + "showing-local-streams": this.props.localSrcVideoObject || + this.props.localPosterUrl + }); + + return ( + React.createElement("div", {className: "media-layout"}, + React.createElement("div", {className: mediaWrapperClasses}, + React.createElement("span", {className: "self-view-hidden-message"}, + mozL10n.get("self_view_hidden_message") + ), + React.createElement("div", {className: remoteStreamClasses}, + React.createElement(MediaView, {displayAvatar: !this.props.renderRemoteVideo, + isLoading: this.props.isRemoteLoading, + mediaType: "remote", + posterUrl: this.props.remotePosterUrl, + srcVideoObject: this.props.remoteSrcVideoObject}) + ), + React.createElement("div", {className: screenShareStreamClasses}, + React.createElement(MediaView, {displayAvatar: false, + isLoading: this.props.isScreenShareLoading, + mediaType: "screen-share", + posterUrl: this.props.screenSharePosterUrl, + srcVideoObject: this.props.screenShareVideoObject}) + ), + React.createElement(loop.shared.views.chat.TextChatView, { + dispatcher: this.props.dispatcher, + showRoomName: this.props.showContextRoomName, + useDesktopPaths: false}), + React.createElement("div", {className: "local"}, + React.createElement(MediaView, {displayAvatar: this.props.localVideoMuted, + isLoading: this.props.isLocalLoading, + mediaType: "local", + posterUrl: this.props.localPosterUrl, + srcVideoObject: this.props.localSrcVideoObject}) + ) + ) + ) + ); + } + }); + return { AvatarView: AvatarView, Button: Button, @@ -953,6 +1028,7 @@ loop.shared.views = (function(_, mozL10n) { ConversationView: ConversationView, ConversationToolbar: ConversationToolbar, MediaControlButton: MediaControlButton, + MediaLayoutView: MediaLayoutView, MediaView: MediaView, LoadingView: LoadingView, ScreenShareControlButton: ScreenShareControlButton, diff --git a/browser/components/loop/content/shared/js/views.jsx b/browser/components/loop/content/shared/js/views.jsx index 346fa038f5f8..48442014ed3b 100644 --- a/browser/components/loop/content/shared/js/views.jsx +++ b/browser/components/loop/content/shared/js/views.jsx @@ -944,6 +944,81 @@ loop.shared.views = (function(_, mozL10n) { } }); + var MediaLayoutView = React.createClass({ + propTypes: { + dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired, + displayScreenShare: React.PropTypes.bool.isRequired, + isLocalLoading: React.PropTypes.bool.isRequired, + isRemoteLoading: React.PropTypes.bool.isRequired, + isScreenShareLoading: React.PropTypes.bool.isRequired, + // The poster URLs are for UI-showcase testing and development. + localPosterUrl: React.PropTypes.string, + localSrcVideoObject: React.PropTypes.object, + localVideoMuted: React.PropTypes.bool.isRequired, + remotePosterUrl: React.PropTypes.string, + remoteSrcVideoObject: React.PropTypes.object, + renderRemoteVideo: React.PropTypes.bool.isRequired, + screenSharePosterUrl: React.PropTypes.string, + screenShareVideoObject: React.PropTypes.object, + showContextRoomName: React.PropTypes.bool.isRequired, + useDesktopPaths: React.PropTypes.bool.isRequired + }, + + render: function() { + var remoteStreamClasses = React.addons.classSet({ + "remote": true, + "focus-stream": !this.props.displayScreenShare + }); + + var screenShareStreamClasses = React.addons.classSet({ + "screen": true, + "focus-stream": this.props.displayScreenShare + }); + + var mediaWrapperClasses = React.addons.classSet({ + "media-wrapper": true, + "receiving-screen-share": this.props.displayScreenShare, + "showing-local-streams": this.props.localSrcVideoObject || + this.props.localPosterUrl + }); + + return ( +
Complete.
"); + var completeNode = document.createElement("p"); + completeNode.setAttribute("id", "complete"); + completeNode.appendChild(document.createTextNode("Complete")); + document.getElementById("mocha").appendChild(completeNode); });