diff --git a/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js b/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js
new file mode 100644
index 000000000..4596e8d24
--- /dev/null
+++ b/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ * @providesModule TouchableNativeFeedback
+ */
+
+'use strict';
+
+var React = require('React');
+var StyleSheet = require('StyleSheet');
+var Text = require('Text');
+var View = require('View');
+
+var DummyTouchableNativeFeedback = React.createClass({
+ render: function() {
+ return (
+
+ TouchableNativeFeedback is not supported on this platform!
+
+ );
+ },
+});
+
+var styles = StyleSheet.create({
+ container: {
+ height: 100,
+ width: 300,
+ backgroundColor: '#ffbcbc',
+ borderWidth: 1,
+ borderColor: 'red',
+ alignItems: 'center',
+ justifyContent: 'center',
+ margin: 10,
+ },
+ info: {
+ color: '#333333',
+ margin: 20,
+ }
+});
+
+module.exports = DummyTouchableNativeFeedback;
diff --git a/Libraries/Components/View/View.js b/Libraries/Components/View/View.js
index dc1329658..8594cfe8b 100644
--- a/Libraries/Components/View/View.js
+++ b/Libraries/Components/View/View.js
@@ -267,6 +267,10 @@ var View = React.createClass({
shouldRasterizeIOS: PropTypes.bool,
/**
+ * Views that are only used to layout their children or otherwise don't draw
+ * anything may be automatically removed from the native hierarchy as an
+ * optimization. Set this property to `false` to disable this optimization and
+ * ensure that this View exists in the native view hierarchy.
* @platform android
*/
collapsable: PropTypes.bool,
diff --git a/Libraries/ReactNative/ReactNativeViewAttributes.js b/Libraries/ReactNative/ReactNativeViewAttributes.js
index ae47b7529..028284db5 100644
--- a/Libraries/ReactNative/ReactNativeViewAttributes.js
+++ b/Libraries/ReactNative/ReactNativeViewAttributes.js
@@ -24,6 +24,7 @@ ReactNativeViewAttributes.UIView = {
accessibilityTraits: true,
importantForAccessibility: true,
testID: true,
+ renderToHardwareTextureAndroid: true,
shouldRasterizeIOS: true,
onLayout: true,
onAccessibilityTap: true,
diff --git a/packager/launchAndroidPackager.command b/packager/launchAndroidPackager.command
deleted file mode 100755
index 10951f3f3..000000000
--- a/packager/launchAndroidPackager.command
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2015-present, Facebook, Inc.
-# All rights reserved.
-#
-# This source code is licensed under the BSD-style license found in the
-# LICENSE file in the root directory of this source tree. An additional grant
-# of patent rights can be found in the PATENTS file in the same directory.
-
-# Set terminal title
-echo -en "\033]0;React Packager\a"
-clear
-
-THIS_DIR=$(dirname "$0")
-$THIS_DIR/packager.sh --platform android --port 8082
-echo "Process terminated. Press to close the window"
-read
diff --git a/packager/packager.js b/packager/packager.js
index fcff7e58f..8f0f08007 100644
--- a/packager/packager.js
+++ b/packager/packager.js
@@ -48,11 +48,6 @@ var options = parseCommandLine([{
command: 'assetRoots',
type: 'string',
description: 'specify the root directories of app assets'
-}, {
- command: 'platform',
- type: 'string',
- default: 'ios',
- description: 'Specify the platform-specific blacklist (ios, android, web).'
}, {
command: 'skipflow',
description: 'Disable flow checks'
@@ -229,7 +224,7 @@ function getAppMiddleware(options) {
return ReactPackager.middleware({
nonPersistent: options.nonPersistent,
projectRoots: options.projectRoots,
- blacklistRE: blacklist(options.platform),
+ blacklistRE: blacklist(),
cacheVersion: '2',
transformModulePath: transformerPath,
assetRoots: options.assetRoots,
diff --git a/packager/react-packager/index.js b/packager/react-packager/index.js
index c3e5829f3..f399eae09 100644
--- a/packager/react-packager/index.js
+++ b/packager/react-packager/index.js
@@ -60,35 +60,7 @@ exports.createClientFor = function(options) {
return SocketInterface.getOrCreateSocketFor(options);
};
-process.on('message', function(m) {
- if (m && m.type && m.type === 'createSocketServer') {
- console.log('server got ipc message', m);
- var options = m.data.options;
-
- // regexp doesn't naturally serialize to json.
- options.blacklistRE = new RegExp(options.blacklistRE.source);
-
- SocketInterface.createSocketServer(
- m.data.sockPath,
- m.data.options
- ).then(
- function() {
- console.log('succesfully created server', m);
- process.send({ type: 'createdServer' });
- },
- function(error) {
- console.log('error creating server', error.code);
- if (error.code === 'EADDRINUSE') {
- // Server already listening, this may happen if multiple
- // clients where started in quick succussion (buck).
- process.send({ type: 'createdServer' });
- } else {
- throw error;
- }
- }
- ).done();
- }
-});
+SocketInterface.listenOnServerMessages();
function useGracefulFs() {
var fs = require('fs');
diff --git a/packager/react-packager/src/JSTransformer/index.js b/packager/react-packager/src/JSTransformer/index.js
index 6906d69f4..47019846d 100644
--- a/packager/react-packager/src/JSTransformer/index.js
+++ b/packager/react-packager/src/JSTransformer/index.js
@@ -23,7 +23,7 @@ const readFile = Promise.denodeify(fs.readFile);
const MAX_CALLS_PER_WORKER = 600;
// Worker will timeout if one of the callers timeout.
-const DEFAULT_MAX_CALL_TIME = 30000;
+const DEFAULT_MAX_CALL_TIME = 60000;
const validateOpts = declareOpts({
projectRoots: {
diff --git a/packager/react-packager/src/SocketInterface/SocketClient.js b/packager/react-packager/src/SocketInterface/SocketClient.js
index 474223adc..30b599b0f 100644
--- a/packager/react-packager/src/SocketInterface/SocketClient.js
+++ b/packager/react-packager/src/SocketInterface/SocketClient.js
@@ -73,15 +73,15 @@ class SocketClient {
const resolver = this._resolvers[message.id];
if (!resolver) {
throw new Error(
- 'Unrecognized message id (message already resolved or never existed'
+ 'Unrecognized message id (' + message.id + ') ' +
+ 'message already resolved or never existed.'
);
}
delete this._resolvers[message.id];
if (message.type === 'error') {
- // TODO convert to an error
- resolver.reject(message.data);
+ resolver.reject(new Error(message.data));
} else {
resolver.resolve(message.data);
}
diff --git a/packager/react-packager/src/SocketInterface/SocketServer.js b/packager/react-packager/src/SocketInterface/SocketServer.js
index 693c8e0c6..f6faf8368 100644
--- a/packager/react-packager/src/SocketInterface/SocketServer.js
+++ b/packager/react-packager/src/SocketInterface/SocketServer.js
@@ -54,13 +54,13 @@ class SocketServer {
const bunser = new bser.BunserBuf();
sock.on('data', (buf) => bunser.append(buf));
-
bunser.on('value', (m) => this._handleMessage(sock, m));
}
_handleMessage(sock, m) {
if (!m || !m.id || !m.data) {
console.error('SocketServer recieved a malformed message: %j', m);
+ return;
}
debug('got request', m);
@@ -119,9 +119,38 @@ class SocketServer {
this._dieEventually();
}, MAX_IDLE_TIME);
}
-}
-module.exports = SocketServer;
+ static listenOnServerIPCMessages() {
+ process.on('message', (message) => {
+ if (!(message && message.type && message.type === 'createSocketServer')) {
+ return;
+ }
+
+ debug('server got ipc message', message);
+
+ const {options, sockPath} = message.data;
+ // regexp doesn't naturally serialize to json.
+ options.blacklistRE = new RegExp(options.blacklistRE.source);
+
+ new SocketServer(sockPath, options).onReady().then(
+ () => {
+ debug('succesfully created server');
+ process.send({ type: 'createdServer' });
+ },
+ error => {
+ debug('error creating server', error.code);
+ if (error.code === 'EADDRINUSE') {
+ // Server already listening, this may happen if multiple
+ // clients where started in quick succussion (buck).
+ process.send({ type: 'createdServer' });
+ } else {
+ throw error;
+ }
+ }
+ ).done();
+ });
+ }
+}
// TODO move this to bser code.
function toJSON(object) {
@@ -139,3 +168,5 @@ function toJSON(object) {
return object;
}
+
+module.exports = SocketServer;
diff --git a/packager/react-packager/src/SocketInterface/__tests__/SocketClient-test.js b/packager/react-packager/src/SocketInterface/__tests__/SocketClient-test.js
index b77d92a05..c898e9272 100644
--- a/packager/react-packager/src/SocketInterface/__tests__/SocketClient-test.js
+++ b/packager/react-packager/src/SocketInterface/__tests__/SocketClient-test.js
@@ -107,6 +107,6 @@ describe('SocketClient', () => {
data: 'some error'
});
- return promise.catch(m => expect(m).toBe('some error'));
+ return promise.catch(m => expect(m.message).toBe('some error'));
});
});
diff --git a/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js b/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js
index f0940023a..c03f39992 100644
--- a/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js
+++ b/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js
@@ -72,16 +72,4 @@ describe('SocketInterface', () => {
});
});
});
-
- describe('createSocketServer', () => {
- pit('creates a server', () => {
- require('../SocketServer').mockImpl((sockPath, options) => {
- expect(sockPath).toBe('/socket');
- expect(options).toEqual({ projectRoots: ['/root'] });
- return { onReady: () => Promise.resolve() };
- });
-
- return SocketInterface.createSocketServer('/socket', { projectRoots: ['/root'] });
- });
- });
});
diff --git a/packager/react-packager/src/SocketInterface/index.js b/packager/react-packager/src/SocketInterface/index.js
index 87837b291..470d0fc24 100644
--- a/packager/react-packager/src/SocketInterface/index.js
+++ b/packager/react-packager/src/SocketInterface/index.js
@@ -18,7 +18,7 @@ const path = require('path');
const tmpdir = require('os').tmpdir();
const {spawn} = require('child_process');
-const CREATE_SERVER_TIMEOUT = 10000;
+const CREATE_SERVER_TIMEOUT = 30000;
const SocketInterface = {
getOrCreateSocketFor(options) {
@@ -72,7 +72,7 @@ const SocketInterface = {
}
);
- child.unref();
+ child.unref();
child.on('message', m => {
if (m && m.type && m.type === 'createdServer') {
@@ -94,9 +94,10 @@ const SocketInterface = {
});
},
- createSocketServer(sockPath, options) {
- return new SocketServer(sockPath, options).onReady();
+ listenOnServerMessages() {
+ return SocketServer.listenOnServerIPCMessages();
}
+
};
module.exports = SocketInterface;