Compare commits

...
Author SHA1 Message Date
Moonchild 05441188be Issue #2306 - Enable full weakref by default in platform. 2026-06-07 23:54:52 +02:00
Moonchild 25a2d31be7 Issue #2306 - Re-introduce pref for WeakRef API spec.
Effectively avoids doing any GC work if preffed off, and adopts the same
for FinalizationRegistry which internally does similar work as WeakRefs.
2026-06-07 21:36:39 +02:00
Moonchild 58a4e0d545 [DOM] Provide more silent audio processing frames. 2026-06-05 12:29:30 +02:00
Moonchild ad06b4ce5e Revert "Bug 2027433 Treat null input channels as zero in InterleaveAndConvertBuffer()"
This reverts commit e76fc5637a.
2026-06-05 11:28:55 +02:00
Moonchild be3827b088 Revert "Bug 2027433 Treat null input channels as zero in AudioChannelsDownMix()"
This reverts commit ddd016a6f8.
2026-06-05 11:28:42 +02:00
Moonchild a136aaf502 Revert "Bug 2027433 use nullptr for silent up-mix channels"
This reverts commit 5309640d6c.
2026-06-05 11:28:35 +02:00
Moonchild 40d91a8eae Merge pull request 'Always Uppercase Eszett' (#3114) from RealityRipple/UXP:capital-eszett into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3114
2026-06-04 08:15:36 +00:00
Moonchild 5b81a81ac4 Merge pull request 'Fix LoongArch64 debug build assertions' (#3115) from Basilisk-Dev/UXP-contrib:loongarch-asserts into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3115
2026-06-04 04:08:45 +00:00
Basilisk-Dev 328ddb2927 Issue #3095 followup - Fix LoongArch64 debug build assertions 2026-06-03 18:13:31 -04:00
Andy 06b9622302 Issue #2964 - Part 3: JS Override for ToUpperCase 2026-06-02 15:25:47 -07:00
Andy 1218649202 Issue #2964 - Part 2b: Improve ToUpperCaseLength
Adds a method to force 16-bit characters, regardless of the type of the `chars` argument.
2026-06-02 15:21:44 -07:00
Andy cbea8f5a53 Issue #2964 - Part 2a: Correctly Detect End of Buffer in ToUpperCaseImpl
This code made two assumptions:
- That the `SrcChar` type should determine the output type, as used in `CanUpperCaseSpecialCasing`.
- That `AppendUpperCaseSpecialCasing` would always return a value larger than the previous value.

The new code uses `DestChar`'s type for `CanUpperCaseSpecialCasing` and for a more accurate End of Buffer check.
2026-06-02 15:21:26 -07:00
Andy f42e644486 Issue #2964 - Part 1: CSS Override for uppercase and capitalize 2026-06-02 15:20:45 -07:00
Moonchild a40490b946 Merge pull request 'Fix a build failure for WebRTC on Python 3.14 on MacOS' (#3113) from Basilisk-Dev/UXP-contrib:webrtc-fix-mac into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3113
2026-06-01 09:09:29 +00:00
Basilisk-Dev ad98693f3d Issue #3105 followup - Fix a build failure for WebRTC on Python 3.14 2026-05-31 09:54:46 -04:00
Moonchild 7b4aaca975 Merge pull request 'Clamp border-radius value to Int32.MaxValue' (#3112) from border-radius-clamp into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3112
2026-05-30 08:42:57 +00:00
Moonchild 400e59a96d Issue #3109 - Use CSS' internal length clamp value instead. 2026-05-29 23:53:22 +02:00
Moonchild 09276b72a6 Issue #3109 - Clamp border-radius value to Int32.MaxValue
This avoids artifacts from out-of-bounds values.
Resolves #3109
2026-05-29 22:53:43 +02:00
Moonchild ec18304362 Merge pull request 'Cleanup references to IA64/HP-UX' (#3106) from Basilisk-Dev/UXP-contrib:ia64-cleanup into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3106
2026-05-27 10:46:31 +00:00
Moonchild 4cf411f393 Merge pull request 'Remove gonk/Android/iOS/NACL code in WebRTC' (#3105) from Basilisk-Dev/UXP-contrib:webrtc-cleanup-mobile into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/3105
2026-05-27 10:45:37 +00:00
Basilisk-Dev 2b0935adf4 Issue #3007 - Remove HP-UX LDAP compatibility code 2026-05-23 17:08:16 -04:00
Basilisk-Dev cbdc5fa85f Issue #3007 - Remove HP-UX launcher setup 2026-05-23 17:06:16 -04:00
Basilisk-Dev 2a06c40a09 Issue #3007 - Remove IA64 runtime support paths 2026-05-23 17:04:19 -04:00
Basilisk-Dev f499e3dd36 Issue #3007 - Remove IA64 from build configuration 2026-05-23 17:04:18 -04:00
Basilisk-Dev 48d21fa2bf Issue #3008 - Prefer Windows memory barrier in WebRTC FIFO 2026-05-23 16:31:36 -04:00
Basilisk-Dev c91c69272b Issue #3008 - Remove stale B2G WebRTC camera comment 2026-05-23 16:25:35 -04:00
Basilisk-Dev 91f4fa744e Issue #3008 - Remove mobile leftovers from DOM WebRTC 2026-05-23 16:25:35 -04:00
Basilisk-Dev c2abd4aaa6 Issue #3008 - Remove stale Android WebView GYP guards 2026-05-23 16:25:34 -04:00
Basilisk-Dev 617ad84f96 Issue #3008 - Keep WebRTC audio FIFO after OpenSL removal 2026-05-23 16:25:33 -04:00
Basilisk-Dev 33b6bfa1b9 Issue #3008 - Fix GYP defaults after mobile cleanup 2026-05-23 16:25:33 -04:00
Basilisk-Dev 4e03afd191 Issue #3008 - Remove remaining mobile WebRTC build references 2026-05-23 16:25:32 -04:00
Basilisk-Dev 3512b73bc3 Issue #3008 - Remove stale iOS comments from WebRTC 2026-05-23 16:25:31 -04:00
Basilisk-Dev d0ac45cb08 Issue #3008 - Remove iOS support from bundled GYP generators 2026-05-23 16:25:31 -04:00
Basilisk-Dev ab3d950bd3 Issue #3008 - Remove mobile and NaCl defaults from WebRTC common gyp 2026-05-23 16:25:30 -04:00
Basilisk-Dev 44ddd79356 Issue #3008 - Remove stale iOS labels from WebRTC assembly 2026-05-23 16:25:29 -04:00
Basilisk-Dev 054ddf661f Issue #3008 - Remove stale mobile notes from WebRTC metadata 2026-05-23 16:25:29 -04:00
Basilisk-Dev da466a3bdd Issue #3008 - Remove stale mobile references from WebRTC headers 2026-05-23 16:25:28 -04:00
Basilisk-Dev 42f0c2d78f Issue #3008 - Remove mobile support from bundled WebRTC tools 2026-05-23 16:25:27 -04:00
Basilisk-Dev 5853784a31 Issue #3008 - Remove stale WebRTC mobile build metadata 2026-05-23 16:25:27 -04:00
Basilisk-Dev 5b20295620 Issue #3008 - Remove mobile guards from WebRTC voice tests 2026-05-23 16:25:26 -04:00
Basilisk-Dev 68e151c2a3 Issue #3008 - Remove mobile guards from WebRTC audio device tests 2026-05-23 16:25:25 -04:00
Basilisk-Dev dd764a70a2 Issue #3008 - Remove mobile guards from WebRTC module tests 2026-05-23 16:25:24 -04:00
Basilisk-Dev 12defe0d12 Issue #3008 - Remove mobile guards from WebRTC audio tests 2026-05-23 16:25:24 -04:00
Basilisk-Dev 8868dd5785 Issue #3008 - Remove mobile guards from WebRTC tests 2026-05-23 16:25:23 -04:00
Basilisk-Dev e787d585a4 Issue #3008 - Remove stale WebRTC mobile metadata 2026-05-23 16:25:22 -04:00
Basilisk-Dev 5eb7518ce2 Issue #3008 - Remove mobile WebRTC runtime conditionals 2026-05-23 16:25:21 -04:00
Basilisk-Dev 5be93da111 Issue #3008 - Remove obsolete mobile WebRTC source trees 2026-05-23 16:25:21 -04:00
653 changed files with 790 additions and 45151 deletions

No files matched your search

-2
View File
@@ -43,8 +43,6 @@ gyp_vars.update({
'arm_neon': 0,
'arm_neon_optional': 1,
'moz_webrtc_omx': 0,
'moz_webrtc_mediacodec': 0,
# Turn off multi monitor screen share
'multi_monitor_screenshare%' : 0,
+1 -1
View File
@@ -344,7 +344,7 @@ def split_triplet(triplet):
if cpu.endswith('86') or (cpu.startswith('i') and '86' in cpu):
canonical_cpu = 'x86'
endianness = 'little'
elif cpu in ('x86_64', 'ia64'):
elif cpu == 'x86_64':
canonical_cpu = cpu
endianness = 'little'
elif cpu in ('s390', 's390x'):
+1 -7
View File
@@ -290,11 +290,6 @@ fi
if [ -n "$LD_LIBRARY_PATH_64" ]; then
LD_LIBRARY_PATH_64=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH_64:+":$LD_LIBRARY_PATH_64"}
fi
#
#
## Set SHLIB_PATH for HPUX
SHLIB_PATH=${MOZ_DIST_BIN}:${MRE_HOME}${SHLIB_PATH:+":$SHLIB_PATH"}
#
## Set LIBPATH for AIX
LIBPATH=${MOZ_DIST_BIN}:${MRE_HOME}${LIBPATH:+":$LIBPATH"}
#
@@ -339,7 +334,6 @@ then
fi
echo "DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH"
echo " LIBRARY_PATH=$LIBRARY_PATH"
echo " SHLIB_PATH=$SHLIB_PATH"
echo " LIBPATH=$LIBPATH"
echo " ADDON_PATH=$ADDON_PATH"
echo " MOZ_PROGRAM=$MOZ_PROGRAM"
@@ -350,7 +344,7 @@ then
fi
#
export MOZILLA_FIVE_HOME LD_LIBRARY_PATH
export SHLIB_PATH LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH
export LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH
if [ $moz_debug -eq 1 ]
then
-1
View File
@@ -448,7 +448,6 @@ gtk/gtkx.h
gtk/gtkunixprint.h
HIToolbox/HIToolbox.h
hlink.h
ia64/sys/inline.h
Icons.h
iconv.h
ieeefp.h
+5 -17
View File
@@ -105,8 +105,6 @@ gDownMixMatrices[CUSTOM_CHANNEL_LAYOUTS*(CUSTOM_CHANNEL_LAYOUTS - 1)/2] =
* Given an array of input channels, downmix to aOutputChannelCount, and copy
* the results to the channel buffers in aOutputChannels. Don't call this with
* input count <= output count.
* Each of aOutputChannels must be non-null.
* aChannelArray elements may be null.
*/
template<typename T>
void AudioChannelsDownMix(const nsTArray<const T*>& aChannelArray,
@@ -121,11 +119,7 @@ void AudioChannelsDownMix(const nsTArray<const T*>& aChannelArray,
if (inputChannelCount > 6) {
// Just drop the unknown channels.
for (uint32_t o = 0; o < aOutputChannelCount; ++o) {
if (inputChannels[o]) {
PodCopy(aOutputChannels[o], inputChannels[o], aDuration);
} else {
std::fill_n(aOutputChannels[o], aDuration, static_cast<T>(0));
}
PodCopy(aOutputChannels[o], inputChannels[o], aDuration);
}
return;
}
@@ -144,19 +138,13 @@ void AudioChannelsDownMix(const nsTArray<const T*>& aChannelArray,
// want an input channel to contribute to nothing
T outputChannels[CUSTOM_CHANNEL_LAYOUTS + 1] = {0};
for (uint32_t c = 0; c < inputChannelCount; ++c) {
if (inputChannels[c]) {
outputChannels[m.mInputDestination[c]] +=
m.mInputCoefficient[c] *
(static_cast<const T*>(inputChannels[c]))[s];
}
outputChannels[m.mInputDestination[c]] +=
m.mInputCoefficient[c]*(static_cast<const T*>(inputChannels[c]))[s];
}
// Utilize the fact that in every layout, C is the third channel.
if (m.mCExtraDestination != IGNORE) {
if (inputChannels[SURROUND_C]) {
outputChannels[m.mCExtraDestination] +=
m.mInputCoefficient[SURROUND_C] *
(static_cast<const T*>(inputChannels[SURROUND_C]))[s];
}
outputChannels[m.mCExtraDestination] +=
m.mInputCoefficient[SURROUND_C]*(static_cast<const T*>(inputChannels[SURROUND_C]))[s];
}
for (uint32_t c = 0; c < aOutputChannelCount; ++c) {
+3 -9
View File
@@ -121,19 +121,13 @@ AudioSegment::Mix(AudioMixer& aMixer, uint32_t aOutputChannels,
}
if (channelData.Length() < aOutputChannels) {
// Up-mix.
AudioChannelsUpMix(&channelData, aOutputChannels, static_cast<const AudioDataValue*>(nullptr));
AudioChannelsUpMix(&channelData, aOutputChannels, SilentChannel::ZeroChannel<AudioDataValue>());
for (uint32_t channel = 0; channel < aOutputChannels; channel++) {
AudioDataValue* ptr =
PointerForOffsetInChannel(buf.Elements(), outBufferLength,
aOutputChannels, channel, offsetSamples);
if (channelData[channel]) {
PodCopy(
ptr,
reinterpret_cast<const AudioDataValue*>(channelData[channel]),
frames);
} else {
PodZero(ptr, frames);
}
PodCopy(ptr, reinterpret_cast<const AudioDataValue*>(channelData[channel]),
frames);
}
MOZ_ASSERT(channelData.Length() == aOutputChannels);
} else if (channelData.Length() > aOutputChannels) {
+9 -16
View File
@@ -61,22 +61,15 @@ template <typename SrcT, typename DestT>
static void
InterleaveAndConvertBuffer(const SrcT* const* aSourceChannels,
uint32_t aLength, float aVolume,
uint32_t aChannelCount,
uint32_t aChannels,
DestT* aOutput)
{
for (size_t channel = 0; channel < aChannelCount; ++channel) {
DestT* output = aOutput;
if (aSourceChannels[channel]) {
for (size_t i = 0; i < aLength; ++i) {
float v = AudioSampleToFloat(aSourceChannels[channel][i])*aVolume;
*output = FloatToAudioSample<DestT>(v);
output += aChannelCount;
}
} else {
for (size_t i = 0; i < aLength; ++i) {
*output = static_cast<DestT>(0);
output += aChannelCount;
}
DestT* output = aOutput;
for (size_t i = 0; i < aLength; ++i) {
for (size_t channel = 0; channel < aChannels; ++channel) {
float v = AudioSampleToFloat(aSourceChannels[channel][i])*aVolume;
*output = FloatToAudioSample<DestT>(v);
++output;
}
}
}
@@ -100,7 +93,7 @@ DeinterleaveAndConvertBuffer(const SrcT* aSourceBuffer,
class SilentChannel
{
public:
static const int AUDIO_PROCESSING_FRAMES = 640; /* > 10ms of 48KHz audio */
static const int AUDIO_PROCESSING_FRAMES = 4096; /* > 10ms of 48KHz audio */
static const uint8_t gZeroChannel[MAX_AUDIO_SAMPLE_SIZE*AUDIO_PROCESSING_FRAMES];
// We take advantage of the fact that zero in float and zero in int have the
// same all-zeros bit layout.
@@ -415,7 +408,7 @@ void WriteChunk(AudioChunk& aChunk,
if (channelData.Length() < aOutputChannels) {
// Up-mix. Note that this might actually make channelData have more
// than aOutputChannels temporarily.
AudioChannelsUpMix(&channelData, aOutputChannels, static_cast<const SrcT*>(nullptr));
AudioChannelsUpMix(&channelData, aOutputChannels, SilentChannel::ZeroChannel<SrcT>());
}
if (channelData.Length() > aOutputChannels) {
// Down-mix.
+1 -3
View File
@@ -29,8 +29,7 @@ enum {
* Abstract interface for managing audio and video devices. Each platform
* must implement a concrete class that will map these classes and methods
* to the appropriate backend. For example, on Desktop platforms, these will
* correspond to equivalent webrtc (GIPS) calls, and on B2G they will map to
* a Gonk interface.
* correspond to equivalent webrtc (GIPS) calls.
*/
class MediaEngineVideoSource;
class MediaEngineAudioSource;
@@ -302,7 +301,6 @@ public:
/* If implementation of MediaEngineSource supports TakePhoto(), the picture
* should be return via aCallback object. Otherwise, it returns NS_ERROR_NOT_IMPLEMENTED.
* Currently, only Gonk MediaEngineSource implementation supports it.
*/
virtual nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) = 0;
@@ -36,8 +36,8 @@ bool MediaEngineCameraVideoSource::AppendToTrack(SourceMediaStream* aSource,
return aSource->AppendToTrack(aID, &(segment));
}
// Sub-classes (B2G or desktop) should overload one of both of these two methods
// to provide capabilities
// Subclasses should overload one or both of these methods to provide
// capabilities.
size_t
MediaEngineCameraVideoSource::NumCapabilities() const
{
@@ -324,21 +324,6 @@ MediaEngineCameraVideoSource::SetName(nsString aName)
bool hasFacingMode = false;
VideoFacingModeEnum facingMode = VideoFacingModeEnum::User;
// Set facing mode based on device name.
#if defined(ANDROID)
// Names are generated. Example: "Camera 0, Facing back, Orientation 90"
//
// See media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/
// webrtc/videoengine/VideoCaptureDeviceInfoAndroid.java
if (aName.Find(NS_LITERAL_STRING("Facing back")) != kNotFound) {
hasFacingMode = true;
facingMode = VideoFacingModeEnum::Environment;
} else if (aName.Find(NS_LITERAL_STRING("Facing front")) != kNotFound) {
hasFacingMode = true;
facingMode = VideoFacingModeEnum::User;
}
#endif // ANDROID
#ifdef XP_MACOSX
// Kludge to test user-facing cameras on OSX.
if (aName.Find(NS_LITERAL_STRING("Face")) != -1) {
@@ -108,7 +108,7 @@ protected:
nsTArray<PrincipalHandle> mPrincipalHandles; // Directly mapped to mSources.
RefPtr<layers::Image> mImage;
RefPtr<layers::ImageContainer> mImageContainer;
int mWidth, mHeight; // protected with mMonitor on Gonk due to different threading
int mWidth, mHeight; // protected with mMonitor
// end of data protected by mMonitor
+1 -1
View File
@@ -15,7 +15,7 @@
#ifdef FF
#undef FF
#endif
#include "webrtc/modules/audio_device/opensl/single_rw_fifo.h"
#include "SingleRwFifo.h"
#define CHANNELS 1
#define ENCODING "L16"
+99
View File
@@ -0,0 +1,99 @@
/*
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "SingleRwFifo.h"
#include <assert.h>
#if defined(_MSC_VER)
#include <windows.h>
#endif
static int
UpdatePos(int pos, int capacity)
{
return (pos + 1) % capacity;
}
namespace webrtc {
namespace subtle {
#if defined(_MSC_VER)
inline void
MemoryBarrier()
{
::MemoryBarrier();
}
#elif defined(__GNUC__) || defined(__clang__)
inline void
MemoryBarrier()
{
__sync_synchronize();
}
#else
#error Add an implementation of MemoryBarrier() for this platform!
#endif
} // namespace subtle
SingleRwFifo::SingleRwFifo(int capacity)
: capacity_(capacity)
, size_(0)
, read_pos_(0)
, write_pos_(0)
{
queue_.reset(new int8_t*[capacity_]);
}
SingleRwFifo::~SingleRwFifo()
{
}
void
SingleRwFifo::Push(int8_t* mem)
{
assert(mem);
// Ensure that there is space for the new data in the FIFO. There is only one
// writer, so the other thread is guaranteed only to decrease the size.
const int free_slots = capacity() - size();
if (free_slots <= 0) {
// Size can be queried outside of Push. The caller is expected to ensure
// that Push will be successful before calling it.
assert(false);
return;
}
queue_[write_pos_] = mem;
// Ensure that |size_| is updated after the stored pointer is visible.
subtle::MemoryBarrier();
++size_;
write_pos_ = UpdatePos(write_pos_, capacity());
}
int8_t*
SingleRwFifo::Pop()
{
int8_t* ret_val = nullptr;
if (size() <= 0) {
// Size can be queried outside of Pop. The caller is expected to ensure
// that Pop will be successful before calling it.
assert(false);
return ret_val;
}
ret_val = queue_[read_pos_];
// Ensure that |size_| is updated after the stored pointer is read.
subtle::MemoryBarrier();
--size_;
read_pos_ = UpdatePos(read_pos_, capacity());
return ret_val;
}
} // namespace webrtc
@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
#ifndef DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
#define DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/system_wrappers/interface/atomic32.h"
@@ -17,10 +17,9 @@
namespace webrtc {
// Implements a lock-free FIFO losely based on
// Implements a lock-free FIFO loosely based on
// http://src.chromium.org/viewvc/chrome/trunk/src/media/base/audio_fifo.cc
// Note that this class assumes there is one producer (writer) and one
// consumer (reader) thread.
// This class assumes there is one producer and one consumer thread.
class SingleRwFifo {
public:
explicit SingleRwFifo(int capacity);
@@ -29,8 +28,6 @@ class SingleRwFifo {
void Push(int8_t* mem);
int8_t* Pop();
void Clear();
int size() { return size_.Value(); }
int capacity() const { return capacity_; }
@@ -46,4 +43,4 @@ class SingleRwFifo {
} // namespace webrtc
#endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
#endif // DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
+2 -2
View File
@@ -38,6 +38,7 @@ if CONFIG['MOZ_WEBRTC']:
# MediaEngineWebRTC.cpp needs to be built separately.
SOURCES += [
'MediaEngineWebRTC.cpp',
'SingleRwFifo.cpp',
]
LOCAL_INCLUDES += [
'/dom/base',
@@ -68,8 +69,7 @@ include('/ipc/chromium/chromium-config.mozbuild')
# Suppress some GCC/clang warnings being treated as errors:
# - about attributes on forward declarations for types that are already
# defined, which complains about important MOZ_EXPORT attributes for
# android API types
# defined, which complains about important MOZ_EXPORT attributes.
if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
CXXFLAGS += [
'-Wno-error=attributes',
+1 -3
View File
@@ -194,7 +194,7 @@ static void FreeStringArray(uint32_t variants, char ** array)
static bool CanLoadPlugin(char16ptr_t aBinaryPath)
{
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_IA64)
#if defined(_M_IX86) || defined(_M_X64)
bool canLoad = false;
HANDLE file = CreateFileW(aBinaryPath, GENERIC_READ,
@@ -214,8 +214,6 @@ static bool CanLoadPlugin(char16ptr_t aBinaryPath)
canLoad = (arch == IMAGE_FILE_MACHINE_I386);
#elif defined(_M_X64)
canLoad = (arch == IMAGE_FILE_MACHINE_AMD64);
#elif defined(_M_IA64)
canLoad = (arch == IMAGE_FILE_MACHINE_IA64);
#endif
}
}
+1
View File
@@ -301,6 +301,7 @@ LoadContextOptions(const char* aPrefName, void* /* aClosure */)
.setAsyncStack(GetWorkerPref<bool>(NS_LITERAL_CSTRING("asyncstack")))
.setWerror(GetWorkerPref<bool>(NS_LITERAL_CSTRING("werror")))
.setStreams(GetWorkerPref<bool>(NS_LITERAL_CSTRING("streams")))
.setWeakRefs(GetWorkerPref<bool>(NS_LITERAL_CSTRING("weakrefs")))
.setExtraWarnings(GetWorkerPref<bool>(NS_LITERAL_CSTRING("strict")))
.setArrayProtoValues(GetWorkerPref<bool>(
NS_LITERAL_CSTRING("array_prototype_values")));
+1
View File
@@ -35,6 +35,7 @@ WORKER_SIMPLE_PREF("dom.serviceWorkers.openWindow.enabled", OpenWindowEnabled, O
WORKER_SIMPLE_PREF("dom.storageManager.enabled", StorageManagerEnabled, STORAGEMANAGER_ENABLED)
WORKER_SIMPLE_PREF("dom.push.enabled", PushEnabled, PUSH_ENABLED)
WORKER_SIMPLE_PREF("dom.streams.enabled", StreamsEnabled, STREAMS_ENABLED)
WORKER_SIMPLE_PREF("javascript.options.weakrefs", WeakRefsEnabled, WEAKREFS_ENABLED)
WORKER_SIMPLE_PREF("dom.requestcontext.enabled", RequestContextEnabled, REQUESTCONTEXT_ENABLED)
WORKER_SIMPLE_PREF("gfx.offscreencanvas.enabled", OffscreenCanvasEnabled, OFFSCREENCANVAS_ENABLED)
WORKER_SIMPLE_PREF("dom.webkitBlink.dirPicker.enabled", WebkitBlinkDirectoryPickerEnabled, DOM_WEBKITBLINK_DIRPICKER_WEBKITBLINK)
+50 -22
View File
@@ -66,10 +66,28 @@ struct WeakCell {
WeakCellKind kind;
WeakRef<JSObject*> object;
WeakRef<JS::Symbol*> symbol;
bool enabled;
WeakCell() : kind(WeakCellKind::Empty), object(nullptr), symbol(nullptr) {}
explicit WeakCell(JSObject* obj) : kind(WeakCellKind::Object), object(obj), symbol(nullptr) {}
explicit WeakCell(JS::Symbol* sym) : kind(WeakCellKind::Symbol), object(nullptr), symbol(sym) {}
WeakCell()
: kind(WeakCellKind::Empty)
, object(nullptr)
, symbol(nullptr)
, enabled(true)
{}
explicit WeakCell(JSObject* obj, bool enabled)
: kind(WeakCellKind::Object)
, object(obj)
, symbol(nullptr)
, enabled(enabled)
{}
explicit WeakCell(JS::Symbol* sym, bool enabled)
: kind(WeakCellKind::Symbol)
, object(nullptr)
, symbol(sym)
, enabled(enabled)
{}
void clear() {
kind = WeakCellKind::Empty;
@@ -101,7 +119,9 @@ struct WeakCell {
if (!target)
return;
if (IsInsideNursery(target)) {
if (!enabled) {
// Do nothing
} else if (IsInsideNursery(target)) {
TraceManuallyBarrieredEdge(trc, object.unsafeGet(), name);
} else {
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
@@ -110,7 +130,7 @@ struct WeakCell {
}
} else if (kind == WeakCellKind::Symbol) {
JS::Symbol* target = symbol.unbarrieredGet();
if (target) {
if (enabled && target) {
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
return;
TraceWeakEdge(trc, &symbol, name);
@@ -124,14 +144,16 @@ struct WeakCell {
if (!target)
return;
if (IsInsideNursery(target)) {
if (!enabled) {
// Do nothing
} else if (IsInsideNursery(target)) {
TraceManuallyBarrieredEdge(trc, object.unsafeGet(), name);
} else if (target->asTenured().zone()->isCollecting()) {
TraceWeakEdge(trc, &object, name);
}
} else if (kind == WeakCellKind::Symbol) {
JS::Symbol* target = symbol.unbarrieredGet();
if (target && target->asTenured().zone()->isCollecting())
if (enabled && target && target->asTenured().zone()->isCollecting())
TraceWeakEdge(trc, &symbol, name);
}
}
@@ -143,22 +165,24 @@ struct FinalizationRecord {
WeakCell unregisterToken;
bool active;
bool queued;
bool enabled;
FinalizationRecord(HandleValue targetValue, HandleValue heldValue,
HandleValue unregisterTokenValue)
HandleValue unregisterTokenValue, bool enabled)
: heldValue(heldValue),
active(true),
queued(false)
queued(false),
enabled(enabled)
{
if (targetValue.isObject())
target = WeakCell(NormalizeWeakObject(&targetValue.toObject()));
target = WeakCell(NormalizeWeakObject(&targetValue.toObject()), enabled);
else
target = WeakCell(targetValue.toSymbol());
target = WeakCell(targetValue.toSymbol(), enabled);
if (unregisterTokenValue.isObject())
unregisterToken = WeakCell(NormalizeWeakObject(&unregisterTokenValue.toObject()));
unregisterToken = WeakCell(NormalizeWeakObject(&unregisterTokenValue.toObject()), enabled);
else if (unregisterTokenValue.isSymbol())
unregisterToken = WeakCell(unregisterTokenValue.toSymbol());
unregisterToken = WeakCell(unregisterTokenValue.toSymbol(), enabled);
}
void trace(JSTracer* trc) {
@@ -217,13 +241,15 @@ struct FinalizationRegistryObject::Data {
FinalizationRecordVector records;
FinalizationRecordVector cleanupQueue;
bool queuedForCleanup;
bool enabled;
explicit Data(JSObject* cleanupCallback)
explicit Data(JSObject* cleanupCallback, bool enabled)
: cleanupCallback(cleanupCallback),
cleanupJob(nullptr),
records(SystemAllocPolicy()),
cleanupQueue(SystemAllocPolicy()),
queuedForCleanup(false)
queuedForCleanup(false),
enabled(enabled)
{}
~Data() {
@@ -232,11 +258,13 @@ struct FinalizationRegistryObject::Data {
}
void trace(JSTracer* trc) {
JS::TraceEdge(trc, &cleanupCallback, "FinalizationRegistry cleanup callback");
if (cleanupJob.unbarrieredGet())
JS::TraceEdge(trc, &cleanupJob, "FinalizationRegistry cleanup job");
for (size_t i = 0; i < records.length(); i++)
records[i]->trace(trc);
if (enabled) {
JS::TraceEdge(trc, &cleanupCallback, "FinalizationRegistry cleanup callback");
if (cleanupJob.unbarrieredGet())
JS::TraceEdge(trc, &cleanupJob, "FinalizationRegistry cleanup job");
for (size_t i = 0; i < records.length(); i++)
records[i]->trace(trc);
}
}
bool appendRecord(FinalizationRecord* record) {
@@ -317,7 +345,7 @@ FinalizationRegistry_register_impl(JSContext* cx, const CallArgs& args)
unregisterToken.setUndefined();
}
FinalizationRecord* record = cx->new_<FinalizationRecord>(target, heldValue, unregisterToken);
FinalizationRecord* record = cx->new_<FinalizationRecord>(target, heldValue, unregisterToken, cx->options().weakRefs());
if (!record)
return false;
@@ -401,7 +429,7 @@ FinalizationRegistryObject::create(JSContext* cx, HandleObject cleanupCallback,
if (!obj)
return nullptr;
Data* data = cx->new_<Data>(cleanupCallback);
Data* data = cx->new_<Data>(cleanupCallback, cx->options().weakRefs());
if (!data)
return nullptr;
+6 -4
View File
@@ -140,9 +140,9 @@ WeakRefObject::create(JSContext* cx, HandleValue target, HandleObject proto /* =
Referent* data;
if (target.isObject())
data = cx->new_<Referent>(&target.toObject());
data = cx->new_<Referent>(&target.toObject(), cx->options().weakRefs());
else
data = cx->new_<Referent>(target.toSymbol());
data = cx->new_<Referent>(target.toSymbol(), cx->options().weakRefs());
if (!data)
return nullptr;
@@ -210,7 +210,9 @@ WeakRefObject::trace(JSTracer* trc, JSObject* obj)
if (!target)
return;
if (IsInsideNursery(target)) {
if (!data->enabled) {
// Pref disabled, don't do anything.
} else if (IsInsideNursery(target)) {
// Weak edges must be tenured; trace strongly while referent is in the nursery.
TraceManuallyBarrieredEdge(trc, data->objectTarget.unsafeGet(),
"WeakRef nursery referent");
@@ -220,7 +222,7 @@ WeakRefObject::trace(JSTracer* trc, JSObject* obj)
} else {
MOZ_ASSERT(data->isSymbol());
JS::Symbol* target = data->symbolTarget.unbarrieredGet();
if (target)
if (data->enabled && target)
TraceWeakEdge(trc, &data->symbolTarget, "WeakRef symbol referent");
}
}
+15 -5
View File
@@ -22,17 +22,27 @@ class WeakRefObject : public NativeObject
Symbol
};
explicit Referent(JSObject* obj)
: kind(Kind::Object), objectTarget(obj), symbolTarget(nullptr) {}
explicit Referent(JS::Symbol* sym)
: kind(Kind::Symbol), objectTarget(nullptr), symbolTarget(sym) {}
explicit Referent(JSObject* obj, bool enabled)
: kind(Kind::Object)
, objectTarget(obj)
, symbolTarget(nullptr)
, enabled(enabled)
{}
explicit Referent(JS::Symbol* sym, bool enabled)
: kind(Kind::Symbol)
, objectTarget(nullptr)
, symbolTarget(sym)
, enabled(enabled)
{}
bool isObject() const { return kind == Kind::Object; }
bool isSymbol() const { return kind == Kind::Symbol; }
Kind kind;
WeakRef<JSObject*> objectTarget;
WeakRef<JS::Symbol*> symbolTarget;
bool enabled;
};
static const Class class_;
+10 -10
View File
@@ -416,13 +416,13 @@ MapMemoryAt(void* desired, size_t length, int prot = PROT_READ | PROT_WRITE,
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
// Solaris manages 64-bit address space in a different manner from every other
// AMD64 operating system, but fortunately the fix is the same one
// required for every operating system on 64-bit SPARC, Itanium, and ARM.
// AMD64 operating system, but fortunately the fix is the same one
// required for every operating system on 64-bit SPARC and ARM.
// Most people's intuition failed them here and they thought this couldn't
// possibly be correct on AMD64, but for Solaris/illumos it is.
{
#if defined(__ia64__) || defined(__aarch64__) || (defined(__sun) && defined(__x86_64__)) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
#if defined(__aarch64__) || (defined(__sun) && defined(__x86_64__)) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
MOZ_ASSERT((0xffff800000000000ULL & (uintptr_t(desired) + length - 1)) == 0);
#endif
void* region = mmap(desired, length, prot, flags, fd, offset);
@@ -445,14 +445,14 @@ static inline void*
MapMemory(size_t length, int prot = PROT_READ | PROT_WRITE,
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
{
#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
#if defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__)
/*
* The JS engine assumes that all allocated pointers have their high 17 bits clear,
* which ia64's mmap doesn't support directly. However, we can emulate it by passing
* mmap an "addr" parameter with those bits clear. The mmap will return that address,
* or the nearest available memory above that address, providing a near-guarantee
* that those bits are clear. If they are not, we return nullptr below to indicate
* out-of-memory.
* which mmap on this platform doesn't support directly. However, we can emulate it
* by passing mmap an "addr" parameter with those bits clear. The mmap will return
* that address, or the nearest available memory above that address, providing a
* near-guarantee that those bits are clear. If they are not, we return nullptr below
* to indicate out-of-memory.
*
* The addr is chosen as 0x0000070000000000, which still allows about 120TB of virtual
* address space.
@@ -479,7 +479,7 @@ MapMemory(size_t length, int prot = PROT_READ | PROT_WRITE,
* different due to the different mmap behavior.
*
* TODO: Merge with the above code block if this implementation works for
* ia64 and sparc64.
* sparc64.
*/
const uintptr_t start = UINT64_C(0x0000070000000000);
const uintptr_t end = UINT64_C(0x0000800000000000);
@@ -320,7 +320,6 @@ size_t AssemblerLOONGARCH64::bytesNeeded() const {
// write a blob of binary into the instruction stream
BufferOffset AssemblerLOONGARCH64::writeInst(uint32_t x, uint32_t* dest) {
MOZ_ASSERT(hasCreator());
if (dest == nullptr) {
return m_buffer.putInt(x);
}
@@ -212,6 +212,8 @@ static constexpr Register WasmTableCallIndexReg = ABINonArgReg3;
static constexpr Register WasmIonExitRegCallee = t0;
static constexpr Register WasmIonExitRegE0 = a0;
static constexpr Register WasmIonExitRegE1 = a1;
static constexpr Register WasmIonExitRegReturnData = JSReturnReg_Data;
static constexpr Register WasmIonExitRegReturnType = JSReturnReg_Type;
static constexpr Register WasmIonExitRegD0 = a0;
static constexpr Register WasmIonExitRegD1 = a1;
static constexpr Register WasmIonExitRegD2 = t0;
@@ -1013,8 +1013,8 @@ CodeGeneratorLoongArch64::visitTestI64AndBranch(LTestI64AndBranch* lir)
void
CodeGeneratorLoongArch64::setReturnDoubleRegs(LiveRegisterSet* regs)
{
MOZ_ASSERT(ReturnFloat32Reg.reg_ == FloatRegisters::f0);
MOZ_ASSERT(ReturnDoubleReg.reg_ == FloatRegisters::f0);
MOZ_ASSERT(ReturnFloat32Reg.encoding() == FloatRegisters::f0);
MOZ_ASSERT(ReturnDoubleReg.encoding() == FloatRegisters::f0);
FloatRegister f1 = { FloatRegisters::f1, FloatRegisters::Single };
regs->add(ReturnFloat32Reg);
regs->add(f1);
@@ -2395,7 +2395,7 @@ void MacroAssemblerLOONGARCH64::wasmLoadImpl(const wasm::MemoryAccessDesc& acces
Register ptrScratch,
AnyRegister output, Register tmp) {
uint32_t offset = access.offset();
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
// Maybe add the offset.
@@ -2442,7 +2442,7 @@ void MacroAssemblerLOONGARCH64::wasmStoreImpl(const wasm::MemoryAccessDesc& acce
Register memoryBase, Register ptr,
Register ptrScratch, Register tmp) {
uint32_t offset = access.offset();
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
// Maybe add the offset.
@@ -2488,7 +2488,7 @@ void MacroAssemblerLOONGARCH64Compat::wasmLoadI64Impl(
const wasm::MemoryAccessDesc& access, Register memoryBase, Register ptr,
Register ptrScratch, Register64 output, Register tmp) {
uint32_t offset = access.offset();
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
// Maybe add the offset.
@@ -2534,7 +2534,7 @@ void MacroAssemblerLOONGARCH64Compat::wasmStoreI64Impl(
const wasm::MemoryAccessDesc& access, Register64 value, Register memoryBase,
Register ptr, Register ptrScratch, Register tmp) {
uint32_t offset = access.offset();
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
// Maybe add the offset.
@@ -2774,12 +2774,13 @@ CodeOffset MacroAssembler::nopPatchableToNearJump() {
}
void MacroAssembler::patchNopToNearJump(uint8_t* jump, uint8_t* target) {
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->is<InstNOP>());
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->encode() == NopInst);
new (jump) InstJump(op_b, JOffImm26(target - jump));
}
void MacroAssembler::patchNearJumpToNop(uint8_t* jump) {
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->is<InstJump>());
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->extractBitField(31, 26) ==
(uint32_t)op_b >> 26);
new (jump) InstNOP();
}
+2 -2
View File
@@ -301,7 +301,7 @@ void unmapPages(void* p, size_t size) { }
void*
mapMemoryAt(void* desired, size_t length)
{
#if defined(__ia64__) || defined(__aarch64__) || \
#if defined(__aarch64__) || \
(defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
MOZ_RELEASE_ASSERT(0xffff800000000000ULL & (uintptr_t(desired) + length - 1) == 0);
#endif
@@ -324,7 +324,7 @@ mapMemory(size_t length)
int fd = -1;
off_t offset = 0;
// The test code must be aligned with the implementation in gc/Memory.cpp.
#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
#if defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__)
void* region = mmap((void*)0x0000070000000000, length, prot, flags, fd, offset);
if (region == MAP_FAILED)
return nullptr;
+6 -3
View File
@@ -999,7 +999,8 @@ class JS_PUBLIC_API(ContextOptions) {
strictMode_(false),
extraWarnings_(false),
arrayProtoValues_(true),
streams_(false)
streams_(false),
weakRefs_(false)
{
}
@@ -1139,12 +1140,13 @@ class JS_PUBLIC_API(ContextOptions) {
return *this;
}
bool weakRefs() const { return true; }
bool weakRefs() const { return weakRefs_; }
ContextOptions& setWeakRefs(bool flag) {
(void) flag;
weakRefs_ = flag;
return *this;
}
ContextOptions& toggleWeakRefs() {
weakRefs_ = !weakRefs_;
return *this;
}
@@ -1165,6 +1167,7 @@ class JS_PUBLIC_API(ContextOptions) {
bool extraWarnings_ : 1;
bool arrayProtoValues_ : 1;
bool streams_ : 1;
bool weakRefs_ : 1;
};
JS_PUBLIC_API(ContextOptions&)
+35 -7
View File
@@ -976,6 +976,12 @@ CanUpperCaseSpecialCasing(Latin1Char charCode)
static inline bool
CanUpperCaseSpecialCasing(char16_t charCode)
{
// Update mapping for U+00DF LATIN SMALL LETTER SHARP S inline,
// overriding Unicode data files to force the use of
// U+1E9E LATIN CAPITAL LETTER SHARP S.
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S)
return true;
return unicode::CanUpperCaseSpecialCasing(charCode);
}
@@ -991,6 +997,11 @@ LengthUpperCaseSpecialCasing(Latin1Char charCode)
static inline size_t
LengthUpperCaseSpecialCasing(char16_t charCode)
{
// U+00DF LATIN SMALL LETTER SHARP S is uppercased according to ICU or
// to U+1E9E LATIN CAPITAL LETTER SHARP S.
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S)
return 1;
MOZ_ASSERT(CanUpperCaseSpecialCasing(charCode));
return unicode::LengthUpperCaseSpecialCasing(charCode);
@@ -1010,6 +1021,13 @@ AppendUpperCaseSpecialCasing(char16_t charCode, Latin1Char* elements, size_t* in
static inline void
AppendUpperCaseSpecialCasing(char16_t charCode, char16_t* elements, size_t* index)
{
// U+00DF LATIN SMALL LETTER SHARP S is uppercased according to ICU or
// to U+1E9E LATIN CAPITAL LETTER SHARP S.
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S) {
elements[(*index)++] = 0x1E9E;
return;
}
unicode::AppendUpperCaseSpecialCasing(charCode, elements, index);
}
@@ -1025,6 +1043,7 @@ ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t startIndex,
MOZ_ASSERT(srcLength <= destLength);
size_t j = startIndex;
size_t upperLength = srcLength;
for (size_t i = startIndex; i < srcLength; i++) {
char16_t c = srcChars[i];
if (!IsSame<DestChar, Latin1Char>::value) {
@@ -1040,9 +1059,10 @@ ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t startIndex,
}
}
if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<SrcChar>(c)))) {
if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<DestChar>(c)))) {
// Return if the output buffer is too small.
if (srcLength == destLength)
upperLength += (LengthUpperCaseSpecialCasing(static_cast<DestChar>(c)) - 1);
if (upperLength > destLength)
return i;
AppendUpperCaseSpecialCasing(c, destChars, &j);
@@ -1071,14 +1091,18 @@ ToUpperCaseImpl(Latin1Char* destChars, const char16_t* srcChars, size_t startInd
template <typename CharT>
static size_t
ToUpperCaseLength(const CharT* chars, size_t startIndex, size_t length)
ToUpperCaseLength(const CharT* chars, size_t startIndex, size_t length, bool force16)
{
size_t upperLength = length;
for (size_t i = startIndex; i < length; i++) {
char16_t c = chars[i];
if (c > 0x7f && CanUpperCaseSpecialCasing(static_cast<CharT>(c)))
upperLength += LengthUpperCaseSpecialCasing(static_cast<CharT>(c)) - 1;
if (c > 0x7f &&
(force16 && CanUpperCaseSpecialCasing(c) ||
CanUpperCaseSpecialCasing(static_cast<CharT>(c))))
upperLength += (force16
? LengthUpperCaseSpecialCasing(c)
: LengthUpperCaseSpecialCasing(static_cast<CharT>(c))) - 1;
}
return upperLength;
}
@@ -1117,7 +1141,7 @@ ToUpperCase(JSContext* cx, const SrcChar* chars, size_t startIndex, size_t lengt
size_t readChars = ToUpperCaseImpl(buf.get(), chars, startIndex, length, length);
if (readChars < length) {
size_t actualLength = ToUpperCaseLength(chars, readChars, length);
size_t actualLength = ToUpperCaseLength(chars, readChars, length, !IsSame<DestChar, Latin1Char>::value);
*resultLength = actualLength;
DestCharPtr buf2 = ReallocChars(cx, Move(buf), length + 1, actualLength + 1);
@@ -1178,7 +1202,8 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
//
// If the original string is Latin-1, it can -- unless the string
// contains U+00B5 MICRO SIGN or U+00FF SMALL LETTER Y WITH DIAERESIS,
// the only Latin-1 codepoints that don't uppercase within Latin-1.
// the only Latin-1 codepoints that don't uppercase within Latin-1, or
// it contains U+00DF LATIN SMALL LETTER SHARP S, which we override.
// Search for those codepoints to decide whether the new string can be
// Latin-1.
// If the original string is a two-byte string, its uppercase form is
@@ -1195,6 +1220,9 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
MOZ_ASSERT(unicode::ToUpperCase(c) > JSString::MAX_LATIN1_CHAR);
resultIsLatin1 = false;
break;
} else if (c == unicode::LATIN_SMALL_LETTER_SHARP_S) {
resultIsLatin1 = false;
break;
} else {
MOZ_ASSERT(unicode::ToUpperCase(c) <= JSString::MAX_LATIN1_CHAR);
}
+1 -1
View File
@@ -839,7 +839,7 @@ wasm::ToggleProfiling(const Code& code, const CallSite& callSite, bool enabled)
#elif defined(JS_CODEGEN_LOONGARCH64)
uint8_t* caller = callerRetAddr - sizeof(uint32_t);
Instruction* callerInsn = reinterpret_cast<Instruction*>(caller);
MOZ_ASSERT(callerInsn->extractOpcode() == ((uint32_t)op_bl >> OpcodeShift));
MOZ_ASSERT(callerInsn->extractBitField(31, 26) == ((uint32_t)op_bl >> 26));
int32_t calleeOffset =
int32_t(reinterpret_cast<InstJump*>(callerInsn)->extractImm26Value() << 8) >> 6;
void* callee = caller + calleeOffset;
+3 -1
View File
@@ -1442,6 +1442,7 @@ ReloadPrefsCallback(const char* pref, void* data)
bool extraWarnings = Preferences::GetBool(JS_OPTIONS_DOT_STR "strict");
bool streams = Preferences::GetBool(JS_OPTIONS_DOT_STR "streams");
bool weakRefs = Preferences::GetBool(JS_OPTIONS_DOT_STR "weakrefs");
bool unboxedObjects = Preferences::GetBool(JS_OPTIONS_DOT_STR "unboxed_objects");
@@ -1468,7 +1469,8 @@ ReloadPrefsCallback(const char* pref, void* data)
.setWerror(werror)
.setExtraWarnings(extraWarnings)
.setArrayProtoValues(arrayProtoValues)
.setStreams(streams);
.setStreams(streams)
.setWeakRefs(weakRefs);
JS_SetParallelParsingEnabled(cx, parallelParsing);
JS_SetOffthreadIonCompilationEnabled(cx, offthreadIonCompilation);
+14 -1
View File
@@ -318,7 +318,7 @@ nsCaseTransformTextRunFactory::TransformString(
// in the output string
uint32_t irishMarkSrc = uint32_t(-1); // corresponding location in source
// string (may differ from output due to
// expansions like eszet -> 'SS')
// expansions)
for (uint32_t i = 0; i < length; ++i, ++aOffsetInTextRun) {
uint32_t ch = str[i];
@@ -604,6 +604,13 @@ nsCaseTransformTextRunFactory::TransformString(
// to check for special uppercase (ß)
}
// Updated mapping for Germen eszett, not currently reflected in the
// Unicode data files.
if (ch == 0x00DF) {
ch = 0x1E9E;
break;
}
mcm = mozilla::unicode::SpecialUpper(ch);
if (mcm) {
int j = 0;
@@ -658,6 +665,12 @@ nsCaseTransformTextRunFactory::TransformString(
}
}
// Updated mapping for Germen eszett as a capital letter.
if (ch == 0x00DF) {
ch = 0x1E9E;
break;
}
mcm = mozilla::unicode::SpecialTitle(ch);
if (mcm) {
int j = 0;
+6 -2
View File
@@ -8610,14 +8610,18 @@ nsRuleNode::ComputeBorderData(void* aStartStruct,
{
const nsCSSPropertyID* subprops =
nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_radius);
const float RADIUS_MAX = 17895697; // CSS length clamp value
NS_FOR_CSS_FULL_CORNERS(corner) {
int cx = FullToHalfCorner(corner, false);
int cy = FullToHalfCorner(corner, true);
const nsCSSValue& radius = *aRuleData->ValueFor(subprops[corner]);
nsCSSValue radius = *aRuleData->ValueFor(subprops[corner]);
nsStyleCoord parentX = parentBorder->mBorderRadius.Get(cx);
nsStyleCoord parentY = parentBorder->mBorderRadius.Get(cy);
nsStyleCoord coordX, coordY;
// Clamp border radius to the max value so it will not wrap and cause artifacts.
if (radius.GetFloatValue() > RADIUS_MAX) {
radius.SetFloatValue(RADIUS_MAX, eCSSUnit_Number);
}
if (SetPairCoords(radius, coordX, coordY, parentX, parentY,
SETCOORD_LPH | SETCOORD_INITIAL_ZERO |
SETCOORD_STORE_CALC | SETCOORD_UNSET_INITIAL,
+13 -19
View File
@@ -59,7 +59,7 @@
*/
#ifndef SYSV
#if defined( hpux ) || defined(XP_SOLARIS) || defined ( sgi ) || defined( SVR4 )
#if defined(XP_SOLARIS) || defined ( sgi ) || defined( SVR4 )
#define SYSV
#endif
#endif
@@ -82,7 +82,7 @@
/*
* System V has socket options in filio.h
*/
#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( hpux ) && !defined( AIX )
#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( AIX )
#define NEED_FILIO
#endif
@@ -169,7 +169,7 @@
* for select()
*/
#if !defined(WINSOCK) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
#if defined(hpux) || defined(LINUX) || defined(SUNOS4) || defined(XP_BEOS)
#if defined(LINUX) || defined(SUNOS4) || defined(XP_BEOS)
#include <sys/time.h>
#else
#include <sys/select.h>
@@ -190,7 +190,7 @@
* is necessary on some buggy UNIXes.
*/
#if !defined(NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED) && \
( defined(AIX) || defined(IRIX) || defined(HPUX) || defined(SUNOS4) \
( defined(AIX) || defined(IRIX) || defined(SUNOS4) \
|| defined(XP_SOLARIS) || defined(OSF1) ||defined(freebsd))
#define NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED
#endif
@@ -208,7 +208,7 @@
/*
* toupper and tolower macros are different under bsd and sys v
*/
#if defined( SYSV ) && !defined( hpux )
#if defined( SYSV )
#define TOUPPER(c) (isascii(c) && islower(c) ? _toupper(c) : c)
#define TOLOWER(c) (isascii(c) && isupper(c) ? _tolower(c) : c)
#else
@@ -236,7 +236,7 @@
#define SETFLAGS( tio, flags ) (tio).c_lflag = (flags)
#endif
#if ( !defined( HPUX9 )) && ( !defined( sunos4 )) && ( !defined( SNI )) && \
#if ( !defined( sunos4 )) && ( !defined( SNI )) && \
( !defined( HAVE_TIME_R ))
#define HAVE_TIME_R
#endif
@@ -267,10 +267,9 @@ int strncasecmp(const char *, const char *, size_t);
#define NSLDAPI_NETDB_BUF_SIZE 1024
#endif
#if defined(sgi) || defined(HPUX9) || defined(SCOOS) || \
#if defined(sgi) || defined(SCOOS) || \
defined(UNIXWARE) || defined(SUNOS4) || defined(SNI) || defined(BSDI) || \
defined(NCR) || defined(OSF1) || defined(NEC) || defined(VMS) || \
( defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) || \
defined(UnixWare) || defined(NETBSD) || \
defined(FREEBSD) || defined(OPENBSD) || \
(defined(LINUX) && __GLIBC__ < 2) || \
@@ -286,9 +285,6 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
#define GETHOSTBYNAME( n, r, b, l, e ) \
(memset (&b, 0, l), gethostbyname_r (n, r, &b) ? NULL : r)
#elif defined(HPUX10)
#define GETHOSTBYNAME_BUF_T struct hostent_data
#define GETHOSTBYNAME( n, r, b, l, e ) nsldapi_compat_gethostbyname_r( n, r, (char *)&b, l, e )
#elif defined(LINUX) || defined(DRAGONFLY)
typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
@@ -299,17 +295,15 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname_r( n, r, b, l, e )
#endif
#if defined(HPUX9) || defined(LINUX1_2) || defined(LINUX2_0) || \
#if defined(LINUX1_2) || defined(LINUX2_0) || \
defined(LINUX2_1) || defined(SUNOS4) || defined(SNI) || \
defined(SCOOS) || defined(BSDI) || defined(NCR) || \
defined(NEC) || ( defined(HPUX10) && !defined(_REENTRANT)) || \
defined(NEC) || \
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
#define NSLDAPI_CTIME( c, b, l ) ctime( c )
#elif defined(HPUX10) && defined(_REENTRANT) && !defined(HPUX11)
#define NSLDAPI_CTIME( c, b, l ) nsldapi_compat_ctime_r( c, b, l )
#elif defined( IRIX6_2 ) || defined( IRIX6_3 ) || defined(UNIXWARE) \
|| defined(OSF1V4) || defined(AIX) || defined(UnixWare) \
|| defined(hpux) || defined(HPUX11) || defined(NETBSD) \
|| defined(NETBSD) \
|| defined(IRIX6) || defined(FREEBSD) || defined(VMS) \
|| defined(NTO) || defined(OPENBSD) || defined(DRAGONFLY)
#define NSLDAPI_CTIME( c, b, l ) ctime_r( c, b )
@@ -318,7 +312,7 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
#else
#define NSLDAPI_CTIME( c, b, l ) ctime_r( c, b, l )
#endif
#if defined(hpux9) || defined(SUNOS4) || defined(SNI) || \
#if defined(SUNOS4) || defined(SNI) || \
defined(SCOOS) || defined(BSDI) || defined(NCR) || defined(VMS) || \
defined(NEC) || (defined(LINUX) && __GNU_LIBRARY__ != 6) || \
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
@@ -366,7 +360,7 @@ extern char *strdup();
/*
* Define a portable type for IPv4 style Internet addresses (32 bits):
*/
#if defined(_IN_ADDR_T) || defined(aix) || defined(HPUX11) || defined(OSF1)
#if defined(_IN_ADDR_T) || defined(aix) || defined(OSF1)
typedef in_addr_t nsldapi_in_addr_t;
#else
typedef nsldapi_uint_32 nsldapi_in_addr_t;
@@ -452,7 +446,7 @@ int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
#define NSLDAPI_FOPEN( filename, mode ) fopen( filename, mode )
#endif
#if defined(LINUX) || defined(AIX) || defined(HPUX) || defined(_WINDOWS)
#if defined(LINUX) || defined(AIX) || defined(_WINDOWS)
size_t nsldapi_compat_strlcpy(char *dst, const char *src, size_t len);
#define STRLCPY nsldapi_compat_strlcpy
#else
+1 -33
View File
@@ -51,39 +51,7 @@ static char copyright[] = "@(#) Copyright (c) 1994 The Regents of the University
#include "ldap-int.h"
#if defined( HPUX10 ) && defined( _REENTRANT ) && !defined(HPUX11)
extern int h_errno;
struct hostent *
nsldapi_compat_gethostbyname_r( const char *name, struct hostent *result,
char *buffer, int buflen, int *h_errnop )
{
struct hostent_data *hep;
if ( buflen < sizeof(struct hostent_data)) { /* sanity check */
*h_errnop = NO_RECOVERY; /* XXX best error code to use? */
return( NULL );
}
hep = (struct hostent_data *)buffer;
hep->current = NULL;
if ( gethostbyname_r( name, result, hep ) == -1) {
*h_errnop = h_errno; /* XXX don't see anywhere else to get this */
return NULL;
}
return result;
}
char *
nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen )
{
NSLDAPI_CTIME1( clock, buf, buflen );
return buf;
}
#endif /* HPUX10 && _REENTRANT && !HPUX11 */
#if defined(LINUX) || defined(AIX) || defined(HPUX) || defined(_WINDOWS)
#if defined(LINUX) || defined(AIX) || defined(_WINDOWS)
/*
* Copies src to the dstsize buffer at dst. The copy will never
* overflow the destination buffer and the buffer will always be null
+2 -11
View File
@@ -43,9 +43,6 @@
#include <errno.h>
#include <time.h>
#include <fcntl.h>
#ifdef hpux
#include <strings.h>
#endif /* hpux */
#ifdef _WINDOWS
# define FD_SETSIZE 256 /* number of connections we support */
@@ -62,9 +59,9 @@
# include <arpa/inet.h>
#endif
# include <netdb.h>
#if !defined(hpux) && !defined(SUNOS4) && !defined(XP_BEOS)
#if !defined(SUNOS4) && !defined(XP_BEOS)
# include <sys/select.h>
#endif /* !defined(hpux) and others */
#endif /* !defined(SUNOS4) and others */
#endif /* _WINDOWS */
#if defined(IRIX)
@@ -818,12 +815,6 @@ void nsldapi_hex_unescape( char *s );
/*
* in compat.c
*/
#ifdef hpux
char *nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen );
struct hostent *nsldapi_compat_gethostbyname_r( const char *name,
struct hostent *result, char *buffer, int buflen, int *h_errnop );
#endif /* hpux */
/*
* in control.c
*/
-7
View File
@@ -1259,17 +1259,10 @@ nsldapi_iostatus_poll( LDAP *ld, struct timeval *timeout )
iosp->ios_status.ios_osinfo.ossi_use_writefds
= iosp->ios_status.ios_osinfo.ossi_writefds;
#ifdef HPUX9
rc = NSLDAPI_SELECT( nsldapi_get_select_table_size(),
(int *)&iosp->ios_status.ios_osinfo.ossi_use_readfds
(int *)&iosp->ios_status.ios_osinfo.ossi_use_writefds,
NULL, timeout );
#else
rc = NSLDAPI_SELECT( nsldapi_get_select_table_size(),
&iosp->ios_status.ios_osinfo.ossi_use_readfds,
&iosp->ios_status.ios_osinfo.ossi_use_writefds,
NULL, timeout );
#endif /* else HPUX9 */
#endif /* else NSLDAPI_HAVE_POLL */
#endif /* NSLDAPI_AVOID_OS_SOCKETS */
+1 -1
View File
@@ -229,7 +229,7 @@ struct prldap_errormap_entry {
#define EOVERFLOW -1
#endif
#if defined(__hpux) || defined(_AIX) || defined(OSF1) || defined(DARWIN) || \
#if defined(_AIX) || defined(OSF1) || defined(DARWIN) || \
defined(BEOS) || defined(FREEBSD) || defined(BSDI) || defined(VMS) || \
defined(OPENBSD) || defined(NETBSD)
#define EDEADLOCK -1
+5 -5
View File
@@ -3964,9 +3964,9 @@ nsMsgDBView::FnSortIdUint32(const void *pItem1, const void *pItem2, void *privat
// XXX are these still correct?
//To compensate for memory alignment required for
//systems such as HP-UX these values must be 4 bytes
//aligned. Don't break this when modify the constants
// To compensate for memory alignment required by strict-alignment systems,
// these values must be 4 bytes aligned. Don't break this when modifying
// the constants.
const int kMaxSubjectKey = 160;
const int kMaxLocationKey = 160; // also used for account
const int kMaxAuthorKey = 160;
@@ -4804,8 +4804,8 @@ NS_IMETHODIMP nsMsgDBView::Sort(nsMsgViewSortTypeValue sortType,
info->folder = folders ? folders->ObjectAt(numSoFar) : m_folder.get();
memcpy(info->key, keyValue, actualFieldLen);
//In order to align memory for systems that require it, such as HP-UX
//calculate the correct value to pad the actualFieldLen value
// In order to align memory for systems that require it, calculate the
// correct value to pad the actualFieldLen value.
const uint32_t align = sizeof(IdKey) - sizeof(IdUint32) - 1;
actualFieldLen = (actualFieldLen + align) & ~align;
+1 -14
View File
@@ -92,7 +92,7 @@
'LIBYUV_MSA',
],
}],
['OS != "ios" and libyuv_disable_jpeg != 1', {
['libyuv_disable_jpeg != 1', {
'defines': [
'HAVE_JPEG'
],
@@ -135,18 +135,6 @@
'include',
'.',
],
'conditions': [
['OS == "android" and target_arch == "arm64"', {
'ldflags': [
'-Wl,--dynamic-linker,/system/bin/linker64',
],
}],
['OS == "android" and target_arch != "arm64"', {
'ldflags': [
'-Wl,--dynamic-linker,/system/bin/linker',
],
}],
], #conditions
},
'sources': [
'<@(libyuv_sources)',
@@ -154,4 +142,3 @@
},
], # targets.
}
-8
View File
@@ -14,13 +14,8 @@ webrtc_non_unified_sources = [
'trunk/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter_c.c', # Because of name clash in the kDampFilter variable
'trunk/webrtc/modules/audio_coding/main/acm2/codec_manager.cc', # Because of duplicate IsCodecRED/etc
'trunk/webrtc/modules/audio_coding/neteq/audio_vector.cc', # Because of explicit template specializations
'trunk/webrtc/modules/audio_device/android/audio_record_jni.cc', # Becuse of commonly named module static vars
'trunk/webrtc/modules/audio_device/android/audio_track_jni.cc', # Becuse of commonly named module static vars
'trunk/webrtc/modules/audio_device/linux/audio_device_pulse_linux.cc', # Because of LATE()
'trunk/webrtc/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc',# Because of LATE()
'trunk/webrtc/modules/audio_device/opensl/opensles_input.cc', # Because of name clash in the kOption variable
'trunk/webrtc/modules/audio_device/opensl/opensles_output.cc', # Because of name clash in the kOption variable
'trunk/webrtc/modules/audio_device/opensl/single_rw_fifo.cc', # Because of name clash with #define FF
'trunk/webrtc/modules/audio_device/win/audio_device_core_win.cc', # Because of ordering assumptions in strsafe.h
'trunk/webrtc/modules/audio_processing/aec/aec_core.c', # Because of name clash in the ComfortNoise function
'trunk/webrtc/modules/audio_processing/aecm/aecm_core.c', # Because of name clash in the ComfortNoise function
@@ -66,9 +61,7 @@ if CONFIG['MOZ_WEBRTC_SIGNALING']:
'signaling/src/jsep/JsepSessionImpl.cpp',
'signaling/src/media-conduit/AudioConduit.cpp',
'signaling/src/media-conduit/CodecStatistics.cpp',
'signaling/src/media-conduit/MediaCodecVideoCodec.cpp',
'signaling/src/media-conduit/VideoConduit.cpp',
'signaling/src/media-conduit/WebrtcMediaCodecVP8VideoCodec.cpp',
'signaling/src/mediapipeline/MediaPipeline.cpp',
'signaling/src/mediapipeline/MediaPipelineFilter.cpp',
'signaling/src/mediapipeline/SrtpFlow.cpp',
@@ -116,7 +109,6 @@ if CONFIG['MOZ_WEBRTC_SIGNALING']:
GYP_DIRS['signalingtest'].variables = gyp_vars.copy()
GYP_DIRS['signalingtest'].variables.update(
build_for_test=1,
moz_webrtc_mediacodec=0,
build_for_standalone=0
)
GYP_DIRS['signalingtest'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
+2 -44
View File
@@ -219,41 +219,6 @@
'../../../netwerk/srtp/src/crypto/include',
],
}],
['moz_webrtc_omx==1', {
'sources': [
'./src/media-conduit/WebrtcOMXH264VideoCodec.cpp',
'./src/media-conduit/OMXVideoCodec.cpp',
],
'include_dirs': [
# hack on hack to re-add it after SrtpFlow removes it
'../../../dom/media/omx',
'../../../gfx/layers/client',
],
'cflags_mozilla': [
'-I$(ANDROID_SOURCE)/frameworks/av/include/media/stagefright',
'-I$(ANDROID_SOURCE)/frameworks/av/include',
'-I$(ANDROID_SOURCE)/frameworks/native/include/media/openmax',
'-I$(ANDROID_SOURCE)/frameworks/native/include',
'-I$(ANDROID_SOURCE)/frameworks/native/opengl/include',
],
'defines' : [
'MOZ_WEBRTC_OMX'
],
}],
['moz_webrtc_mediacodec==1', {
'include_dirs': [
'../../../widget/android',
],
'sources': [
'./src/media-conduit/MediaCodecVideoCodec.h',
'./src/media-conduit/WebrtcMediaCodecVP8VideoCodec.h',
'./src/media-conduit/MediaCodecVideoCodec.cpp',
'./src/media-conduit/WebrtcMediaCodecVP8VideoCodec.cpp',
],
'defines' : [
'MOZ_WEBRTC_MEDIACODEC',
],
}],
['(build_for_test==0) and (build_for_standalone==0)', {
'defines' : [
'MOZILLA_INTERNAL_API',
@@ -294,7 +259,7 @@
'USE_FAKE_PCOBSERVER',
],
}],
['(OS=="linux") or (OS=="android")', {
['OS=="linux"', {
'include_dirs': [
],
@@ -311,13 +276,6 @@
'cflags_mozilla': [
],
}],
['OS=="android"', {
'cflags_mozilla': [
# This warning complains about important MOZ_EXPORT attributes
# on forward declarations for Android API types.
'-Wno-error=attributes',
],
}],
['OS=="win"', {
'include_dirs': [
],
@@ -348,7 +306,7 @@
'cflags_mozilla': [
],
}],
['OS=="mac" or OS=="ios"', {
['OS=="mac"', {
'include_dirs': [
],
'defines': [
@@ -26,12 +26,7 @@ using mozilla::LogLevel;
static int gWebRtcTraceLoggingOn = 0;
#if defined(ANDROID)
static const char *default_tmp_dir = "/dev/null";
static const char *default_log_name = "nspr";
#else // Assume a POSIX environment
NS_NAMED_LITERAL_CSTRING(default_log_name, "WebRTC.log");
#endif
static PRLogModuleInfo* GetWebRtcTraceLog()
{
@@ -110,11 +105,6 @@ void ConfigWebRtcLog(uint32_t trace_mask, nsCString &aLogFile, nsCString &aAECLo
return;
}
#if defined(ANDROID)
// Special case: use callback to pipe to NSPR logging.
aLogFile.Assign(default_log_name);
#else
webrtc::Trace::set_level_filter(trace_mask);
if (trace_mask != 0) {
@@ -133,7 +123,6 @@ void ConfigWebRtcLog(uint32_t trace_mask, nsCString &aLogFile, nsCString &aAECLo
tempDir->GetNativePath(aLogFile);
}
}
#endif
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
if (XRE_IsParentProcess()) {
@@ -208,12 +197,6 @@ void ConfigAecLog(nsCString &aAECLogDir) {
if (webrtc::Trace::aec_debug()) {
return;
}
#if defined(ANDROID)
// For AEC, do not use a default value: force the user to specify a directory.
if (aAECLogDir.IsEmpty()) {
aAECLogDir.Assign(default_tmp_dir);
}
#else
if (aAECLogDir.IsEmpty()) {
nsCOMPtr<nsIFile> tempDir;
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempDir));
@@ -223,7 +206,6 @@ void ConfigAecLog(nsCString &aAECLogDir) {
}
}
}
#endif
webrtc::Trace::set_aec_debug_filename(aAECLogDir.get());
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
if (XRE_IsParentProcess()) {
@@ -2114,12 +2114,7 @@ JsepSessionImpl::SetupDefaultCodecs()
48000,
2,
960,
#ifdef WEBRTC_GONK
// TODO Move this elsewhere to be adaptive to rate - Bug 1207925
16000 // B2G uses lower capture sampling rate
#else
40000
#endif
));
mSupportedCodecs.values.push_back(new JsepAudioCodecDescription(
@@ -1,31 +0,0 @@
/* 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/. */
#include "CSFLog.h"
#include "nspr.h"
#include "WebrtcMediaCodecVP8VideoCodec.h"
#include "MediaCodecVideoCodec.h"
namespace mozilla {
static const char* logTag ="MediaCodecVideoCodec";
VideoEncoder* MediaCodecVideoCodec::CreateEncoder(CodecType aCodecType) {
CSFLogDebug(logTag, "%s ", __FUNCTION__);
if (aCodecType == CODEC_VP8) {
return new WebrtcMediaCodecVP8VideoEncoder();
}
return nullptr;
}
VideoDecoder* MediaCodecVideoCodec::CreateDecoder(CodecType aCodecType) {
CSFLogDebug(logTag, "%s ", __FUNCTION__);
if (aCodecType == CODEC_VP8) {
return new WebrtcMediaCodecVP8VideoDecoder();
}
return nullptr;
}
}
@@ -1,31 +0,0 @@
/* 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/. */
#ifndef MediaCodecVideoCodec_h__
#define MediaCodecVideoCodec_h__
#include "MediaConduitInterface.h"
namespace mozilla {
class MediaCodecVideoCodec {
public:
enum CodecType {
CODEC_VP8,
};
/**
* Create encoder object for codec type |aCodecType|. Return |nullptr| when
* failed.
*/
static VideoEncoder* CreateEncoder(CodecType aCodecType);
/**
* Create decoder object for codec type |aCodecType|. Return |nullptr| when
* failed.
*/
static VideoDecoder* CreateDecoder(CodecType aCodecType);
};
}
#endif // MediaCodecVideoCodec_h__
@@ -1,30 +0,0 @@
/* 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/. */
#include "OMXVideoCodec.h"
#ifdef WEBRTC_GONK
#include "WebrtcOMXH264VideoCodec.h"
#endif
namespace mozilla {
VideoEncoder*
OMXVideoCodec::CreateEncoder(CodecType aCodecType)
{
if (aCodecType == CODEC_H264) {
return new WebrtcOMXH264VideoEncoder();
}
return nullptr;
}
VideoDecoder*
OMXVideoCodec::CreateDecoder(CodecType aCodecType) {
if (aCodecType == CODEC_H264) {
return new WebrtcOMXH264VideoDecoder();
}
return nullptr;
}
}
@@ -1,32 +0,0 @@
/* 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/. */
#ifndef OMX_VIDEO_CODEC_H_
#define OMX_VIDEO_CODEC_H_
#include "MediaConduitInterface.h"
namespace mozilla {
class OMXVideoCodec {
public:
enum CodecType {
CODEC_H264,
};
/**
* Create encoder object for codec type |aCodecType|. Return |nullptr| when
* failed.
*/
static VideoEncoder* CreateEncoder(CodecType aCodecType);
/**
* Create decoder object for codec type |aCodecType|. Return |nullptr| when
* failed.
*/
static VideoDecoder* CreateDecoder(CodecType aCodecType);
};
}
#endif // OMX_VIDEO_CODEC_H_
@@ -679,15 +679,7 @@ WebrtcVideoConduit::ConfigureSendMediaCodec(const VideoCodecConfig* codecConfig)
// width/height will be overridden on the first frame
video_codec.width = 320;
video_codec.height = 240;
#ifdef MOZ_WEBRTC_OMX
if (codecConfig->mType == webrtc::kVideoCodecH264) {
video_codec.resolution_divisor = 16;
} else {
video_codec.resolution_divisor = 1; // We could try using it to handle odd resolutions
}
#else
video_codec.resolution_divisor = 1; // We could try using it to handle odd resolutions
#endif
video_codec.qpMax = 56;
video_codec.numberOfSimulcastStreams = 1;
video_codec.simulcastStream[0].jsScaleDownBy =
@@ -1896,8 +1888,6 @@ WebrtcVideoConduit::DeliverI420Frame(const webrtc::I420VideoFrame& webrtc_frame)
}
#if 0
//#ifndef MOZ_WEBRTC_OMX
// XXX - this may not be possible on GONK with textures!
if (mVideoLatencyTestEnable && mReceivingWidth && mReceivingHeight) {
uint64_t now = PR_Now();
uint64_t timestamp = 0;
@@ -1967,9 +1957,6 @@ WebrtcVideoConduit::CodecConfigToWebRTCCodec(const VideoCodecConfig* codecInfo,
if (cinst.codecType == webrtc::kVideoCodecH264)
{
#ifdef MOZ_WEBRTC_OMX
cinst.resolution_divisor = 16;
#endif
// cinst.codecSpecific.H264.profile = ?
cinst.codecSpecific.H264.profile_byte = codecInfo->mProfile;
cinst.codecSpecific.H264.constraints = codecInfo->mConstraints;
@@ -248,15 +248,9 @@ public:
/**
* Does DeliverFrame() support a null buffer and non-null handle
* (video texture)?
* B2G support it (when using HW video decoder with graphic buffer output).
* XXX Investigate! Especially for Android
*/
virtual bool IsTextureSupported() override {
#ifdef WEBRTC_GONK
return true;
#else
return false;
#endif
}
virtual uint64_t CodecPluginID() override;
File diff suppressed because it is too large. Load diff
@@ -1,114 +0,0 @@
/* 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/. */
#ifndef WebrtcMediaCodecVP8VideoCodec_h__
#define WebrtcMediaCodecVP8VideoCodec_h__
#include "mozilla/Mutex.h"
#include "nsThreadUtils.h"
#include "nsAutoPtr.h"
#include "MediaConduitInterface.h"
#include "AudioConduit.h"
#include "VideoConduit.h"
namespace mozilla {
struct EncodedFrame {
uint32_t width_;
uint32_t height_;
uint32_t timeStamp_;
uint64_t decode_timestamp_;
};
class WebrtcAndroidMediaCodec;
class WebrtcMediaCodecVP8VideoEncoder : public WebrtcVideoEncoder {
public:
WebrtcMediaCodecVP8VideoEncoder();
virtual ~WebrtcMediaCodecVP8VideoEncoder() override;
// Implement VideoEncoder interface.
virtual uint64_t PluginID() const override { return 0; }
virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings,
int32_t numberOfCores,
size_t maxPayloadSize) override;
virtual int32_t Encode(const webrtc::I420VideoFrame& inputImage,
const webrtc::CodecSpecificInfo* codecSpecificInfo,
const std::vector<webrtc::VideoFrameType>* frame_types) override;
virtual int32_t RegisterEncodeCompleteCallback(webrtc::EncodedImageCallback* callback) override;
virtual int32_t Release() override;
virtual int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override;
virtual int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override;
private:
int32_t VerifyAndAllocate(const uint32_t minimumSize);
bool ResetInputBuffers();
bool ResetOutputBuffers();
size_t mMaxPayloadSize;
uint32_t mTimestamp;
webrtc::EncodedImage mEncodedImage;
webrtc::EncodedImageCallback* mCallback;
uint32_t mFrameWidth;
uint32_t mFrameHeight;
WebrtcAndroidMediaCodec* mMediaCodecEncoder;
jobjectArray mInputBuffers;
jobjectArray mOutputBuffers;
};
class WebrtcMediaCodecVP8VideoDecoder : public WebrtcVideoDecoder {
public:
WebrtcMediaCodecVP8VideoDecoder();
virtual ~WebrtcMediaCodecVP8VideoDecoder() override;
// Implement VideoDecoder interface.
virtual uint64_t PluginID() const override { return 0; }
virtual int32_t InitDecode(const webrtc::VideoCodec* codecSettings,
int32_t numberOfCores) override;
virtual int32_t Decode(const webrtc::EncodedImage& inputImage,
bool missingFrames,
const webrtc::RTPFragmentationHeader* fragmentation,
const webrtc::CodecSpecificInfo*
codecSpecificInfo = NULL,
int64_t renderTimeMs = -1) override;
virtual int32_t RegisterDecodeCompleteCallback(webrtc::DecodedImageCallback* callback) override;
virtual int32_t Release() override;
virtual int32_t Reset() override;
private:
void DecodeFrame(EncodedFrame* frame);
void RunCallback();
bool ResetInputBuffers();
bool ResetOutputBuffers();
webrtc::DecodedImageCallback* mCallback;
uint32_t mFrameWidth;
uint32_t mFrameHeight;
WebrtcAndroidMediaCodec* mMediaCodecDecoder;
jobjectArray mInputBuffers;
jobjectArray mOutputBuffers;
};
}
#endif // WebrtcMediaCodecVP8VideoCodec_h__
File diff suppressed because it is too large. Load diff
@@ -1,108 +0,0 @@
/* 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/. */
#ifndef WEBRTC_GONK
#pragma error WebrtcOMXH264VideoCodec works only on B2G.
#endif
#ifndef WEBRTC_OMX_H264_CODEC_H_
#define WEBRTC_OMX_H264_CODEC_H_
#include "AudioConduit.h"
#include "VideoConduit.h"
#include <foundation/ABase.h>
#include <utils/RefBase.h>
#include "OMXCodecWrapper.h"
namespace android {
class OMXVideoEncoder;
}
namespace mozilla {
class WebrtcOMXDecoder;
class OMXOutputDrain;
// XXX see if we can reduce this
#define WEBRTC_OMX_H264_MIN_DECODE_BUFFERS 10
#define OMX_IDR_NEEDED_FOR_BITRATE 0
class WebrtcOMXH264VideoEncoder : public WebrtcVideoEncoder
{
public:
WebrtcOMXH264VideoEncoder();
virtual ~WebrtcOMXH264VideoEncoder();
// Implement VideoEncoder interface.
virtual uint64_t PluginID() const override { return 0; }
virtual int32_t InitEncode(const webrtc::VideoCodec* aCodecSettings,
int32_t aNumOfCores,
size_t aMaxPayloadSize) override;
virtual int32_t Encode(const webrtc::I420VideoFrame& aInputImage,
const webrtc::CodecSpecificInfo* aCodecSpecificInfo,
const std::vector<webrtc::VideoFrameType>* aFrameTypes) override;
virtual int32_t RegisterEncodeCompleteCallback(webrtc::EncodedImageCallback* aCallback) override;
virtual int32_t Release() override;
virtual int32_t SetChannelParameters(uint32_t aPacketLossRate,
int64_t aRoundTripTimeMs) override;
virtual int32_t SetRates(uint32_t aBitRate, uint32_t aFrameRate) override;
private:
nsAutoPtr<android::OMXVideoEncoder> mOMX;
android::sp<android::OMXCodecReservation> mReservation;
webrtc::EncodedImageCallback* mCallback;
RefPtr<OMXOutputDrain> mOutputDrain;
uint32_t mWidth;
uint32_t mHeight;
uint32_t mFrameRate;
uint32_t mBitRateKbps;
#ifdef OMX_IDR_NEEDED_FOR_BITRATE
uint32_t mBitRateAtLastIDR;
TimeStamp mLastIDRTime;
#endif
bool mOMXConfigured;
bool mOMXReconfigure;
webrtc::EncodedImage mEncodedImage;
};
class WebrtcOMXH264VideoDecoder : public WebrtcVideoDecoder
{
public:
WebrtcOMXH264VideoDecoder();
virtual ~WebrtcOMXH264VideoDecoder();
// Implement VideoDecoder interface.
virtual uint64_t PluginID() const override { return 0; }
virtual int32_t InitDecode(const webrtc::VideoCodec* aCodecSettings,
int32_t aNumOfCores) override;
virtual int32_t Decode(const webrtc::EncodedImage& aInputImage,
bool aMissingFrames,
const webrtc::RTPFragmentationHeader* aFragmentation,
const webrtc::CodecSpecificInfo* aCodecSpecificInfo = nullptr,
int64_t aRenderTimeMs = -1) override;
virtual int32_t RegisterDecodeCompleteCallback(webrtc::DecodedImageCallback* callback) override;
virtual int32_t Release() override;
virtual int32_t Reset() override;
private:
webrtc::DecodedImageCallback* mCallback;
RefPtr<WebrtcOMXDecoder> mOMX;
android::sp<android::OMXCodecReservation> mReservation;
};
}
#endif // WEBRTC_OMX_H264_CODEC_H_
@@ -28,10 +28,6 @@
#include "MediaStreamVideoSink.h"
#include "VideoUtils.h"
#include "VideoStreamTrack.h"
#ifdef WEBRTC_GONK
#include "GrallocImages.h"
#include "mozilla/layers/GrallocTextureClient.h"
#endif
#endif
#include "nsError.h"
@@ -285,72 +281,6 @@ protected:
}
ImageFormat format = aImage->GetFormat();
#ifdef WEBRTC_GONK
GrallocImage* nativeImage = aImage->AsGrallocImage();
if (nativeImage) {
android::sp<android::GraphicBuffer> graphicBuffer = nativeImage->GetGraphicBuffer();
int pixelFormat = graphicBuffer->getPixelFormat(); /* PixelFormat is an enum == int */
mozilla::VideoType destFormat;
switch (pixelFormat) {
case HAL_PIXEL_FORMAT_YV12:
// all android must support this
destFormat = mozilla::kVideoYV12;
break;
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP:
destFormat = mozilla::kVideoNV21;
break;
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_P:
destFormat = mozilla::kVideoI420;
break;
default:
// XXX Bug NNNNNNN
// use http://dxr.mozilla.org/mozilla-central/source/content/media/omx/I420ColorConverterHelper.cpp
// to convert unknown types (OEM-specific) to I420
MOZ_MTLOG(ML_ERROR, "Un-handled GRALLOC buffer type:" << pixelFormat);
MOZ_CRASH();
}
void *basePtr;
graphicBuffer->lock(android::GraphicBuffer::USAGE_SW_READ_MASK, &basePtr);
uint32_t width = graphicBuffer->getWidth();
uint32_t height = graphicBuffer->getHeight();
// XXX gralloc buffer's width and stride could be different depends on implementations.
if (destFormat != mozilla::kVideoI420) {
unsigned char *video_frame = static_cast<unsigned char*>(basePtr);
webrtc::I420VideoFrame i420_frame;
int stride_y = width;
int stride_uv = (width + 1) / 2;
int target_width = width;
int target_height = height;
if (i420_frame.CreateEmptyFrame(target_width,
abs(target_height),
stride_y,
stride_uv, stride_uv) < 0) {
MOZ_ASSERT(false, "Can't allocate empty i420frame");
return;
}
webrtc::VideoType commonVideoType =
webrtc::RawVideoTypeToCommonVideoVideoType(
static_cast<webrtc::RawVideoType>((int)destFormat));
if (ConvertToI420(commonVideoType, video_frame, 0, 0, width, height,
I420SIZE(width, height), webrtc::kVideoRotation_0,
&i420_frame)) {
MOZ_ASSERT(false, "Can't convert video type for sending to I420");
return;
}
i420_frame.set_ntp_time_ms(0);
VideoFrameConverted(i420_frame);
} else {
VideoFrameConverted(static_cast<unsigned char*>(basePtr),
I420SIZE(width, height),
width,
height,
destFormat, 0);
}
graphicBuffer->unlock();
return;
} else
#endif
if (format == ImageFormat::PLANAR_YCBCR) {
// Cast away constness b/c some of the accessors are non-const
PlanarYCbCrImage* yuv = const_cast<PlanarYCbCrImage *>(
@@ -2198,13 +2128,6 @@ public:
image_ = yuvImage;
}
#ifdef WEBRTC_GONK
else {
// Decoder produced video frame that can be appended to the track directly.
MOZ_ASSERT(video_image);
image_ = video_image;
}
#endif // WEBRTC_GONK
#endif // MOZILLA_INTERNAL_API
}
@@ -3,8 +3,6 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "logging.h"
#include "nsIGfxInfo.h"
#include "nsServiceManagerUtils.h"
#include "PeerConnectionImpl.h"
#include "PeerConnectionMedia.h"
@@ -28,18 +26,6 @@
#endif
#include "GmpVideoCodec.h"
#ifdef MOZ_WEBRTC_OMX
#include "OMXVideoCodec.h"
#include "OMXCodecWrapper.h"
#endif
#ifdef MOZ_WEBRTC_MEDIACODEC
#include "MediaCodecVideoCodec.h"
#endif
#ifdef MOZILLA_INTERNAL_API
#include "mozilla/Preferences.h"
#endif
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
#include "WebrtcGmpVideoCodec.h"
@@ -979,60 +965,7 @@ MediaPipelineFactory::EnsureExternalCodec(VideoSessionConduit& aConduit,
bool aIsSend)
{
if (aConfig->mName == "VP8") {
#ifdef MOZ_WEBRTC_MEDIACODEC
if (aIsSend) {
#ifdef MOZILLA_INTERNAL_API
bool enabled = mozilla::Preferences::GetBool("media.navigator.hardware.vp8_encode.acceleration_enabled", false);
#else
bool enabled = false;
#endif
if (enabled) {
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
if (gfxInfo) {
int32_t status;
nsCString discardFailureId;
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBRTC_HW_ACCELERATION_ENCODE, discardFailureId, &status))) {
if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
NS_WARNING("VP8 encoder hardware is not whitelisted: disabling.\n");
} else {
VideoEncoder* encoder = nullptr;
encoder = MediaCodecVideoCodec::CreateEncoder(MediaCodecVideoCodec::CodecType::CODEC_VP8);
if (encoder) {
return aConduit.SetExternalSendCodec(aConfig, encoder);
}
return kMediaConduitNoError;
}
}
}
}
} else {
#ifdef MOZILLA_INTERNAL_API
bool enabled = mozilla::Preferences::GetBool("media.navigator.hardware.vp8_decode.acceleration_enabled", false);
#else
bool enabled = false;
#endif
if (enabled) {
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
if (gfxInfo) {
int32_t status;
nsCString discardFailureId;
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBRTC_HW_ACCELERATION_DECODE, discardFailureId, &status))) {
if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
NS_WARNING("VP8 decoder hardware is not whitelisted: disabling.\n");
} else {
VideoDecoder* decoder;
decoder = MediaCodecVideoCodec::CreateDecoder(MediaCodecVideoCodec::CodecType::CODEC_VP8);
if (decoder) {
return aConduit.SetExternalRecvCodec(aConfig, decoder);
}
return kMediaConduitNoError;
}
}
}
}
}
#endif
return kMediaConduitNoError;
return kMediaConduitNoError;
}
if (aConfig->mName == "VP9") {
return kMediaConduitNoError;
@@ -1043,25 +976,13 @@ MediaPipelineFactory::EnsureExternalCodec(VideoSessionConduit& aConduit,
}
// Register H.264 codec.
if (aIsSend) {
VideoEncoder* encoder = nullptr;
#ifdef MOZ_WEBRTC_OMX
encoder =
OMXVideoCodec::CreateEncoder(OMXVideoCodec::CodecType::CODEC_H264);
#else
encoder = GmpVideoCodec::CreateEncoder();
#endif
VideoEncoder* encoder = GmpVideoCodec::CreateEncoder();
if (encoder) {
return aConduit.SetExternalSendCodec(aConfig, encoder);
}
return kMediaConduitInvalidSendCodec;
}
VideoDecoder* decoder = nullptr;
#ifdef MOZ_WEBRTC_OMX
decoder =
OMXVideoCodec::CreateDecoder(OMXVideoCodec::CodecType::CODEC_H264);
#else
decoder = GmpVideoCodec::CreateDecoder();
#endif
VideoDecoder* decoder = GmpVideoCodec::CreateDecoder();
if (decoder) {
return aConduit.SetExternalRecvCodec(aConfig, decoder);
}
@@ -127,11 +127,6 @@
#endif
#include "mozilla/dom/PeerConnectionObserverEnumsBinding.h"
#ifdef MOZ_WEBRTC_OMX
#include "OMXVideoCodec.h"
#include "OMXCodecWrapper.h"
#endif
#define ICE_PARSING "In RTCConfiguration passed to RTCPeerConnection constructor"
using namespace mozilla;
@@ -921,34 +916,6 @@ class ConfigureCodec {
mRedUlpfecEnabled(false),
mDtmfEnabled(false)
{
#ifdef MOZ_WEBRTC_OMX
// Check to see if what HW codecs are available (not in use) at this moment.
// Note that streaming video decode can reserve a decoder
// XXX See bug 1018791 Implement W3 codec reservation policy
// Note that currently, OMXCodecReservation needs to be held by an sp<> because it puts
// 'this' into an sp<EventListener> to talk to the resource reservation code
// This pref is a misnomer; it is solely for h264 _hardware_ support.
branch->GetBoolPref("media.peerconnection.video.h264_enabled",
&mHardwareH264Enabled);
if (mHardwareH264Enabled) {
// Ok, it is preffed on. Can we actually do it?
android::sp<android::OMXCodecReservation> encode = new android::OMXCodecReservation(true);
android::sp<android::OMXCodecReservation> decode = new android::OMXCodecReservation(false);
// Currently we just check if they're available right now, which will fail if we're
// trying to call ourself, for example. It will work for most real-world cases, like
// if we try to add a person to a 2-way call to make a 3-way mesh call
if (encode->ReserveOMXCodec() && decode->ReserveOMXCodec()) {
CSFLogDebug( logTag, "%s: H264 hardware codec available", __FUNCTION__);
mHardwareH264Supported = true;
}
}
#endif // MOZ_WEBRTC_OMX
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
mSoftwareH264Enabled = PeerConnectionCtx::GetInstance()->gmpHasH264();
#else
@@ -963,11 +930,6 @@ class ConfigureCodec {
branch->GetIntPref("media.navigator.video.h264.max_br", &mH264MaxBr);
#ifdef MOZ_WEBRTC_OMX
// Level 1.2; but let's allow CIF@30 or QVGA@30+ by default
mH264MaxMbps = 11880;
#endif
branch->GetIntPref("media.navigator.video.h264.max_mbps", &mH264MaxMbps);
branch->GetBoolPref("media.peerconnection.video.vp9_enabled",
@@ -670,7 +670,6 @@ typedef struct sdp_fmtp {
uint16_t par_height;
/* PAR=12:11 implies par_width=12, par_height=11 */
/* CPCF should be a float. IOS does not support float and so it is uint16_t */
/* For portable stack, CPCF should be defined as float and the parsing should
* be modified accordingly */
uint16_t cpcf;
+1 -6
View File
@@ -3,7 +3,7 @@
# 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/.
if CONFIG['OS_TARGET'] in ('Darwin', 'Android'):
if CONFIG['OS_TARGET'] == 'Darwin':
DEFINES['GTEST_USE_OWN_TR1_TUPLE'] = 1
for var in ('MOZILLA_EXTERNAL_LINKAGE', 'USE_FAKE_MEDIA_STREAMS', 'USE_FAKE_PCOBSERVER',
@@ -42,11 +42,6 @@ LOCAL_INCLUDES += [
'/xpcom/base',
]
if CONFIG['OS_TARGET'] == 'Android':
LOCAL_INCLUDES += [
'/media/mtransport/third_party/nrappkit/src/port/android/include',
]
if CONFIG['OS_TARGET'] == 'Linux':
LOCAL_INCLUDES += [
'/media/mtransport/third_party/nrappkit/src/port/linux/include',
-1
View File
@@ -3,7 +3,6 @@
# 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/.
# TODO: bug 1172551 - get these tests working on iOS
if CONFIG['OS_TARGET'] != 'WINNT' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'uikit':
GeckoCppUnitTests([
'jsep_session_unittest',
+1 -3
View File
@@ -30,8 +30,7 @@ deps_os = {
# Define rules for which include paths are allowed in our source.
include_rules = [
# Base is only used to build Android APK tests and may not be referenced by
# WebRTC production code.
# Base may not be referenced by WebRTC production code.
'-base',
'-chromium',
'+gflags',
@@ -100,4 +99,3 @@ hooks = [
Var('extra_gyp_flag')],
},
]
+1 -1
View File
@@ -770,7 +770,7 @@ endif
quiet_cmd_regen_makefile = ACTION Regenerating $@
cmd_regen_makefile = ./build/gyp_chromium -fmake --ignore-environment "--toplevel-dir=." -I/home/jesup/src/mozilla/webrtc_import7/webrtc_update/trunk/build/common.gypi -I/home/jesup/src/mozilla/webrtc_import7/webrtc_update/trunk/supplement/supplement.gypi "--depth=." peerconnection_all.gyp
Makefile: third_party/webrtc/build/common.gypi third_party/webrtc/common_video/common_video.gyp third_party/webrtc/video_engine/video_engine.gyp third_party/webrtc/modules/audio_coding/neteq/neteq.gypi third_party/libvpx/libvpx_srcs_arm.gypi build/filename_rules.gypi third_party/webrtc/modules/media_file/source/media_file.gypi third_party/jsoncpp/jsoncpp.gyp base/base.gyp third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_tests.gypi third_party/webrtc/modules/audio_processing/audio_processing.gypi third_party/webrtc/modules/video_processing/main/source/video_processing.gypi third_party/webrtc/system_wrappers/source/system_wrappers.gyp supplement/supplement.gypi third_party/webrtc/modules/audio_coding/codecs/ilbc/ilbc.gypi third_party/webrtc/modules/utility/source/utility.gypi third_party/webrtc/voice_engine/test/voice_engine_tests.gypi build/internal/release_impl.gypi third_party/webrtc/modules/audio_coding/codecs/isac/isacfix_test.gypi third_party/yasm/yasm_compile.gypi net/net.gyp third_party/webrtc/modules/audio_coding/codecs/isac/isac_test.gypi third_party/webrtc/modules/audio_coding/codecs/cng/cng.gypi third_party/libvpx/libvpx_srcs_x86_64.gypi third_party/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.gypi third_party/webrtc/modules/audio_device/audio_device.gypi third_party/libjingle/libjingle.gyp build/internal/release_impl_official.gypi build/internal/release_defaults.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp.gypi third_party/webrtc/modules/video_render/main/source/video_render.gypi third_party/libjpeg_turbo/libjpeg.gyp third_party/webrtc/modules/rtp_rtcp/test/testAPI/test_api.gypi third_party/webrtc/modules/udp_transport/source/udp_transport.gypi third_party/libvpx/libvpx_srcs_arm_neon.gypi third_party/webrtc/voice_engine/voice_engine.gyp third_party/webrtc/common_audio/resampler/resampler.gypi third_party/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer.gypi build/win_precompile.gypi third_party/expat/expat.gyp third_party/webrtc/modules/video_coding/main/source/video_coding_test.gypi third_party/yasm/yasm.gyp third_party/webrtc/modules/video_capture/main/source/video_capture.gypi third_party/webrtc/video_engine/test/libvietest/libvietest.gypi third_party/webrtc/modules/video_coding/codecs/vp8/vp8.gyp third_party/webrtc/modules/bitrate_controller/bitrate_controller.gypi third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.gypi build/ios/mac_build.gypi third_party/webrtc/modules/video_coding/main/source/video_coding.gypi third_party/webrtc/modules/audio_coding/main/source/audio_coding_module.gypi build/release.gypi peerconnection.gyp build/common.gypi third_party/webrtc/video_engine/video_engine_core.gypi third_party/webrtc/build/arm_neon.gypi third_party/libvpx/libvpx.gyp third_party/webrtc/common_audio/common_audio.gyp third_party/libyuv/libyuv.gyp third_party/webrtc/modules/audio_coding/codecs/isac/main/source/isac.gypi third_party/webrtc/modules/video_processing/main/test/vpm_tests.gypi third_party/webrtc/voice_engine/voice_engine_core.gypi third_party/webrtc/modules/rtp_rtcp/test/testFec/test_fec.gypi third_party/webrtc/modules/video_coding/codecs/tools/video_codecs_tools.gypi third_party/libsrtp/libsrtp.gyp peerconnection_all.gyp third_party/webrtc/modules/audio_coding/codecs/g711/g711.gypi third_party/webrtc/modules/audio_processing/audio_processing_tests.gypi third_party/libvpx/libvpx_srcs_x86.gypi third_party/webrtc/modules/modules.gyp third_party/webrtc/common_audio/signal_processing/signal_processing.gypi third_party/webrtc/video_engine/test/auto_test/vie_auto_test.gypi third_party/libvpx/libvpx_srcs_mips.gypi third_party/webrtc/common_audio/vad/vad.gypi third_party/webrtc/modules/video_coding/codecs/test/video_codecs_test_framework.gypi third_party/webrtc/modules/video_coding/codecs/i420/main/source/i420.gypi third_party/webrtc/modules/audio_coding/codecs/g722/g722.gypi third_party/webrtc/modules/video_coding/codecs/test_framework/test_framework.gypi third_party/webrtc/build/protoc.gypi third_party/protobuf/protobuf.gyp
Makefile: third_party/webrtc/build/common.gypi third_party/webrtc/common_video/common_video.gyp third_party/webrtc/video_engine/video_engine.gyp third_party/webrtc/modules/audio_coding/neteq/neteq.gypi third_party/libvpx/libvpx_srcs_arm.gypi build/filename_rules.gypi third_party/webrtc/modules/media_file/source/media_file.gypi third_party/jsoncpp/jsoncpp.gyp base/base.gyp third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_tests.gypi third_party/webrtc/modules/audio_processing/audio_processing.gypi third_party/webrtc/modules/video_processing/main/source/video_processing.gypi third_party/webrtc/system_wrappers/source/system_wrappers.gyp supplement/supplement.gypi third_party/webrtc/modules/audio_coding/codecs/ilbc/ilbc.gypi third_party/webrtc/modules/utility/source/utility.gypi third_party/webrtc/voice_engine/test/voice_engine_tests.gypi build/internal/release_impl.gypi third_party/webrtc/modules/audio_coding/codecs/isac/isacfix_test.gypi third_party/yasm/yasm_compile.gypi net/net.gyp third_party/webrtc/modules/audio_coding/codecs/isac/isac_test.gypi third_party/webrtc/modules/audio_coding/codecs/cng/cng.gypi third_party/libvpx/libvpx_srcs_x86_64.gypi third_party/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.gypi third_party/webrtc/modules/audio_device/audio_device.gypi third_party/libjingle/libjingle.gyp build/internal/release_impl_official.gypi build/internal/release_defaults.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp.gypi third_party/webrtc/modules/video_render/main/source/video_render.gypi third_party/libjpeg_turbo/libjpeg.gyp third_party/webrtc/modules/rtp_rtcp/test/testAPI/test_api.gypi third_party/webrtc/modules/udp_transport/source/udp_transport.gypi third_party/libvpx/libvpx_srcs_arm_neon.gypi third_party/webrtc/voice_engine/voice_engine.gyp third_party/webrtc/common_audio/resampler/resampler.gypi third_party/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer.gypi build/win_precompile.gypi third_party/expat/expat.gyp third_party/webrtc/modules/video_coding/main/source/video_coding_test.gypi third_party/yasm/yasm.gyp third_party/webrtc/modules/video_capture/main/source/video_capture.gypi third_party/webrtc/video_engine/test/libvietest/libvietest.gypi third_party/webrtc/modules/video_coding/codecs/vp8/vp8.gyp third_party/webrtc/modules/bitrate_controller/bitrate_controller.gypi third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.gypi third_party/webrtc/modules/video_coding/main/source/video_coding.gypi third_party/webrtc/modules/audio_coding/main/source/audio_coding_module.gypi build/release.gypi peerconnection.gyp build/common.gypi third_party/webrtc/video_engine/video_engine_core.gypi third_party/webrtc/build/arm_neon.gypi third_party/libvpx/libvpx.gyp third_party/webrtc/common_audio/common_audio.gyp third_party/libyuv/libyuv.gyp third_party/webrtc/modules/audio_coding/codecs/isac/main/source/isac.gypi third_party/webrtc/modules/video_processing/main/test/vpm_tests.gypi third_party/webrtc/voice_engine/voice_engine_core.gypi third_party/webrtc/modules/rtp_rtcp/test/testFec/test_fec.gypi third_party/webrtc/modules/video_coding/codecs/tools/video_codecs_tools.gypi third_party/libsrtp/libsrtp.gyp peerconnection_all.gyp third_party/webrtc/modules/audio_coding/codecs/g711/g711.gypi third_party/webrtc/modules/audio_processing/audio_processing_tests.gypi third_party/libvpx/libvpx_srcs_x86.gypi third_party/webrtc/modules/modules.gyp third_party/webrtc/common_audio/signal_processing/signal_processing.gypi third_party/webrtc/video_engine/test/auto_test/vie_auto_test.gypi third_party/libvpx/libvpx_srcs_mips.gypi third_party/webrtc/common_audio/vad/vad.gypi third_party/webrtc/modules/video_coding/codecs/test/video_codecs_test_framework.gypi third_party/webrtc/modules/video_coding/codecs/i420/main/source/i420.gypi third_party/webrtc/modules/audio_coding/codecs/g722/g722.gypi third_party/webrtc/modules/video_coding/codecs/test_framework/test_framework.gypi third_party/webrtc/build/protoc.gypi third_party/protobuf/protobuf.gyp
$(call do_cmd,regen_makefile)
# "all" is a concatenation of the "all" targets from all the included
+6 -22
View File
@@ -28,7 +28,7 @@
'temp_gyp/googleurl.gyp:*',
],
'conditions': [
['OS!="ios"', {
['1==1', {
'dependencies': [
'../cc/cc_tests.gyp:*',
'../chrome/chrome.gyp:*',
@@ -64,17 +64,17 @@
'<(libjpeg_gyp_path):*',
],
}],
['os_posix==1 and OS!="android" and OS!="ios"', {
['os_posix==1', {
'dependencies': [
'../third_party/yasm/yasm.gyp:*#host',
],
}],
['OS=="mac" or OS=="ios" or OS=="win"', {
['OS=="mac" or OS=="win"', {
'dependencies': [
'../third_party/nss/nss.gyp:*',
],
}],
['OS=="win" or OS=="ios" or OS=="linux"', {
['OS=="win" or OS=="linux"', {
'dependencies': [
'../breakpad/breakpad.gyp:*',
],
@@ -184,7 +184,7 @@
'temp_gyp/googleurl.gyp:googleurl_unittests',
],
'conditions': [
['OS!="ios"', {
['1==1', {
'dependencies': [
'../cc/cc_tests.gyp:cc_unittests',
'../chrome/chrome.gyp:browser_tests',
@@ -246,16 +246,8 @@
}, # target_name: chromium_2010_builder_tests
],
'conditions': [
['OS!="ios"', {
['1==1', {
'targets': [
{
'target_name': 'chromium_builder_nacl_win_integration',
'type': 'none',
'dependencies': [
'chromium_builder_qa', # needed for pyauto
'chromium_builder_tests',
],
}, # target_name: chromium_builder_nacl_win_integration
{
'target_name': 'chromium_builder_perf',
'type': 'none',
@@ -576,14 +568,6 @@
'../webkit/webkit.gyp:pull_in_DumpRenderTree',
],
},
{
'target_name': 'chromium_builder_qa_nacl_win64',
'type': 'none',
'dependencies': [
'chromium_builder_qa', # needed for pyauto
'../chrome/chrome.gyp:chrome_nacl_win64',
],
}, # target_name: chromium_builder_qa_nacl_win64
], # targets
'conditions': [
['branding=="Chrome"', {
-115
View File
@@ -1,115 +0,0 @@
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This is all.gyp file for Android to prevent breakage in Android and other
# platform; It will be churning a lot in the short term and eventually be merged
# into all.gyp.
{
'variables': {
# A hook that can be overridden in other repositories to add additional
# compilation targets to 'All'
'android_app_targets%': [],
},
'targets': [
{
'target_name': 'All',
'type': 'none',
'dependencies': [
'../content/content.gyp:content_shell_apk',
'<@(android_app_targets)',
'android_builder_tests',
'../android_webview/android_webview.gyp:android_webview_apk',
'../chrome/chrome.gyp:chromium_testshell',
],
}, # target_name: All
{
# The current list of tests for android. This is temporary
# until the full set supported. If adding a new test here,
# please also add it to build/android/run_tests.py, else the
# test is not run.
#
# WARNING:
# Do not add targets here without communicating the implications
# on tryserver triggers and load. Discuss with jrg please.
'target_name': 'android_builder_tests',
'type': 'none',
'dependencies': [
'../base/android/jni_generator/jni_generator.gyp:jni_generator_tests',
'../base/base.gyp:base_unittests',
'../cc/cc_tests.gyp:cc_unittests',
'../chrome/chrome.gyp:unit_tests',
'../content/content.gyp:content_shell_test_apk',
'../content/content.gyp:content_unittests',
'../gpu/gpu.gyp:gpu_unittests',
'../ipc/ipc.gyp:ipc_tests',
'../media/media.gyp:media_unittests',
'../net/net.gyp:net_unittests',
'../sql/sql.gyp:sql_unittests',
'../sync/sync.gyp:sync_unit_tests',
'../third_party/WebKit/Source/WebKit/chromium/All.gyp:*',
'../tools/android/device_stats_monitor/device_stats_monitor.gyp:device_stats_monitor',
'../tools/android/fake_dns/fake_dns.gyp:fake_dns',
'../tools/android/forwarder2/forwarder.gyp:forwarder2',
'../tools/android/md5sum/md5sum.gyp:md5sum',
'../ui/ui.gyp:ui_unittests',
# From here down: not added to run_tests.py yet.
'../jingle/jingle.gyp:jingle_unittests',
# Required by ui_unittests.
# TODO(wangxianzhu): It'd better let ui_unittests depend on it, but
# this would cause circular gyp dependency which needs refactoring the
# gyps to resolve.
'../chrome/chrome_resources.gyp:packed_resources',
],
'conditions': [
['linux_breakpad==1', {
'dependencies': [
'../breakpad/breakpad.gyp:breakpad_unittests',
],
}],
['"<(gtest_target_type)"=="shared_library"', {
'dependencies': [
# The first item is simply the template. We add as a dep
# to make sure it builds in ungenerated form. TODO(jrg):
# once stable, transition to a test-only (optional)
# target.
'../testing/android/native_test.gyp:native_test_apk',
# Unit test bundles packaged as an apk.
'../base/base.gyp:base_unittests_apk',
'../cc/cc_tests.gyp:cc_unittests_apk',
'../chrome/chrome.gyp:unit_tests_apk',
'../content/content.gyp:content_unittests_apk',
'../gpu/gpu.gyp:gpu_unittests_apk',
'../ipc/ipc.gyp:ipc_tests_apk',
'../media/media.gyp:media_unittests_apk',
'../net/net.gyp:net_unittests_apk',
'../sql/sql.gyp:sql_unittests_apk',
'../sync/sync.gyp:sync_unit_tests_apk',
'../ui/ui.gyp:ui_unittests_apk',
'../android_webview/android_webview.gyp:android_webview_test_apk',
'../chrome/chrome.gyp:chromium_testshell_test_apk',
],
}],
],
},
{
# Experimental / in-progress targets that are expected to fail
# but we still try to compile them on bots (turning the stage
# orange, not red).
'target_name': 'android_experimental',
'type': 'none',
'dependencies': [
],
},
{
# In-progress targets that are expected to fail and are NOT run
# on any bot.
'target_name': 'android_in_progress',
'type': 'none',
'dependencies': [
'../content/content.gyp:content_browsertests',
],
},
], # targets
}
@@ -1,139 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# A collection of functions useful for maintaining android devices
# Run an adb command on all connected device in parallel.
# Usage: adb_all command line to eval. Quoting is optional.
#
# Examples:
# adb_all install Chrome.apk
# adb_all 'shell cat /path/to/file'
#
adb_all() {
if [[ $# == 0 ]]; then
echo "Usage: adb_all <adb command>. Quoting is optional."
echo "Example: adb_all install Chrome.apk"
return 1
fi
local DEVICES=$(adb_get_devices -b)
local NUM_DEVICES=$(echo $DEVICES | wc -w)
if (( $NUM_DEVICES > 1 )); then
echo "Looping over $NUM_DEVICES devices"
fi
_adb_multi "$DEVICES" "$*"
}
# Run a command on each connected device. Quoting the command is suggested but
# not required. The script setups up variable DEVICE to correspond to the
# current serial number. Intended for complex one_liners that don't work in
# adb_all
# Usage: adb_device_loop 'command line to eval'
adb_device_loop() {
if [[ $# == 0 ]]; then
echo "Intended for more complex one-liners that cannot be done with" \
"adb_all."
echo 'Usage: adb_device_loop "echo $DEVICE: $(adb root &&' \
'adb shell cat /data/local.prop)"'
return 1
fi
local DEVICES=$(adb_get_devices)
if [[ -z $DEVICES ]]; then
return
fi
# Do not change DEVICE variable name - part of api
for DEVICE in $DEVICES; do
DEV_TYPE=$(adb -s $DEVICE shell getprop ro.product.device | sed 's/\r//')
echo "Running on $DEVICE ($DEV_TYPE)"
ANDROID_SERIAL=$DEVICE eval "$*"
done
}
# Erases data from any devices visible on adb. To preserve a device,
# disconnect it or:
# 1) Reboot it into fastboot with 'adb reboot bootloader'
# 2) Run wipe_all_devices to wipe remaining devices
# 3) Restore device it with 'fastboot reboot'
#
# Usage: wipe_all_devices [-f]
#
wipe_all_devices() {
if [[ -z $(which adb) || -z $(which fastboot) ]]; then
echo "aborting: adb and fastboot not in path"
return 1
elif ! $(groups | grep -q 'plugdev'); then
echo "If fastboot fails, run: 'sudo adduser $(whoami) plugdev'"
fi
local DEVICES=$(adb_get_devices -b)
if [[ $1 != '-f' ]]; then
echo "This will ERASE ALL DATA from $(echo $DEVICES | wc -w) device."
read -p "Hit enter to continue"
fi
_adb_multi "$DEVICES" "reboot bootloader"
# Subshell to isolate job list
(
for DEVICE in $DEVICES; do
fastboot_erase $DEVICE &
done
wait
)
# Reboot devices together
for DEVICE in $DEVICES; do
fastboot -s $DEVICE reboot
done
}
# Wipe a device in fastboot.
# Usage fastboot_erase [serial]
fastboot_erase() {
if [[ -n $1 ]]; then
echo "Wiping $1"
local SERIAL="-s $1"
else
if [ -z $(fastboot devices) ]; then
echo "No devices in fastboot, aborting."
echo "Check out wipe_all_devices to see if sufficient"
echo "You can put a device in fastboot using adb reboot bootloader"
return 1
fi
local SERIAL=""
fi
fastboot $SERIAL erase cache
fastboot $SERIAL erase userdata
}
# Get list of devices connected via adb
# Args: -b block until adb detects a device
adb_get_devices() {
local DEVICES="$(adb devices | grep 'device$')"
if [[ -z $DEVICES && $1 == '-b' ]]; then
echo '- waiting for device -' >&2
local DEVICES="$(adb wait-for-device devices | grep 'device$')"
fi
echo "$DEVICES" | awk -vORS=' ' '{print $1}' | sed 's/ $/\n/'
}
###################################################
## HELPER FUNCTIONS
###################################################
# Run an adb command in parallel over a device list
_adb_multi() {
local DEVICES=$1
local ADB_ARGS=$2
(
for DEVICE in $DEVICES; do
adb -s $DEVICE $ADB_ARGS &
done
wait
)
}
@@ -1,24 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Kill a running content shell.
#
# Assumes you have sourced the build/android/envsetup.sh script.
SHELL_PID_LINES=$(adb shell ps | grep ' org.chromium.content_shell')
VAL=$(echo "$SHELL_PID_LINES" | wc -l)
if [ $VAL -lt 1 ] ; then
echo "Not running Content shell."
else
SHELL_PID=$(echo $SHELL_PID_LINES | awk '{print $2}')
if [ "$SHELL_PID" != "" ] ; then
set -x
adb shell kill $SHELL_PID
set -
else
echo "Content shell does not appear to be running."
fi
fi
@@ -1,155 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Saves logcats from all connected devices.
Usage: adb_logcat_monitor.py <base_dir> [<adb_binary_path>]
This script will repeatedly poll adb for new devices and save logcats
inside the <base_dir> directory, which it attempts to create. The
script will run until killed by an external signal. To test, run the
script in a shell and <Ctrl>-C it after a while. It should be
resilient across phone disconnects and reconnects and start the logcat
early enough to not miss anything.
"""
import logging
import os
import re
import shutil
import signal
import subprocess
import sys
import time
# Map from device_id -> (process, logcat_num)
devices = {}
class TimeoutException(Exception):
"""Exception used to signal a timeout."""
pass
class SigtermError(Exception):
"""Exception used to catch a sigterm."""
pass
def StartLogcatIfNecessary(device_id, adb_cmd, base_dir):
"""Spawns a adb logcat process if one is not currently running."""
process, logcat_num = devices[device_id]
if process:
if process.poll() is None:
# Logcat process is still happily running
return
else:
logging.info('Logcat for device %s has died', device_id)
error_filter = re.compile('- waiting for device -')
for line in process.stderr:
if not error_filter.match(line):
logging.error(device_id + ': ' + line)
logging.info('Starting logcat %d for device %s', logcat_num,
device_id)
logcat_filename = 'logcat_%s_%03d' % (device_id, logcat_num)
logcat_file = open(os.path.join(base_dir, logcat_filename), 'w')
process = subprocess.Popen([adb_cmd, '-s', device_id,
'logcat', '-v', 'threadtime'],
stdout=logcat_file,
stderr=subprocess.PIPE)
devices[device_id] = (process, logcat_num + 1)
def GetAttachedDevices(adb_cmd):
"""Gets the device list from adb.
We use an alarm in this function to avoid deadlocking from an external
dependency.
Args:
adb_cmd: binary to run adb
Returns:
list of devices or an empty list on timeout
"""
signal.alarm(2)
try:
out, err = subprocess.Popen([adb_cmd, 'devices'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
if err:
logging.warning('adb device error %s', err.strip())
return re.findall('^(\w+)\tdevice$', out, re.MULTILINE)
except TimeoutException:
logging.warning('"adb devices" command timed out')
return []
except (IOError, OSError):
logging.exception('Exception from "adb devices"')
return []
finally:
signal.alarm(0)
def main(base_dir, adb_cmd='adb'):
"""Monitor adb forever. Expects a SIGINT (Ctrl-C) to kill."""
# We create the directory to ensure 'run once' semantics
if os.path.exists(base_dir):
print('adb_logcat_monitor: %s already exists? Cleaning' % base_dir)
shutil.rmtree(base_dir, ignore_errors=True)
os.makedirs(base_dir)
logging.basicConfig(filename=os.path.join(base_dir, 'eventlog'),
level=logging.INFO,
format='%(asctime)-2s %(levelname)-8s %(message)s')
# Set up the alarm for calling 'adb devices'. This is to ensure
# our script doesn't get stuck waiting for a process response
def TimeoutHandler(_, unused_frame):
raise TimeoutException()
signal.signal(signal.SIGALRM, TimeoutHandler)
# Handle SIGTERMs to ensure clean shutdown
def SigtermHandler(_, unused_frame):
raise SigtermError()
signal.signal(signal.SIGTERM, SigtermHandler)
logging.info('Started with pid %d', os.getpid())
pid_file_path = os.path.join(base_dir, 'LOGCAT_MONITOR_PID')
try:
with open(pid_file_path, 'w') as f:
f.write(str(os.getpid()))
while True:
for device_id in GetAttachedDevices(adb_cmd):
if not device_id in devices:
devices[device_id] = (None, 0)
for device in devices:
# This will spawn logcat watchers for any device ever detected
StartLogcatIfNecessary(device, adb_cmd, base_dir)
time.sleep(5)
except SigtermError:
logging.info('Received SIGTERM, shutting down')
except:
logging.exception('Unexpected exception in main.')
finally:
for process, _ in devices.values():
if process:
try:
process.terminate()
except OSError:
pass
os.remove(pid_file_path)
if __name__ == '__main__':
if 2 <= len(sys.argv) <= 3:
print('adb_logcat_monitor: Initializing')
sys.exit(main(*sys.argv[1:3]))
print('Usage: %s <base_dir> [<adb_binary_path>]' % sys.argv[0])
@@ -1,202 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Shutdown adb_logcat_monitor and print accumulated logs.
To test, call './adb_logcat_printer.py <base_dir>' where
<base_dir> contains 'adb logcat -v threadtime' files named as
logcat_<deviceID>_<sequenceNum>
The script will print the files to out, and will combine multiple
logcats from a single device if there is overlap.
Additionally, if a <base_dir>/LOGCAT_MONITOR_PID exists, the script
will attempt to terminate the contained PID by sending a SIGINT and
monitoring for the deletion of the aforementioned file.
"""
import io
import logging
import os
import re
import signal
import sys
import time
# Set this to debug for more verbose output
LOG_LEVEL = logging.INFO
def CombineLogFiles(list_of_lists, logger):
"""Splices together multiple logcats from the same device.
Args:
list_of_lists: list of pairs (filename, list of timestamped lines)
logger: handler to log events
Returns:
list of lines with duplicates removed
"""
cur_device_log = ['']
for cur_file, cur_file_lines in list_of_lists:
# Ignore files with just the logcat header
if len(cur_file_lines) < 2:
continue
common_index = 0
# Skip this step if list just has empty string
if len(cur_device_log) > 1:
try:
line = cur_device_log[-1]
# Used to make sure we only splice on a timestamped line
if re.match('^\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} ', line):
common_index = cur_file_lines.index(line)
else:
logger.warning('splice error - no timestamp in "%s"?', line.strip())
except ValueError:
# The last line was valid but wasn't found in the next file
cur_device_log += ['***** POSSIBLE INCOMPLETE LOGCAT *****']
logger.info('Unable to splice %s. Incomplete logcat?', cur_file)
cur_device_log += ['*'*30 + ' %s' % cur_file]
cur_device_log.extend(cur_file_lines[common_index:])
return cur_device_log
def FindLogFiles(base_dir):
"""Search a directory for logcat files.
Args:
base_dir: directory to search
Returns:
Mapping of device_id to a sorted list of file paths for a given device
"""
logcat_filter = re.compile('^logcat_(\w+)_(\d+)$')
# list of tuples (<device_id>, <seq num>, <full file path>)
filtered_list = []
for cur_file in os.listdir(base_dir):
matcher = logcat_filter.match(cur_file)
if matcher:
filtered_list += [(matcher.group(1), int(matcher.group(2)),
os.path.join(base_dir, cur_file))]
filtered_list.sort()
file_map = {}
for device_id, _, cur_file in filtered_list:
if not device_id in file_map:
file_map[device_id] = []
file_map[device_id] += [cur_file]
return file_map
def GetDeviceLogs(log_filenames, logger):
"""Read log files, combine and format.
Args:
log_filenames: mapping of device_id to sorted list of file paths
logger: logger handle for logging events
Returns:
list of formatted device logs, one for each device.
"""
device_logs = []
for device, device_files in log_filenames.items():
logger.debug('%s: %s', device, str(device_files))
device_file_lines = []
for cur_file in device_files:
with open(cur_file) as f:
device_file_lines += [(cur_file, f.read().splitlines())]
combined_lines = CombineLogFiles(device_file_lines, logger)
# Prepend each line with a short unique ID so it's easy to see
# when the device changes. We don't use the start of the device
# ID because it can be the same among devices. Example lines:
# AB324: foo
# AB324: blah
device_logs += [('\n' + device[-5:] + ': ').join(combined_lines)]
return device_logs
def ShutdownLogcatMonitor(base_dir, logger):
"""Attempts to shutdown adb_logcat_monitor and blocks while waiting."""
try:
monitor_pid_path = os.path.join(base_dir, 'LOGCAT_MONITOR_PID')
with open(monitor_pid_path) as f:
monitor_pid = int(f.readline())
logger.info('Sending SIGTERM to %d', monitor_pid)
os.kill(monitor_pid, signal.SIGTERM)
i = 0
while True:
time.sleep(.2)
if not os.path.exists(monitor_pid_path):
return
if not os.path.exists('/proc/%d' % monitor_pid):
logger.warning('Monitor (pid %d) terminated uncleanly?', monitor_pid)
return
logger.info('Waiting for logcat process to terminate.')
i += 1
if i >= 10:
logger.warning('Monitor pid did not terminate. Continuing anyway.')
return
except (ValueError, IOError, OSError):
logger.exception('Error signaling logcat monitor - continuing')
def main(base_dir, output_file):
log_stringio = io.StringIO()
logger = logging.getLogger('LogcatPrinter')
logger.setLevel(LOG_LEVEL)
sh = logging.StreamHandler(log_stringio)
sh.setFormatter(logging.Formatter('%(asctime)-2s %(levelname)-8s'
' %(message)s'))
logger.addHandler(sh)
try:
# Wait at least 5 seconds after base_dir is created before printing.
#
# The idea is that 'adb logcat > file' output consists of 2 phases:
# 1 Dump all the saved logs to the file
# 2 Stream log messages as they are generated
#
# We want to give enough time for phase 1 to complete. There's no
# good method to tell how long to wait, but it usually only takes a
# second. On most bots, this code path won't occur at all, since
# adb_logcat_monitor.py command will have spawned more than 5 seconds
# prior to called this shell script.
try:
sleep_time = 5 - (time.time() - os.path.getctime(base_dir))
except OSError:
sleep_time = 5
if sleep_time > 0:
logger.warning('Monitor just started? Sleeping %.1fs', sleep_time)
time.sleep(sleep_time)
assert os.path.exists(base_dir), '%s does not exist' % base_dir
ShutdownLogcatMonitor(base_dir, logger)
separator = '\n' + '*' * 80 + '\n\n'
for log in GetDeviceLogs(FindLogFiles(base_dir), logger):
output_file.write(log)
output_file.write(separator)
with open(os.path.join(base_dir, 'eventlog')) as f:
output_file.write('\nLogcat Monitor Event Log\n')
output_file.write(f.read())
except:
logger.exception('Unexpected exception')
logger.info('Done.')
sh.flush()
output_file.write('\nLogcat Printer Event Log\n')
output_file.write(log_stringio.getvalue())
if __name__ == '__main__':
if len(sys.argv) == 1:
print('Usage: %s <base_dir>' % sys.argv[0])
sys.exit(1)
sys.exit(main(sys.argv[1], sys.stdout))
@@ -1,14 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
if [ $# -gt 0 ] ; then
INTENT_ARGS='-d "$1"' # e.g. a URL
fi
adb shell am start \
-a android.intent.action.VIEW \
-n org.chromium.content_shell/.ContentShellActivity \
$INTENT_ARGS
@@ -1,97 +0,0 @@
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<project name="chromium-jars" default="dist">
<!--
Common ant build file for for chromium_*.jars.
For creating a new chromium_*.jar :
1. Use build/java.gypi action.
The jar will be created as chromium_${PACKAGE_NAME} in
${PRODUCT_DIR}/lib.java.
-->
<description>
Building ${PROJECT_NAME}/ java source code with ant.
</description>
<import file="common.xml"/>
<path id="javac.custom.classpath">
<filelist files="${INPUT_JARS_PATHS}"/>
<pathelement location="${ANDROID_SDK}/android.jar"/>
</path>
<path id="javac.srcdirs.additional">
<filelist files="${ADDITIONAL_SRC_DIRS}"/>
<filelist files="${GENERATED_SRC_DIRS}"/>
</path>
<property-value
name="javac.srcdir"
value="src:${toString:javac.srcdirs.additional}"
/>
<property-location
name="dest.dir"
location="${PRODUCT_DIR}/java/${PACKAGE_NAME}"
check-exists="false"
/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${dest.dir}"/>
<!-- Remove all .class files from dest.dir. This prevents inclusion of
incorrect .class files in the final .jar. For example, if a .java file
was deleted, the .jar should not contain the .class files for that
.java from previous builds.
-->
<delete>
<fileset dir="${dest.dir}" includes="**/*.class"/>
</delete>
</target>
<target name="compile" depends="init" description="Compiles source.">
<fail message="Error: javac.custom.classpath is not set. Please set it to
classpath for javac.">
<condition>
<not><isreference refid="javac.custom.classpath"/></not>
</condition>
</fail>
<echo>
Compiling ${javac.srcdir}, classpath: ${toString:javac.custom.classpath}
</echo>
<javac
srcdir="${javac.srcdir}"
destdir="${dest.dir}"
classpathref="javac.custom.classpath"
debug="true"
includeantruntime="false"
/>
</target>
<target name="dist" depends="compile"
description="Generate chromium_${PACKAGE_NAME}.jar.">
<!-- Create the distribution directory -->
<jar
jarfile="${lib.java.dir}/chromium_${PACKAGE_NAME}.jar"
basedir="${dest.dir}"
/>
<!-- If Gyp thinks this output is stale but Ant doesn't, the modification
time should still be updated. Otherwise, this target will continue to
be rebuilt in future builds.
-->
<touch file="${lib.java.dir}/chromium_${PACKAGE_NAME}.jar"/>
</target>
<target name="clean" description="clean up">
<!-- Delete the appropriate directory trees -->
<delete dir="${dest.dir}"/>
</target>
</project>
@@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<project name="chrome_common_defines">
<!-- Common build properties for Chrome for android. -->
<!--
Macro for checking that a property is correctly set. Performs checks for:
1. Property is set and not null.
2. String value of property does not contains any '$' signs.
-->
<macrodef name="check-property-value">
<attribute name="property"/>
<sequential>
<fail message ="Property @{property} is not set.">
<condition>
<or>
<not><isset property="@{property}"/></not>
<length string="${@{property}}" trim="true" when="less" length="1"/>
</or>
</condition>
</fail>
<!--
Check for $ signs. This catches errors when properties are initialized from environment
variables. E.g. if we have <property name="foo" value="${env.bar}" /> but env.bar is
not set then foo will have the literal value of '${env.bar}'.
-->
<fail message="Value checked failed for property: @{property} : ${@{property}}.
Property value contains an uninitialized environment variable.">
<condition>
<contains string="${@{property}}" substring="$"/>
</condition>
</fail>
</sequential>
</macrodef>
<!--
A safe setter for location properties. Checks that a location is not
empty and actually exists. For specifying output directories, location
check can be disabled by specifying check-exists="false".
-->
<macrodef name="property-location">
<attribute name="name"/>
<attribute name="location"/>
<attribute name="check-exists" default="true"/>
<sequential>
<property name="@{name}" location="@{location}"/>
<check-property-value property="@{name}"/>
<fail message="Location specified for @{name} : @{location} does not exist.">
<condition>
<and>
<equals arg1="@{check-exists}" arg2="true"/>
<not><available file="@{location}"/></not>
</and>
</condition>
</fail>
</sequential>
</macrodef>
<!-- A safe setter for property values -->
<macrodef name="property-value">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="@{value}"/>
<check-property-value property="@{name}"/>
</sequential>
</macrodef>
<!-- Common environment properties. -->
<property-location name="sdk.dir" location="${ANDROID_SDK_ROOT}"/>
<property-value name="target" value="android-${ANDROID_SDK_VERSION}"/>
<property name="source.dir" location="src"/>
<property-location name="android.gdbserver" location="${ANDROID_GDBSERVER}"/>
<!--
Common directories used by SDK Build, when making changes here
make sure to update gyp files and test scripts constants in
build/android/pylib/constants.py
-->
<!-- Common directory for chromium_*.jars. -->
<property-location name="lib.java.dir" location="${PRODUCT_DIR}/lib.java"/>
<!-- Common directory for test jars. -->
<property-location name="test.lib.java.dir"
location="${PRODUCT_DIR}/test.lib.java"/>
<!-- Common directory for apks. -->
<property-location name="apks.dir" location="${PRODUCT_DIR}/apks"/>
</project>
@@ -1,284 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<project name="chrome_sdk_overrides" >
<!--
Redefinition of targets used by SDK tools.
Supported version: SDK tools revision 20.
SDK tools do not allow easy way of extending classpaths
for aidl and javac. This file defines targets which can be used to
override targets used by tools.
-->
<target name="-pre-compile">
<!--
Remove all .class files from the output directory. This prevents inclusion of incorrect .class
files in the final apk. For example, if a .java file was deleted, the apk should not contain
the .class files for that .java from previous builds.
-->
<delete>
<fileset dir="${out.classes.absolute.dir}" includes="**/*.class"/>
</delete>
</target>
<!--
Override the -compile target.
This target requires 'javac.custom.classpath' to be set to reference
of classpath to be used for javac. Also accepts custom path for
sources: 'javac.custom.sourcepath'.
-->
<target
name="-compile"
depends="-build-setup, -pre-build, -code-gen, -pre-compile">
<do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..." >
<!-- If javac.srcdirs.additional isn't set, set it to an empty path. -->
<if>
<condition>
<not>
<isreference refid="javac.srcdirs.additional"/>
</not>
</condition>
<then>
<path id="javac.srcdirs.additional"/>
</then>
</if>
<javac
bootclasspathref="project.target.class.path"
classpathref="javac.custom.classpath"
debug="true"
destdir="${out.classes.absolute.dir}"
encoding="${java.encoding}"
extdirs=""
fork="${need.javac.fork}"
includeantruntime="false"
source="${java.source}"
target="${java.target}"
verbose="${verbose}">
<src path="${source.absolute.dir}"/>
<src path="${gen.absolute.dir}"/>
<src>
<path refid="javac.srcdirs.additional"/>
</src>
<compilerarg line="${java.compilerargs}"/>
</javac>
<!--
If the project is instrumented, then instrument the classes
TODO(shashishekhar): Add option to override emma filter.
-->
<if condition="${build.is.instrumented}">
<then>
<echo level="info">
Instrumenting classes from ${out.absolute.dir}/classes...
</echo>
<!-- build the default filter to remove R, Manifest, BuildConfig -->
<getemmafilter
appPackage="${project.app.package}"
filterOut="emma.default.filter"
libraryPackagesRefId="project.library.packages"/>
<!--
Define where the .em file is output.
This may have been setup already if this is a library.
-->
<property name="emma.coverage.absolute.file"
location="${out.absolute.dir}/coverage.em"/>
<!-- It only instruments class files, not any external libs -->
<emma enabled="true">
<instr
instrpath="${out.absolute.dir}/classes"
metadatafile="${emma.coverage.absolute.file}"
mode="overwrite"
outdir="${out.absolute.dir}/classes"
verbosity="${verbosity}">
<filter excludes="${emma.default.filter}"/>
<filter value="${emma.filter}"/>
</instr>
</emma>
</then>
</if>
<!--
If the project needs a test jar then generate a jar containing
all compiled classes and referenced jars.
project.is.testapp is set by Android's ant build system based on the
target's manifest. It is true only for instrumentation apks.
-->
<if condition="${project.is.testapp}">
<then>
<echo level="info">Creating test jar file:
${ant.project.name}-debug.jar</echo>
<property-location name="create.test.jar.file"
location="${CHROMIUM_SRC}/build/android/ant/create-test-jar.js"/>
<script language="javascript" src="${create.test.jar.file}"/>
</then>
</if>
</do-only-if-manifest-hasCode>
</target>
<!--
For debug builds, the Android SDK tools create a key in ~/.android and sign the build with it.
This has caused all kinds of issues. Instead, the debug build should be signed with a key in
build/android/ant. The SDK tools do not provide any support for overriding that behavior and so
instead one must use the hack below.
-->
<!-- Disables automatic signing. -->
<property name="build.is.signing.debug" value="false"/>
<!-- TODO(cjhopman): Remove this property when all gyp files define the CHROMIUM_SRC property. -->
<property name="CHROMIUM_SRC" value="${PRODUCT_DIR}/../.." />
<property name="key.store" value="${CHROMIUM_SRC}/build/android/ant/chromium-debug.keystore"/>
<property name="key.store.password" value="chromium"/>
<property name="key.alias" value="chromiumdebugkey"/>
<property name="key.alias.password" value="chromium"/>
<!-- SDK tools assume that out.packaged.file is signed and name it "...-unaligned" -->
<property name="out.packaged.file"
value="${apks.dir}/${ant.project.name}-debug-unsigned.apk" />
<property name="out.unaligned.file"
value="${apks.dir}/${ant.project.name}-debug-unaligned.apk" />
<!-- By default, the SDK tools build only aligns the APK in the -do-debug target. -->
<target name="-do-debug"
depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
<!-- only create apk if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not create apk..." >
<sequential>
<!-- Signs the APK -->
<echo level="info">Signing final apk...</echo>
<signapk
input="${out.packaged.file}"
output="${out.unaligned.file}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"/>
<!-- Zip aligns the APK -->
<zipalign-helper
in.package="${out.unaligned.file}"
out.package="${out.final.file}" />
<echo level="info">Release Package: ${out.final.file}</echo>
</sequential>
</do-only-if-not-library>
<record-build-info />
</target>
<path id="native.libs.gdbserver">
<fileset file="${android.gdbserver}"/>
</path>
<target name="-post-compile">
<!--
Copy gdbserver to main libs directory if building a non-instrumentation debug apk.
TODO(jrg): For now, Chrome on Android always builds native code
as Release and java/ant as Debug, which means we always install
gdbserver. Resolve this discrepancy, possibly by making this
Release Official build java/ant as Release.
-->
<if>
<condition>
<and>
<equals arg1="${build.target}" arg2="debug"/>
<isfalse value="${project.is.testapp}"/>
</and>
</condition>
<then>
<echo message="Copying gdbserver to the apk to enable native debugging"/>
<copy todir="${out.dir}/libs/${target.abi}">
<path refid="native.libs.gdbserver"/>
</copy>
</then>
</if>
<!-- Package all the compiled .class files into a .jar. -->
<jar
jarfile="${lib.java.dir}/chromium_apk_${PACKAGE_NAME}.jar"
basedir="${out.classes.absolute.dir}"
/>
</target>
<!--
Override obfuscate target to pass javac.custom.classpath to Proguard. SDK tools do not provide
any way to pass custom class paths to Proguard.
-->
<target name="-obfuscate">
<if condition="${proguard.enabled}">
<then>
<property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard"/>
<property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar"/>
<property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar"/>
<!-- input for dex will be proguard's output -->
<property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}"/>
<!-- Add Proguard Tasks -->
<property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar"/>
<taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}"/>
<!-- Set the android classpath Path object into a single property. It'll be
all the jar files separated by a platform path-separator.
Each path must be quoted if it contains spaces.
-->
<pathconvert property="project.target.classpath.value" refid="project.target.class.path">
<firstmatchmapper>
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
<identitymapper/>
</firstmatchmapper>
</pathconvert>
<!-- Build a path object with all the jar files that must be obfuscated.
This include the project compiled source code and any 3rd party jar
files. -->
<path id="project.all.classes.path">
<pathelement location="${preobfuscate.jar.file}"/>
<path refid="project.all.jars.path"/>
<!-- Pass javac.custom.classpath for apks. -->
<path refid="javac.custom.classpath"/>
</path>
<!-- Set the project jar files Path object into a single property. It'll be
all the jar files separated by a platform path-separator.
Each path must be quoted if it contains spaces.
-->
<pathconvert property="project.all.classes.value" refid="project.all.classes.path">
<firstmatchmapper>
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
<identitymapper/>
</firstmatchmapper>
</pathconvert>
<!-- Turn the path property ${proguard.config} from an A:B:C property
into a series of includes: -include A -include B -include C
suitable for processing by the ProGuard task. Note - this does
not include the leading '-include "' or the closing '"'; those
are added under the <proguard> call below.
-->
<path id="proguard.configpath">
<pathelement path="${proguard.config}"/>
</path>
<pathconvert pathsep='" -include "' property="proguard.configcmd"
refid="proguard.configpath"/>
<mkdir dir="${obfuscate.absolute.dir}"/>
<delete file="${preobfuscate.jar.file}"/>
<delete file="${obfuscated.jar.file}"/>
<jar basedir="${out.classes.absolute.dir}"
destfile="${preobfuscate.jar.file}"/>
<proguard>
-include "${proguard.configcmd}"
-include "${out.absolute.dir}/proguard.txt"
-injars ${project.all.classes.value}
-outjars "${obfuscated.jar.file}"
-libraryjars ${project.target.classpath.value}
-dump "${obfuscate.absolute.dir}/dump.txt"
-printseeds "${obfuscate.absolute.dir}/seeds.txt"
-printusage "${obfuscate.absolute.dir}/usage.txt"
-printmapping "${obfuscate.absolute.dir}/mapping.txt"
</proguard>
</then>
</if>
</target>
</project>
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_fyi_builder.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_fyi_tester.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_main_builder.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_try_builder.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_try_compile.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_try_tester.sh "$@"
@@ -1,9 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Temporary placeholders to call new buildbot script locations until
# buildbot master config can be pointed to new location.
exec $(dirname $0)/buildbot/bb_webkit_latest_builder.sh "$@"
@@ -1,6 +0,0 @@
# 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/.
#dummy gypi: contents should be discarded due to an enclosing 'conditions:' element.
{}
@@ -1,43 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Provides iotop/top style profiling for android.
Usage:
./device_stats_monitor.py --hz=20 --duration=5 --outfile=/tmp/foo
"""
import optparse
import os
import sys
import time
from pylib import android_commands
from pylib import device_stats_monitor
from pylib import test_options_parser
def main(argv):
option_parser = optparse.OptionParser()
option_parser.add_option('--hz', type='int', default=20,
help='Number of samples/sec.')
option_parser.add_option('--duration', type='int', default=5,
help='Seconds to monitor.')
option_parser.add_option('--outfile', default='/tmp/devicestatsmonitor',
help='Location to start output file.')
test_options_parser.AddBuildTypeOption(option_parser)
options, args = option_parser.parse_args(argv)
monitor = device_stats_monitor.DeviceStatsMonitor(
android_commands.AndroidCommands(), options.hz, options.build_type)
monitor.Start()
print('Waiting for %d seconds while profiling.' % options.duration)
time.sleep(options.duration)
url = monitor.StopAndCollect(options.outfile)
print('View results in browser at %s' % url)
if __name__ == '__main__':
sys.exit(main(sys.argv))
@@ -1,170 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A class to keep track of devices across builds and report state."""
import logging
import optparse
import os
import smtplib
import sys
from pylib import buildbot_report
from pylib.android_commands import GetAttachedDevices
from pylib.cmd_helper import GetCmdOutput
def DeviceInfo(serial):
"""Gathers info on a device via various adb calls.
Args:
serial: The serial of the attached device to construct info about.
Returns:
Tuple of device type, build id and report as a string.
"""
def AdbShellCmd(cmd):
return GetCmdOutput('adb -s %s shell %s' % (serial, cmd),
shell=True).strip()
device_type = AdbShellCmd('getprop ro.build.product')
device_build = AdbShellCmd('getprop ro.build.id')
report = ['Device %s (%s)' % (serial, device_type),
' Build: %s (%s)' % (device_build,
AdbShellCmd('getprop ro.build.fingerprint')),
' Battery: %s%%' % AdbShellCmd('dumpsys battery | grep level '
"| awk '{print $2}'"),
' Battery temp: %s' % AdbShellCmd('dumpsys battery'
'| grep temp '
"| awk '{print $2}'"),
' IMEI slice: %s' % AdbShellCmd('dumpsys iphonesubinfo '
'| grep Device'
"| awk '{print $4}'")[-6:],
' Wifi IP: %s' % AdbShellCmd('getprop dhcp.wlan0.ipaddress'),
'']
return device_type, device_build, '\n'.join(report)
def CheckForMissingDevices(options, adb_online_devs):
"""Uses file of previous online devices to detect broken phones.
Args:
options: out_dir parameter of options argument is used as the base
directory to load and update the cache file.
adb_online_devs: A list of serial numbers of the currently visible
and online attached devices.
"""
# TODO(navabi): remove this once the bug that causes different number
# of devices to be detected between calls is fixed.
logger = logging.getLogger()
logger.setLevel(logging.INFO)
out_dir = os.path.abspath(options.out_dir)
def ReadDeviceList(file_name):
devices_path = os.path.join(out_dir, file_name)
devices = []
try:
with open(devices_path) as f:
devices = f.read().splitlines()
except IOError:
# Ignore error, file might not exist
pass
return devices
def WriteDeviceList(file_name, device_list):
path = os.path.join(out_dir, file_name)
if not os.path.exists(out_dir):
os.makedirs(out_dir)
with open(path, 'w') as f:
# Write devices currently visible plus devices previously seen.
f.write('\n'.join(set(device_list)))
last_devices_path = os.path.join(out_dir, '.last_devices')
last_devices = ReadDeviceList('.last_devices')
missing_devs = list(set(last_devices) - set(adb_online_devs))
if missing_devs:
from_address = 'buildbot@chromium.org'
to_address = 'chromium-android-device-alerts@google.com'
bot_name = os.environ['BUILDBOT_BUILDERNAME']
slave_name = os.environ['BUILDBOT_SLAVENAME']
num_online_devs = len(adb_online_devs)
subject = 'Devices offline on %s, %s (%d remaining).' % (slave_name,
bot_name,
num_online_devs)
buildbot_report.PrintWarning()
devices_missing_msg = '%d devices not detected.' % len(missing_devs)
buildbot_report.PrintSummaryText(devices_missing_msg)
# TODO(navabi): Debug by printing both output from GetCmdOutput and
# GetAttachedDevices to compare results.
body = '\n'.join(
['Current online devices: %s' % adb_online_devs,
'%s are no longer visible. Were they removed?\n' % missing_devs,
'SHERIFF: See go/chrome_device_monitor',
'Cache file: %s\n\n' % last_devices_path,
'adb devices: %s' % GetCmdOutput(['adb', 'devices']),
'adb devices(GetAttachedDevices): %s' % GetAttachedDevices()])
print(body)
# Only send email if the first time a particular device goes offline
last_missing = ReadDeviceList('.last_missing')
new_missing_devs = set(missing_devs) - set(last_missing)
if new_missing_devs:
msg_body = '\r\n'.join(
['From: %s' % from_address,
'To: %s' % to_address,
'Subject: %s' % subject,
'', body])
try:
server = smtplib.SMTP('localhost')
server.sendmail(from_address, [to_address], msg_body)
server.quit()
except Exception as e:
print('Failed to send alert email. Error: %s' % e)
else:
new_devs = set(adb_online_devs) - set(last_devices)
if new_devs and os.path.exists(last_devices_path):
buildbot_report.PrintWarning()
buildbot_report.PrintSummaryText(
'%d new devices detected' % len(new_devs))
print(('New devices detected %s. And now back to your '
'regularly scheduled program.' % list(new_devs)))
WriteDeviceList('.last_devices', (adb_online_devs + last_devices))
WriteDeviceList('.last_missing', missing_devs)
def main():
parser = optparse.OptionParser()
parser.add_option('', '--out-dir',
help='Directory where the device path is stored',
default=os.path.join(os.path.dirname(__file__), '..',
'..', 'out'))
options, args = parser.parse_args()
if args:
parser.error('Unknown options %s' % args)
buildbot_report.PrintNamedStep('Device Status Check')
devices = GetAttachedDevices()
types, builds, reports = [], [], []
if devices:
types, builds, reports = list(zip(*[DeviceInfo(dev) for dev in devices]))
unique_types = list(set(types))
unique_builds = list(set(builds))
buildbot_report.PrintMsg('Online devices: %d. Device types %s, builds %s'
% (len(devices), unique_types, unique_builds))
print('\n'.join(reports))
CheckForMissingDevices(options, devices)
if __name__ == '__main__':
sys.exit(main())
@@ -1,321 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Provides an interface to start and stop Android emulator.
Assumes system environment ANDROID_NDK_ROOT has been set.
Emulator: The class provides the methods to launch/shutdown the emulator with
the android virtual device named 'avd_armeabi' .
"""
import logging
import os
import signal
import subprocess
import sys
import time
from pylib import android_commands
from pylib import cmd_helper
# adb_interface.py is under ../../third_party/android_testrunner/
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..',
'..', 'third_party', 'android_testrunner'))
import adb_interface
import errors
import run_command
class EmulatorLaunchException(Exception):
"""Emulator failed to launch."""
pass
def _KillAllEmulators():
"""Kill all running emulators that look like ones we started.
There are odd 'sticky' cases where there can be no emulator process
running but a device slot is taken. A little bot trouble and and
we're out of room forever.
"""
emulators = android_commands.GetEmulators()
if not emulators:
return
for emu_name in emulators:
cmd_helper.GetCmdOutput(['adb', '-s', emu_name, 'emu', 'kill'])
logging.info('Emulator killing is async; give a few seconds for all to die.')
for i in range(5):
if not android_commands.GetEmulators():
return
time.sleep(1)
def DeleteAllTempAVDs():
"""Delete all temporary AVDs which are created for tests.
If the test exits abnormally and some temporary AVDs created when testing may
be left in the system. Clean these AVDs.
"""
avds = android_commands.GetAVDs()
if not avds:
return
for avd_name in avds:
if 'run_tests_avd' in avd_name:
cmd = ['android', '-s', 'delete', 'avd', '--name', avd_name]
cmd_helper.GetCmdOutput(cmd)
logging.info('Delete AVD %s' % avd_name)
class PortPool(object):
"""Pool for emulator port starting position that changes over time."""
_port_min = 5554
_port_max = 5585
_port_current_index = 0
@classmethod
def port_range(cls):
"""Return a range of valid ports for emulator use.
The port must be an even number between 5554 and 5584. Sometimes
a killed emulator "hangs on" to a port long enough to prevent
relaunch. This is especially true on slow machines (like a bot).
Cycling through a port start position helps make us resilient."""
ports = list(range(cls._port_min, cls._port_max, 2))
n = cls._port_current_index
cls._port_current_index = (n + 1) % len(ports)
return ports[n:] + ports[:n]
def _GetAvailablePort():
"""Returns an available TCP port for the console."""
used_ports = []
emulators = android_commands.GetEmulators()
for emulator in emulators:
used_ports.append(emulator.split('-')[1])
for port in PortPool.port_range():
if str(port) not in used_ports:
return port
class Emulator(object):
"""Provides the methods to lanuch/shutdown the emulator.
The emulator has the android virtual device named 'avd_armeabi'.
The emulator could use any even TCP port between 5554 and 5584 for the
console communication, and this port will be part of the device name like
'emulator-5554'. Assume it is always True, as the device name is the id of
emulator managed in this class.
Attributes:
emulator: Path of Android's emulator tool.
popen: Popen object of the running emulator process.
device: Device name of this emulator.
"""
# Signals we listen for to kill the emulator on
_SIGNALS = (signal.SIGINT, signal.SIGHUP)
# Time to wait for an emulator launch, in seconds. This includes
# the time to launch the emulator and a wait-for-device command.
_LAUNCH_TIMEOUT = 120
# Timeout interval of wait-for-device command before bouncing to a a
# process life check.
_WAITFORDEVICE_TIMEOUT = 5
# Time to wait for a "wait for boot complete" (property set on device).
_WAITFORBOOT_TIMEOUT = 300
def __init__(self, new_avd_name, fast_and_loose):
"""Init an Emulator.
Args:
nwe_avd_name: If set, will create a new temporary AVD.
fast_and_loose: Loosen up the rules for reliable running for speed.
Intended for quick testing or re-testing.
"""
try:
android_sdk_root = os.environ['ANDROID_SDK_ROOT']
except KeyError:
logging.critical('The ANDROID_SDK_ROOT must be set to run the test on '
'emulator.')
raise
self.emulator = os.path.join(android_sdk_root, 'tools', 'emulator')
self.android = os.path.join(android_sdk_root, 'tools', 'android')
self.popen = None
self.device = None
self.default_avd = True
self.fast_and_loose = fast_and_loose
self.abi = 'armeabi-v7a'
self.avd = 'avd_armeabi'
if 'x86' in os.environ.get('TARGET_PRODUCT', ''):
self.abi = 'x86'
self.avd = 'avd_x86'
if new_avd_name:
self.default_avd = False
self.avd = self._CreateAVD(new_avd_name)
def _DeviceName(self):
"""Return our device name."""
port = _GetAvailablePort()
return ('emulator-%d' % port, port)
def _CreateAVD(self, avd_name):
"""Creates an AVD with the given name.
Return avd_name.
"""
avd_command = [
self.android,
'--silent',
'create', 'avd',
'--name', avd_name,
'--abi', self.abi,
'--target', 'android-16',
'-c', '128M',
'--force',
]
avd_process = subprocess.Popen(args=avd_command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
avd_process.stdin.write('no\n')
avd_process.wait()
logging.info('Create AVD command: %s', ' '.join(avd_command))
return avd_name
def _DeleteAVD(self):
"""Delete the AVD of this emulator."""
avd_command = [
self.android,
'--silent',
'delete',
'avd',
'--name', self.avd,
]
avd_process = subprocess.Popen(args=avd_command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
logging.info('Delete AVD command: %s', ' '.join(avd_command))
avd_process.wait()
def Launch(self, kill_all_emulators):
"""Launches the emulator asynchronously. Call ConfirmLaunch() to ensure the
emulator is ready for use.
If fails, an exception will be raised.
"""
if kill_all_emulators:
_KillAllEmulators() # just to be sure
if not self.fast_and_loose:
self._AggressiveImageCleanup()
(self.device, port) = self._DeviceName()
emulator_command = [
self.emulator,
# Speed up emulator launch by 40%. Really.
'-no-boot-anim',
# The default /data size is 64M.
# That's not enough for 8 unit test bundles and their data.
'-partition-size', '512',
# Enable GPU by default.
'-gpu', 'on',
# Use a familiar name and port.
'-avd', self.avd,
'-port', str(port)]
if not self.fast_and_loose:
emulator_command.extend([
# Wipe the data. We've seen cases where an emulator
# gets 'stuck' if we don't do this (every thousand runs or
# so).
'-wipe-data',
])
logging.info('Emulator launch command: %s', ' '.join(emulator_command))
self.popen = subprocess.Popen(args=emulator_command,
stderr=subprocess.STDOUT)
self._InstallKillHandler()
def _AggressiveImageCleanup(self):
"""Aggressive cleanup of emulator images.
Experimentally it looks like our current emulator use on the bot
leaves image files around in /tmp/android-$USER. If a "random"
name gets reused, we choke with a 'File exists' error.
TODO(jrg): is there a less hacky way to accomplish the same goal?
"""
logging.info('Aggressive Image Cleanup')
emulator_imagedir = '/tmp/android-%s' % os.environ['USER']
if not os.path.exists(emulator_imagedir):
return
for image in os.listdir(emulator_imagedir):
full_name = os.path.join(emulator_imagedir, image)
if 'emulator' in full_name:
logging.info('Deleting emulator image %s', full_name)
os.unlink(full_name)
def ConfirmLaunch(self, wait_for_boot=False):
"""Confirm the emulator launched properly.
Loop on a wait-for-device with a very small timeout. On each
timeout, check the emulator process is still alive.
After confirming a wait-for-device can be successful, make sure
it returns the right answer.
"""
seconds_waited = 0
number_of_waits = 2 # Make sure we can wfd twice
adb_cmd = "adb -s %s %s" % (self.device, 'wait-for-device')
while seconds_waited < self._LAUNCH_TIMEOUT:
try:
run_command.RunCommand(adb_cmd,
timeout_time=self._WAITFORDEVICE_TIMEOUT,
retry_count=1)
number_of_waits -= 1
if not number_of_waits:
break
except errors.WaitForResponseTimedOutError as e:
seconds_waited += self._WAITFORDEVICE_TIMEOUT
adb_cmd = "adb -s %s %s" % (self.device, 'kill-server')
run_command.RunCommand(adb_cmd)
self.popen.poll()
if self.popen.returncode != None:
raise EmulatorLaunchException('EMULATOR DIED')
if seconds_waited >= self._LAUNCH_TIMEOUT:
raise EmulatorLaunchException('TIMEOUT with wait-for-device')
logging.info('Seconds waited on wait-for-device: %d', seconds_waited)
if wait_for_boot:
# Now that we checked for obvious problems, wait for a boot complete.
# Waiting for the package manager is sometimes problematic.
a = android_commands.AndroidCommands(self.device)
a.WaitForSystemBootCompleted(self._WAITFORBOOT_TIMEOUT)
def Shutdown(self):
"""Shuts down the process started by launch."""
if not self.default_avd:
self._DeleteAVD()
if self.popen:
self.popen.poll()
if self.popen.returncode == None:
self.popen.kill()
self.popen = None
def _ShutdownOnSignal(self, signum, frame):
logging.critical('emulator _ShutdownOnSignal')
for sig in self._SIGNALS:
signal.signal(sig, signal.SIG_DFL)
self.Shutdown()
raise KeyboardInterrupt # print a stack
def _InstallKillHandler(self):
"""Install a handler to kill the emulator when we exit unexpectedly."""
for sig in self._SIGNALS:
signal.signal(sig, self._ShutdownOnSignal)
def main(argv):
Emulator(None, True).Launch(True)
if __name__ == '__main__':
main(sys.argv)
@@ -1,31 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Enables dalvik vm asserts in the android device."""
from pylib import android_commands
import optparse
import sys
def main(argv):
option_parser = optparse.OptionParser()
option_parser.add_option('--enable_asserts', dest='set_asserts',
action='store_true', default=None,
help='Sets the dalvik.vm.enableassertions property to "all"')
option_parser.add_option('--disable_asserts', dest='set_asserts',
action='store_false', default=None,
help='Removes the dalvik.vm.enableassertions property')
options, _ = option_parser.parse_args(argv)
commands = android_commands.AndroidCommands()
if options.set_asserts != None:
if commands.SetJavaAssertsEnabled(options.set_asserts):
commands.Reboot(full_reboot=False)
if __name__ == '__main__':
main(sys.argv)
@@ -1,133 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Sets up environment for building Chromium on Android. It can either be
# compiled with the Android tree or using the Android SDK/NDK. To build with
# NDK/SDK: ". build/android/envsetup.sh --sdk". Environment variable
# ANDROID_SDK_BUILD=1 will then be defined and used in the rest of the setup to
# specifiy build type.
# When building WebView as part of Android we can't use the SDK. Other builds
# default to using the SDK.
# NOTE(yfriedman): This looks unnecessary but downstream the default value
# should be 0 until all builds switch to SDK/NDK.
if [[ "${CHROME_ANDROID_BUILD_WEBVIEW}" -eq 1 ]]; then
export ANDROID_SDK_BUILD=0
else
export ANDROID_SDK_BUILD=1
fi
# Loop over args in case we add more arguments in the future.
while [ "$1" != "" ]; do
case $1 in
-s | --sdk ) export ANDROID_SDK_BUILD=1 ; shift ;;
* ) shift ; break ;;
esac
done
if [[ "${ANDROID_SDK_BUILD}" -eq 1 ]]; then
echo "Using SDK build"
fi
host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
case "${host_os}" in
"linux")
toolchain_dir="linux-x86_64"
;;
"mac")
toolchain_dir="darwin-x86"
;;
*)
echo "Host platform ${host_os} is not supported" >& 2
return 1
esac
CURRENT_DIR="$(readlink -f "$(dirname $BASH_SOURCE)/../../")"
if [[ -z "${CHROME_SRC}" ]]; then
# If $CHROME_SRC was not set, assume current directory is CHROME_SRC.
export CHROME_SRC="${CURRENT_DIR}"
fi
if [[ "${CURRENT_DIR/"${CHROME_SRC}"/}" == "${CURRENT_DIR}" ]]; then
# If current directory is not in $CHROME_SRC, it might be set for other
# source tree. If $CHROME_SRC was set correctly and we are in the correct
# directory, "${CURRENT_DIR/"${CHROME_SRC}"/}" will be "".
# Otherwise, it will equal to "${CURRENT_DIR}"
echo "Warning: Current directory is out of CHROME_SRC, it may not be \
the one you want."
echo "${CHROME_SRC}"
fi
# Android sdk platform version to use
export ANDROID_SDK_VERSION=16
# Source functions script. The file is in the same directory as this script.
. "$(dirname $BASH_SOURCE)"/envsetup_functions.sh
if [[ "${ANDROID_SDK_BUILD}" -eq 1 ]]; then
sdk_build_init
# Sets up environment for building Chromium for Android with source. Expects
# android environment setup and lunch.
elif [[ -z "$ANDROID_BUILD_TOP" || \
-z "$ANDROID_TOOLCHAIN" || \
-z "$ANDROID_PRODUCT_OUT" ]]; then
echo "Android build environment variables must be set."
echo "Please cd to the root of your Android tree and do: "
echo " . build/envsetup.sh"
echo " lunch"
echo "Then try this again."
echo "Or did you mean NDK/SDK build. Run envsetup.sh with --sdk argument."
return 1
elif [[ -n "$CHROME_ANDROID_BUILD_WEBVIEW" ]]; then
webview_build_init
else
non_sdk_build_init
fi
# Workaround for valgrind build
if [[ -n "$CHROME_ANDROID_VALGRIND_BUILD" ]]; then
# arm_thumb=0 is a workaround for https://bugs.kde.org/show_bug.cgi?id=270709
DEFINES+=" arm_thumb=0 release_extra_cflags='-fno-inline\
-fno-omit-frame-pointer -fno-builtin' release_valgrind_build=1\
release_optimize=1"
fi
# Source a bunch of helper functions
. ${CHROME_SRC}/build/android/adb_device_functions.sh
ANDROID_GOMA_WRAPPER=""
if [[ -d $GOMA_DIR ]]; then
ANDROID_GOMA_WRAPPER="$GOMA_DIR/gomacc"
fi
export ANDROID_GOMA_WRAPPER
# Declare Android are cross compile.
export GYP_CROSSCOMPILE=1
export CXX_target="${ANDROID_GOMA_WRAPPER} \
$(echo -n ${ANDROID_TOOLCHAIN}/*-g++)"
# Performs a gyp_chromium run to convert gyp->Makefile for android code.
android_gyp() {
echo "GYP_GENERATORS set to '$GYP_GENERATORS'"
# http://crbug.com/143889.
# In case we are doing a Clang build, we have to unset CC_target and
# CXX_target. Otherwise GYP ends up generating a gcc build (although we set
# 'clang' to 1). This behavior was introduced by
# 54d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83f in GYP.
(
# Fork to avoid side effects on the user's environment variables.
if echo "$GYP_DEFINES" | grep -qE '(clang|asan)'; then
if echo "$CXX_target" | grep -q g++; then
unset CXX_target
fi
fi
"${CHROME_SRC}/build/gyp_chromium" --depth="${CHROME_SRC}" --check "$@"
)
}
# FLOCK needs to be null on system that has no flock
which flock > /dev/null || export FLOCK=
@@ -1,334 +0,0 @@
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Defines functions for envsetup.sh which sets up environment for building
# Chromium on Android. The build can be either use the Android NDK/SDK or
# android source tree. Each has a unique init function which calls functions
# prefixed with "common_" that is common for both environment setups.
################################################################################
# Check to make sure the toolchain exists for the NDK version.
################################################################################
common_check_toolchain() {
if [[ ! -d "${ANDROID_TOOLCHAIN}" ]]; then
echo "Can not find Android toolchain in ${ANDROID_TOOLCHAIN}." >& 2
echo "The NDK version might be wrong." >& 2
return 1
fi
}
################################################################################
# Exports environment variables common to both sdk and non-sdk build (e.g. PATH)
# based on CHROME_SRC and ANDROID_TOOLCHAIN, along with DEFINES for GYP_DEFINES.
################################################################################
common_vars_defines() {
# Set toolchain path according to product architecture.
toolchain_arch="arm-linux-androideabi"
if [[ "${TARGET_PRODUCT}" =~ .*x86.* ]]; then
toolchain_arch="x86"
fi
toolchain_version="4.6"
toolchain_target=$(basename \
${ANDROID_NDK_ROOT}/toolchains/${toolchain_arch}-${toolchain_version})
toolchain_path="${ANDROID_NDK_ROOT}/toolchains/${toolchain_target}"\
"/prebuilt/${toolchain_dir}/bin/"
# Set only if not already set.
# Don't override ANDROID_TOOLCHAIN if set by Android configuration env.
export ANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN:-${toolchain_path}}
common_check_toolchain
# Add Android SDK/NDK tools to system path.
export PATH=$PATH:${ANDROID_NDK_ROOT}
export PATH=$PATH:${ANDROID_SDK_ROOT}/tools
export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools
# This must be set before ANDROID_TOOLCHAIN, so that clang could find the
# gold linker.
# TODO(michaelbai): Remove this path once the gold linker become the default
# linker.
export PATH=$PATH:${CHROME_SRC}/build/android/${toolchain_arch}-gold
# Must have tools like arm-linux-androideabi-gcc on the path for ninja
export PATH=$PATH:${ANDROID_TOOLCHAIN}
# Add Chromium Android development scripts to system path.
# Must be after CHROME_SRC is set.
export PATH=$PATH:${CHROME_SRC}/build/android
# TODO(beverloo): Remove these once all consumers updated to --strip-binary.
export OBJCOPY=$(echo ${ANDROID_TOOLCHAIN}/*-objcopy)
export STRIP=$(echo ${ANDROID_TOOLCHAIN}/*-strip)
# The set of GYP_DEFINES to pass to gyp. Use 'readlink -e' on directories
# to canonicalize them (remove double '/', remove trailing '/', etc).
DEFINES="OS=android"
DEFINES+=" host_os=${host_os}"
if [[ -n "$CHROME_ANDROID_OFFICIAL_BUILD" ]]; then
DEFINES+=" branding=Chrome"
DEFINES+=" buildtype=Official"
# These defines are used by various chrome build scripts to tag the binary's
# version string as 'official' in linux builds (e.g. in
# chrome/trunk/src/chrome/tools/build/version.py).
export OFFICIAL_BUILD=1
export CHROMIUM_BUILD="_google_chrome"
export CHROME_BUILD_TYPE="_official"
# Used by chrome_version_info_posix.cc to display the channel name.
# Valid values: "unstable", "stable", "dev", "beta".
export CHROME_VERSION_EXTRA="beta"
fi
# The order file specifies the order of symbols in the .text section of the
# shared library, libchromeview.so. The file is an order list of section
# names and the library is linked with option
# --section-ordering-file=<orderfile>. The order file is updated by profiling
# startup after compiling with the order_profiling=1 GYP_DEFINES flag.
ORDER_DEFINES="order_text_section=${CHROME_SRC}/orderfiles/orderfile.out"
# The following defines will affect ARM code generation of both C/C++ compiler
# and V8 mksnapshot.
case "${TARGET_PRODUCT}" in
"passion"|"soju"|"sojua"|"sojus"|"yakju"|"mysid"|"nakasi")
DEFINES+=" arm_neon=1 armv7=1 arm_thumb=1"
DEFINES+=" ${ORDER_DEFINES}"
TARGET_ARCH="arm"
;;
"trygon"|"tervigon")
DEFINES+=" arm_neon=0 armv7=1 arm_thumb=1 arm_fpu=vfpv3-d16"
DEFINES+=" ${ORDER_DEFINES}"
TARGET_ARCH="arm"
;;
"full")
DEFINES+=" arm_neon=0 armv7=0 arm_thumb=1 arm_fpu=vfp"
TARGET_ARCH="arm"
;;
*x86*)
# TODO(tedbo): The ia32 build fails on ffmpeg, so we disable it here.
DEFINES+=" use_libffmpeg=0"
host_arch=$(uname -m | sed -e \
's/i.86/ia32/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/;s/i86pc/ia32/')
DEFINES+=" host_arch=${host_arch}"
TARGET_ARCH="x86"
;;
*)
echo "TARGET_PRODUCT: ${TARGET_PRODUCT} is not supported." >& 2
return 1
esac
case "${TARGET_ARCH}" in
"arm")
DEFINES+=" target_arch=arm"
;;
"x86")
DEFINES+=" target_arch=ia32"
;;
*)
echo "TARGET_ARCH: ${TARGET_ARCH} is not supported." >& 2
return 1
esac
DEFINES+=" android_gdbserver=${ANDROID_NDK_ROOT}/prebuilt/\
android-${TARGET_ARCH}/gdbserver/gdbserver"
}
################################################################################
# Exports common GYP variables based on variable DEFINES and CHROME_SRC.
################################################################################
common_gyp_vars() {
export GYP_DEFINES="${DEFINES}"
# Set GYP_GENERATORS to make-android if it's currently unset or null.
export GYP_GENERATORS="${GYP_GENERATORS:-make-android}"
# Use our All target as the default
export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} default_target=All"
# We want to use our version of "all" targets.
export CHROMIUM_GYP_FILE="${CHROME_SRC}/build/all_android.gyp"
}
################################################################################
# Initializes environment variables for NDK/SDK build. Only Android NDK Revision
# 7 on Linux or Mac is offically supported. To run this script, the system
# environment ANDROID_NDK_ROOT must be set to Android NDK's root path. The
# ANDROID_SDK_ROOT only needs to be set to override the default SDK which is in
# the tree under $ROOT/src/third_party/android_tools/sdk.
# TODO(navabi): Add NDK to $ROOT/src/third_party/android_tools/ndk.
# To build Chromium for Android with NDK/SDK follow the steps below:
# > export ANDROID_NDK_ROOT=<android ndk root>
# > export ANDROID_SDK_ROOT=<android sdk root> # to override the default sdk
# > . build/android/envsetup.sh --sdk
# > make
################################################################################
sdk_build_init() {
# If ANDROID_NDK_ROOT is set when envsetup is run, use the ndk pointed to by
# the environment variable. Otherwise, use the default ndk from the tree.
if [[ -z "${ANDROID_NDK_ROOT}" || ! -d "${ANDROID_NDK_ROOT}" ]]; then
export ANDROID_NDK_ROOT="${CHROME_SRC}/third_party/android_tools/ndk/"
fi
# If ANDROID_SDK_ROOT is set when envsetup is run, and if it has the
# right SDK-compatible directory layout, use the sdk pointed to by the
# environment variable. Otherwise, use the default sdk from the tree.
local sdk_suffix=platforms/android-${ANDROID_SDK_VERSION}
if [[ -z "${ANDROID_SDK_ROOT}" || \
! -d "${ANDROID_SDK_ROOT}/${sdk_suffix}" ]]; then
export ANDROID_SDK_ROOT="${CHROME_SRC}/third_party/android_tools/sdk/"
fi
# Makes sure ANDROID_BUILD_TOP is unset if build has option --sdk
unset ANDROID_BUILD_TOP
# Set default target.
export TARGET_PRODUCT="${TARGET_PRODUCT:-trygon}"
# Unset toolchain so that it can be set based on TARGET_PRODUCT.
# This makes it easy to switch between architectures.
unset ANDROID_TOOLCHAIN
common_vars_defines
DEFINES+=" sdk_build=1"
# If we are building NDK/SDK, and in the upstream (open source) tree,
# define a special variable for bringup purposes.
case "${ANDROID_BUILD_TOP-undefined}" in
"undefined")
DEFINES+=" android_upstream_bringup=1"
;;
esac
# Sets android specific directories to NOT_SDK_COMPLIANT. This will allow
# android_gyp to generate make files, but will cause errors when (and only
# when) building targets that depend on these directories.
DEFINES+=" android_src='NOT_SDK_COMPLIANT'"
DEFINES+=" android_product_out=${CHROME_SRC}/out/android"
DEFINES+=" android_lib='NOT_SDK_COMPLIANT'"
DEFINES+=" android_static_lib='NOT_SDK_COMPLIANT'"
DEFINES+=" android_sdk=${ANDROID_SDK_ROOT}/${sdk_suffix}"
DEFINES+=" android_sdk_root=${ANDROID_SDK_ROOT}"
DEFINES+=" android_sdk_tools=${ANDROID_SDK_ROOT}/platform-tools"
DEFINES+=" android_sdk_version=${ANDROID_SDK_VERSION}"
DEFINES+=" android_toolchain=${ANDROID_TOOLCHAIN}"
common_gyp_vars
if [[ -n "$CHROME_ANDROID_BUILD_WEBVIEW" ]]; then
# Can not build WebView with NDK/SDK because it needs the Android build
# system and build inside an Android source tree.
echo "Can not build WebView with NDK/SDK. Requires android source tree." \
>& 2
echo "Try . build/android/envsetup.sh instead." >& 2
return 1
fi
}
################################################################################
# Initializes environment variables for build with android source. This expects
# android environment to be set up along with lunch. To build:
# > . build/envsetup.sh
# > lunch <lunch-type>
# > . build/android/envsetup.sh
# > make
#############################################################################
non_sdk_build_init() {
# We export "TOP" here so that "mmm" can be run to build Java code without
# having to cd to $ANDROID_BUILD_TOP.
export TOP="$ANDROID_BUILD_TOP"
# Set "ANDROID_NDK_ROOT" as checked-in version, if it was not set.
if [[ "${ANDROID_NDK_ROOT}" || ! -d "$ANDROID_NDK_ROOT" ]] ; then
export ANDROID_NDK_ROOT="${CHROME_SRC}/third_party/android_tools/ndk/"
fi
if [[ ! -d "${ANDROID_NDK_ROOT}" ]] ; then
echo "Can not find Android NDK root ${ANDROID_NDK_ROOT}." >& 2
return 1
fi
# We export "ANDROID_SDK_ROOT" for building Java source with the SDK.
export ANDROID_SDK_ROOT=${ANDROID_BUILD_TOP}/prebuilts/sdk/\
${ANDROID_SDK_VERSION}
# Needed by android antfiles when creating apks.
export ANDROID_SDK_HOME=${ANDROID_SDK_ROOT}
# Unset ANDROID_TOOLCHAIN, so it could be set to checked-in 64-bit toolchain.
# in common_vars_defines
unset ANDROID_TOOLCHAIN
common_vars_defines
DEFINES+=" sdk_build=0"
DEFINES+=" android_product_out=${ANDROID_PRODUCT_OUT}"
if [[ -n "$CHROME_ANDROID_BUILD_WEBVIEW" ]]; then
webview_build_init
return
fi
# The non-SDK build currently requires the SDK path to build the framework
# Java aidl files. TODO(steveblock): Investigate avoiding this requirement.
DEFINES+=" android_sdk=${ANDROID_SDK_ROOT}"
DEFINES+=" android_sdk_root=${ANDROID_SDK_ROOT}"
DEFINES+=" android_sdk_tools=${ANDROID_SDK_ROOT}/../tools/linux"
DEFINES+=" android_sdk_version=${ANDROID_SDK_VERSION}"
DEFINES+=" android_toolchain=${ANDROID_TOOLCHAIN}"
common_gyp_vars
}
################################################################################
# To build WebView, we use the Android build system and build inside an Android
# source tree. This method is called from non_sdk_build_init() and adds to the
# settings specified there.
#############################################################################
webview_build_init() {
# For the WebView build we always use the NDK and SDK in the Android tree,
# and we don't touch ANDROID_TOOLCHAIN which is already set by Android.
export ANDROID_NDK_ROOT=${ANDROID_BUILD_TOP}/prebuilts/ndk/8
export ANDROID_SDK_ROOT=${ANDROID_BUILD_TOP}/prebuilts/sdk/\
${ANDROID_SDK_VERSION}
common_vars_defines
# We need to supply SDK paths relative to the top of the Android tree to make
# sure the generated Android makefiles are portable, as they will be checked
# into the Android tree.
ANDROID_SDK=$(python -c \
"import os.path; print os.path.relpath('${ANDROID_SDK_ROOT}', \
'${ANDROID_BUILD_TOP}')")
ANDROID_SDK_TOOLS=$(python -c \
"import os.path; \
print os.path.relpath('${ANDROID_SDK_ROOT}/../tools/linux', \
'${ANDROID_BUILD_TOP}')")
DEFINES+=" android_build_type=1"
DEFINES+=" sdk_build=0"
DEFINES+=" android_src=\$(GYP_ABS_ANDROID_TOP_DIR)"
DEFINES+=" android_product_out=NOT_USED_ON_WEBVIEW"
DEFINES+=" android_upstream_bringup=1"
DEFINES+=" android_sdk=\$(GYP_ABS_ANDROID_TOP_DIR)/${ANDROID_SDK}"
DEFINES+=" android_sdk_root=\$(GYP_ABS_ANDROID_TOP_DIR)/${ANDROID_SDK}"
DEFINES+=" android_sdk_tools=\$(GYP_ABS_ANDROID_TOP_DIR)/${ANDROID_SDK_TOOLS}"
DEFINES+=" android_sdk_version=${ANDROID_SDK_VERSION}"
DEFINES+=" android_toolchain=${ANDROID_TOOLCHAIN}"
export GYP_DEFINES="${DEFINES}"
export GYP_GENERATORS="android"
export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} default_target=All"
export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} limit_to_target_all=1"
export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} auto_regeneration=0"
export CHROMIUM_GYP_FILE="${CHROME_SRC}/android_webview/all_webview.gyp"
}
-171
View File
@@ -1,171 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Attach gdb to a running android application. Similar to ndk-gdb.
# Run with --annotate=3 if running under emacs (M-x gdb).
#
# By default it is used to debug content shell, if it is used to
# debug other piceces, '-p' and '-l' options are needed.
# For *unittests_apk (like base_unittests_apk), run with:
# "gdb_apk -p org.chromium.native_test -l out/Release/lib.target -r"
# Run a command through adb shell, strip the extra \r from the output
# and return the correct status code to detect failures. This assumes
# that the adb shell command prints a final \n to stdout.
# args: command to run
# Prints the command's stdout on stdout
# Returns the command's status
# Note: the command's stderr is lost
adb_shell () {
local TMPOUT="$(mktemp)"
local LASTLINE RET
local ADB=${ADB:-adb}
# The weird sed rule is to strip the final \r on each output line
# Since 'adb shell' never returns the command's proper exit/status code,
# we force it to print it as '%%<status>' in the temporary output file,
# which we will later strip from it.
$ADB shell $@ ";" echo "%%\$?" 2>/dev/null | sed -e 's![[:cntrl:]]!!g' > $TMPOUT
# Get last line in log, which contains the exit code from the command
LASTLINE=$(sed -e '$!d' $TMPOUT)
# Extract the status code from the end of the line, which must be '%%<code>'
RET=$(echo "$LASTLINE" | awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,RSTART+2); } }')
# Remove the status code from the last line. Note that this may result in an empty line
LASTLINE=$(echo "$LASTLINE" | awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,1,RSTART-1); } }')
# The output itself: all lines except the status code
sed -e '$d' $TMPOUT && echo -n "$LASTLINE"
# Remove temp file
rm -f $TMPOUT
# Exit with the appropriate status
return $RET
}
adb=$(which adb)
if [[ "$adb" = "" ]] ; then
echo "Need adb in your path"
exit 1
fi
usage() {
echo "usage: ${0##*/} [-p package_name] [-l shared_lib_dir] [-g gdb] [-r]"
echo "-p package_name the android APK package to be debugged"
echo "-l shared_lib_dir directory containes native shared library"
echo "-g gdb_args agruments for gdb, eg: -g '-n -write'"
echo "-r the target device is rooted"
}
process_options() {
local OPTNAME OPTIND OPTERR OPTARG
while getopts ":p:l:g:r" OPTNAME; do
case "$OPTNAME" in
p)
package_name="$OPTARG"
;;
l)
shared_lib_dir="$OPTARG"
;;
g)
gdb_args="$OPTARG"
;;
r)
rooted_phone=1
;;
\:)
echo "'-$OPTARG' needs an argument."
usage
exit 1
;;
*)
echo "invalid command line option: $OPTARG"
usage
exit 1
;;
esac
done
if [ $# -ge ${OPTIND} ]; then
eval echo "Unexpected command line argument: \${${OPTIND}}"
usage
exit 1
fi
}
rooted_phone=0
root=$(dirname $0)/../..
package_name=org.chromium.content_shell
shared_lib_dir=$root/out/${BUILDTYPE:-Debug}/lib.target
gdb_args=''
#process options
process_options "$@"
echo "Debug package $package_name"
echo "Assume native shared library is under $shared_lib_dir"
data_dir=/data/data/$package_name
gdb_server_on_device=$data_dir/lib/gdbserver
# Kill any running gdbserver
pid=$(adb shell ps | awk '/gdbserver/ {print $2}')
if [[ "$pid" != "" ]] ; then
if [[ $rooted_phone -eq 1 ]] ; then
adb shell kill $pid
else
adb shell run-as $package_name kill $pid
fi
fi
pid=$(adb_shell ps | awk "/$package_name$/ {print \$2}")
if [[ "$pid" = "" ]] ; then
echo "No $package_name running?"
echo "Try this: adb shell am start -a android.intent.action.VIEW " \
"-n $package_name/.SomethingActivity (Something might be ContentShell)"
exit 2
fi
no_gdb_server=$(adb shell ls $gdb_server_on_device | grep 'No such file')
if [[ "$no_gdb_server" != "" ]] ; then
echo "No gdb server on device at $gdb_server_on_device"
echo "Please install a debug build."
exit 3
fi
if [[ $rooted_phone -eq 1 ]] ; then
adb shell $gdb_server_on_device :4321 --attach $pid &
adb forward tcp:4321 tcp:4321
else
adb shell run-as $package_name lib/gdbserver +debug-socket --attach $pid &
adb forward tcp:4321 localfilesystem:$data_dir/debug-socket
fi
sleep 2
# Pull app_process and C libraries from device if needed
app_process=${shared_lib_dir}/app_process
if [[ ! -f ${app_process} ]] ; then
adb pull /system/bin/app_process ${app_process}
adb pull /system/lib/libc.so ${shared_lib_dir}
fi
# gdb commands
cmdfile=$(mktemp /tmp/gdb_android_XXXXXXXX)
cat >$cmdfile<<EOF
# set solib-absolute-prefix null
set solib-search-path ${shared_lib_dir}
file ${app_process}
target remote :4321
EOF
gdb=$(echo $ANDROID_TOOLCHAIN/../../linux-x86/bin/*gdb)
if [[ ! -f ${gdb} ]] ; then
echo "Wow no gdb in env var ANDROID_TOOLCHAIN which is $ANDROID_TOOLCHAIN"
exit 4
else
echo Using $gdb
fi
# ${gdb} -x $cmdfile $* $app_process
${gdb} -x $cmdfile $gdb_args
rm $cmdfile
@@ -1,15 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Attach gdb to a running content shell. Redirect to the shell gdb_apk
ROOT=$(cd "$(dirname $0)"; pwd)
if [ $# -gt 0 ]; then
exec ${ROOT}/gdb_apk -r -g "$*"
else
exec ${ROOT}/gdb_apk -r -p org.chromium.content_shell
fi
@@ -1,29 +0,0 @@
# List of suppressions
# Android will not support StackTrace.
StackTrace.*
#
# Sometimes this is automatically generated by run_tests.py
VerifyPathControlledByUserTest.Symlinks
# http://crbug.com/138845
MessagePumpLibeventTest.TestWatchingFromBadThread
StringPrintfTest.StringPrintfMisc
StringPrintfTest.StringAppendfString
StringPrintfTest.StringAppendfInt
StringPrintfTest.StringPrintfBounds
ProcessUtilTest.GetAppOutputRestrictedSIGPIPE
# TODO(jrg): Fails on bots. Works locally. Figure out why. 2/6/12
FieldTrialTest.*
# TODO(zhenghao): Fail from build 6102 r123270. http://crbug.com/115612
StackContainer.BufferAlignment
# Failed on bot since it was first introduced.
FileUtilProxyTest.Touch
# Failing because FD remapping not supported in multiprocess_test_android.cc yet.
ProcessUtilTest.FDRemapping
# Flaky?
ScopedJavaRefTest.RefCounts
# Death tests are not supported with apks.
*DeathTest*
@@ -1,10 +0,0 @@
# Addtional list of suppressions from emulator
#
# Automatically generated by run_tests.py
PathServiceTest.Get
SharedMemoryTest.OpenClose
StringPrintfTest.StringAppendfInt
StringPrintfTest.StringAppendfString
StringPrintfTest.StringPrintfBounds
StringPrintfTest.StringPrintfMisc
VerifyPathControlledByUserTest.Symlinks
@@ -1,21 +0,0 @@
# List of suppressions
AudioRendererHostTest.CreateAndClose
AudioRendererHostTest.CreateAndShutdown
AudioRendererHostTest.CreatePlayAndClose
AudioRendererHostTest.CreatePlayPauseAndClose
AudioRendererHostTest.SetVolume
AudioRendererHostTest.CreatePlayAndShutdown
AudioRendererHostTest.CreatePlayPauseAndShutdown
AudioRendererHostTest.SimulateError
AudioRendererHostTest.SimulateErrorAndClose
# crbug.com/104950
DeviceOrientationProviderTest.ObserverNotRemoved
DeviceOrientationProviderTest.StartFailing
# crbug.com/138930
SkCanvasVideoRendererTest.*
# crbug.com/139095
RenderWidgetTest.OnMsgPaintAtSize
# crbug.com/147549
GamepadProviderTest.PollingAccess
PepperGamepadHostTest.WaitForReply
@@ -1,14 +0,0 @@
# Times out
IPCSyncChannelTest.ChattyServer
# MultiProcessTest related failures. These tests fail if DCHECK is enabled.
IPCChannelPosixTest.AdvancedConnected
IPCChannelPosixTest.ResetState
IPCChannelPosixTest.MultiConnection
IPCFuzzingTest.SanityTest
IPCFuzzingTest.MsgBadPayloadArgs
IPCChannelTest.DescriptorTest
IPCChannelTest.ChannelTest
IPCChannelTest.ChannelProxyTest
IPCChannelTest.SendMessageInChannelConnected
SyncSocketTest.SanityTest
@@ -1,11 +0,0 @@
# List of suppressions
# crbug.com/136720
CrossProcessNotificationMultiProcessTest.Basic
# Death tests are not supported on APK
# http://crbug.com/138855
CompositeFilterDeathTest.*
# http://crbug.com/138833
AesDecryptorTest.*
@@ -1,124 +0,0 @@
# List of suppressions.
# Generated by hand to get net_unittests running initially.
# Likely too aggressive disabling.
DiskCacheBackendTest.*
TransportSecurityStateTest.ParseSidePins*
# TODO(jnd): The following tests are disabled because test server spawner is not
# enabled on Chromium Android. Once the net upstreaming is done, test server
# spawner can be enabled and those tests should pass.
# BUG=135165
X509CertificateTest.*
X509CertificateParseTest.*
HttpNetworkTransactionSpdy2Test.SOCKS4_HTTP_GET
HttpNetworkTransactionSpdy2Test.SOCKS4_SSL_GET
HttpNetworkTransactionSpdy21Test.SOCKS4_HTTP_GET
HttpNetworkTransactionSpdy21Test.SOCKS4_SSL_GET
HttpNetworkTransactionSpdy3Test.SOCKS4_HTTP_GET
HttpNetworkTransactionSpdy3Test.SOCKS4_SSL_GET
HttpNetworkTransactionTest.SOCKS4_HTTP_GET
HttpNetworkTransactionTest.SOCKS4_SSL_GET
HttpNetworkTransactionTest.UploadUnreadableFile
HttpNetworkTransactionTest.UnreadableUploadFileAfterAuthRestart
ProxyResolverJSBindingsTest.MyIpAddress
ProxyScriptFetcherImplTest.*
SOCKSClientSocketTest.*
SSLClientSocketTest.*
PythonUtils.PythonRunTime
URLRequestTestHTTP.*
URLRequestTestFTP.*
HTTPSRequestTest.HTTPSMismatchedTest
HTTPSRequestTest.HTTPSExpiredTest
HTTPSRequestTest.HTTPSPreloadedHSTSTest
HTTPSRequestTest.ClientAuthTest
URLRequestTest.DelayedCookieCallback
URLRequestTest.DoNotSendCookies
URLRequestTest.DoNotSaveCookies
URLRequestTest.DoNotSendCookies_ViaPolicy
URLRequestTest.DoNotSaveCookies_ViaPolicy
URLRequestTest.DoNotSaveEmptyCookies
URLRequestTest.DoNotSendCookies_ViaPolicy_Async
URLRequestTest.DoNotSaveCookies_ViaPolicy_Async
URLRequestTest.DoNotOverrideReferrer
WebSocketJobSpdy2Test.ThrottlingWebSocket
WebSocketJobSpdy2Test.ThrottlingWebSocketSpdyEnabled
WebSocketJobSpdy2Test.ThrottlingSpdy
WebSocketJobSpdy2Test.ThrottlingSpdySpdyEnabled
WebSocketJobSpdy3Test.ThrottlingWebSocket
WebSocketJobSpdy3Test.ThrottlingWebSocketSpdyEnabled
WebSocketJobSpdy3Test.ThrottlingSpdy
WebSocketJobSpdy3Test.ThrottlingSpdySpdyEnabled
WebSocketJobTest.ThrottlingWebSocket
WebSocketJobTest.ThrottlingWebSocketSpdyEnabled
WebSocketJobTest.ThrottlingSpdy
WebSocketJobTest.ThrottlingSpdySpdyEnabled
X509CertificateWeakDigestTest.*
*/X509CertificateWeakDigestTest.*
TransportSecurityStateTest.BogusPinsHeaders
TransportSecurityStateTest.ValidPinsHeadersSHA1
TransportSecurityStateTest.ValidPinsHeadersSHA256
HTTPSRequestTest.ResumeTest
HTTPSRequestTest.SSLSessionCacheShardTest
HTTPSRequestTest.HTTPSErrorsNoClobberTSSTest
HttpNetworkTransactionSpdy3Test.UploadUnreadableFile
HttpNetworkTransactionSpdy2Test.UploadUnreadableFile
HTTPSRequestTest.SSLv3Fallback
HTTPSEVCRLSetTest.FreshCRLSet
HTTPSCRLSetTest.ExpiredCRLSet
URLFetcherTest.SameThreadsTest
URLFetcherTest.DifferentThreadsTest
URLFetcherTest.CancelAll
URLFetcherPostTest.Basic
URLFetcherUploadProgressTest.Basic
URLFetcherDownloadProgressTest.Basic
URLFetcherDownloadProgressCancelTest.CancelWhileProgressReport
URLFetcherHeadersTest.Headers
URLFetcherSocketAddressTest.SocketAddress
URLFetcherStopOnRedirectTest.StopOnRedirect
URLFetcherProtectTest.Overload
URLFetcherProtectTest.ServerUnavailable
URLFetcherProtectTestPassedThrough.ServerUnavailablePropagateResponse
URLFetcherBadHTTPSTest.BadHTTPSTest
URLFetcherCancelTest.ReleasesContext
URLFetcherCancelTest.CancelWhileDelayedStartTaskPending
URLFetcherMultipleAttemptTest.SameData
URLFetcherFileTest.SmallGet
URLFetcherFileTest.LargeGet
URLFetcherFileTest.CantakeOfFile
URLFetcherFileTest.OverwriteExistingFile
URLFetcherFileTest.TryToOverwriteDirectory
URLFetcherFileTest.SmallGetToTempFile
URLFetcherFileTest.LargeGetToTempFile
URLFetcherFileTest.CantakeOfTempFile
URLFetcherEmptyPostTest.Basic
# TODO(jrg): Fails on bots. Works locally. Figure out why. 2/6/12
HttpCache.TypicalGET_ConditionalRequest
HttpCache.RangeGET_OK
HttpCache.RangeGET_SyncOK
HttpCache.RangeGET_Revalidate2
HttpCache.RangeGET_Previous200
HttpCache.RangeGET_Cancel2
# crbug.com/139144
UDPSocketTest.Broadcast
UDPSocketTest.ConnectRandomBind
UDPSocketTest.ClientGetLocalPeerAddresses
# Disabled 4/13/12 by jrg. More CertVerifyProcTest.* tests fail on
# the bot than locally; disabling them all for now.
CertVerifyProcTest.*
# Runs fine locally but not on the bot.
VerifyRoot/CertVerifyProcWeakDigestTest.*
# Relies on TestServer which isn't yet configured upstream.
URLRequestContextBuilderTest.*
# All cert_verify_proc_unittest.cc failing since JNI was enabled.
VerifyIntermediate/CertVerifyProcWeakDigestTest.*
VerifyEndEntity/CertVerifyProcWeakDigestTest.*
VerifyIncompleteIntermediate/CertVerifyProcWeakDigestTest.*
VerifyIncompleteEndEntity/CertVerifyProcWeakDigestTest.*
VerifyMixed/CertVerifyProcWeakDigestTest.*
# Death tests are not supported with apks.
*DeathTest*
# These are death tests and thus also disabled.
PrioritizedDispatcherTest.CancelNull
PrioritizedDispatcherTest.CancelMissing
@@ -1,4 +0,0 @@
SyncHttpBridgeTest.*
# crbug.com/144422
OnDiskSyncableDirectory.FailInitialWrite
@@ -1,44 +0,0 @@
# List of suppressions
# This file was automatically generated by build/android/run_tests.py
BytesFormattingTest.FormatBytes
CanvasTest.StringSizeEmptyString
CanvasTest.StringWidth
ClipboardTest.RTFTest
FontListTest.FontDescString_FromFont
FontListTest.FontDescString_FromFontVector
FontListTest.FontDescString_FromFontWithNonNormalStyle
FontListTest.Fonts_DeriveFontList
FontListTest.Fonts_DeriveFontListWithSize
FontListTest.Fonts_DescStringWithStyleInFlexibleFormat_RoundTrip
FontListTest.Fonts_FontVector_RoundTrip
FontListTest.Fonts_FromDescString
FontListTest.Fonts_FromDescStringInFlexibleFormat
FontListTest.Fonts_FromDescStringWithStyleInFlexibleFormat
FontListTest.Fonts_FromFont
FontListTest.Fonts_FromFontVector
FontListTest.Fonts_FromFontWithNonNormalStyle
FontListTest.Fonts_GetStyle
FontTest.Ascent
FontTest.AvgCharWidth
FontTest.AvgWidths
FontTest.Height
FontTest.LoadArial
FontTest.LoadArialBold
FontTest.Widths
L10nUtilTest.GetDisplayNameForCountry
L10nUtilTest.GetDisplayNameForLocale
ResourceBundle.DelegateGetFont
TextEliderTest.ElideEmail
TextEliderTest.ElideEmailMoreSpace
TextEliderTest.ElideRectangleText
TextEliderTest.ElideRectangleTextLongWords
TextEliderTest.ElideRectangleTextPunctuation
TextEliderTest.ElideTextLongStrings
TextEliderTest.ElideTextSurrogatePairs
TextEliderTest.ElideTextTruncate
TextEliderTest.TestFileURLEliding
TextEliderTest.TestFilenameEliding
TextEliderTest.TestGeneralEliding
TextEliderTest.TestMoreEliding
TextEliderTest.TestTrailingEllipsisSlashEllipsisHack
TreeNodeIteratorPruneTest.Test
@@ -1,149 +0,0 @@
# List of suppressions
# crbug.com/139429
BrowserMainTest.WarmConnectionFieldTrial_Invalid
BrowserMainTest.WarmConnectionFieldTrial_Random
BrowserMainTest.WarmConnectionFieldTrial_WarmestSocket
# crbug.com/139431
ChromePaths.UserCacheDir
# The UDP related tests currently do not work on Android because
# we lack a UDP forwarder tool.
NetworkStatsTestUDP.*
# Missing test resource of 16MB.
HistoryProfileTest.TypicalProfileVersion
# crbug.com/139408
SQLitePersistentCookieStoreTest.TestDontLoadOldSessionCookies
SQLitePersistentCookieStoreTest.PersistIsPersistent
# http://crbug.com/117940
TemplateURLTest.*
TemplateURLPrepopulateDataTest.*
TemplateURLServiceSyncTest.*
SearchHostToURLsMapTest.*
# crbug.com/139427
TemplateURLFetcherTest.*
# crbug.com/139433
AutofillTableTest.AutofillProfile*
AutofillTableTest.UpdateAutofillProfile
# crbug.com/139400
AutofillProfileTest.*
CreditCardTest.SetInfoExpirationMonth
# crbug.com/139398
DownloadItemModelTest.InterruptTooltip
# Tests crashing in the APK
# DEATH test, forking and doing bad stuff, not supported yet.
IncognitoModePrefsDeathTest.GetAvailabilityBadValue
# l10n_util.cc(655)] Check failed: std::string::npos != pos
DownloadItemModelTest.InterruptStatus
# l10n_util.cc(655)] Check failed: std::string::npos != pos
WebsiteSettingsTest.OnSiteDataAccessed
# Tests failing in the APK (mostly failing to create files out of the Application dir).
DiagnosticsModelTest.RunAll
FirstRunTest.RemoveSentinel
GoogleUpdateTest.StatsConsent
URLFixerUpperTest.FixupFile
URLFixerUpperTest.FixupRelativeFile
DownloadPathReservationTrackerTest.CreateDefaultDownloadPath
# crbug.com/139423
ValueStoreFrontendTest.GetExistingData
# crbug.com/139421
ChromeSelectFilePolicyTest.ExpectAsynchronousListenerCall
# http://crbug.com/139033
ChromeDownloadManagerDelegateTest.StartDownload_PromptAlways
# http://crbug.com/139165
KeywordEditorControllerTest.*
# Extension support is limited on Android.
# Some of these can be enabled if we register extension related prefs in
# browser_prefs.cc
ExtensionTest.*
ExtensionAPI.*
ExtensionFileUtil.*
ExtensionPermissionsTest.*
ExtensionUnpackerTest.*
ActiveTabTest.*
ExtensionAppsPromo.*
ComponentLoaderTest.*
ExtensionFromUserScript.*
ExtensionFromWebApp.*
ExtensionIconManagerTest.*
ExtensionServiceTest.*
ExtensionServiceTestSimple.*
ExtensionSourcePriorityTest.*
ExtensionSpecialStoragePolicyTest.*
ExternalPolicyProviderTest.*
MenuManagerTest.*
PageActionControllerTest.*
PermissionsUpdaterTest.*
ImageLoadingTrackerTest.*
ScriptBadgeControllerTest.*
ExtensionSettingsFrontendTest.*
ExtensionSettingsSyncTest.*
ExtensionUpdaterTest.*
UserScriptListenerTest.*
WebApplicationTest.GetShortcutInfoForTab
ExtensionActionIconFactoryTest.*
# crbug.com/139411
AutocompleteProviderTest.*
HistoryContentsProviderBodyOnlyTest.*
HistoryContentsProviderTest.*
HQPOrderingTest.*
SearchProviderTest.*
# Test server and forwarder and not ready yet.
ProtocolHandlerRegistryTest.TestOSRegistrationFailure
ConnectionTesterTest.*
HttpPipeliningCompatibilityClientTest.*
NetworkStatsTestTCP.*
ConnectionTesterTest.RunAllTests
# crbug.com/139418
SQLiteServerBoundCertStoreTest.TestUpgradeV1
SQLiteServerBoundCertStoreTest.TestUpgradeV2
ProfileSyncComponentsFactoryImplTest.*
PermissionsTest.GetWarningMessages_Plugins
ImageOperations.ResizeShouldAverageColors
# crbug.com/138275
PrerenderTest.*
RenderWidgetTest.OnMsgPaintAtSize
# crbug.com/146857
TopSitesTest.Blacklisting
# crbug.com/139643
VariationsUtilTest.DisableAfterInitialization
VariationsUtilTest.AssociateGoogleVariationID
VariationsUtilTest.NoAssociation
# crbug.com/141473
AutofillManagerTest.UpdatePasswordSyncState
AutofillManagerTest.UpdatePasswordGenerationState
# crbug.com/144227
ExtensionIconImageTest.*
# crbug.com/145843
EntropyProviderTest.UseOneTimeRandomizationSHA1
EntropyProviderTest.UseOneTimeRandomizationPermuted
# crbug.com/147500
ManifestTest.RestrictedKeys
# crbug.com/152599
SyncSearchEngineDataTypeControllerTest.*
@@ -1,253 +0,0 @@
#!/usr/bin/env python
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Provides a convenient wrapper for spawning a test lighttpd instance.
Usage:
lighttpd_server PATH_TO_DOC_ROOT
"""
import codecs
import contextlib
import http.client
import os
import random
import shutil
import socket
import subprocess
import sys
import tempfile
import time
from pylib import constants
from pylib import pexpect
class LighttpdServer(object):
"""Wraps lighttpd server, providing robust startup.
Args:
document_root: Path to root of this server's hosted files.
port: TCP port on the _host_ machine that the server will listen on. If
ommitted it will attempt to use 9000, or if unavailable it will find
a free port from 8001 - 8999.
lighttpd_path, lighttpd_module_path: Optional paths to lighttpd binaries.
base_config_path: If supplied this file will replace the built-in default
lighttpd config file.
extra_config_contents: If specified, this string will be appended to the
base config (default built-in, or from base_config_path).
config_path, error_log, access_log: Optional paths where the class should
place temprary files for this session.
"""
def __init__(self, document_root, port=None,
lighttpd_path=None, lighttpd_module_path=None,
base_config_path=None, extra_config_contents=None,
config_path=None, error_log=None, access_log=None):
self.temp_dir = tempfile.mkdtemp(prefix='lighttpd_for_chrome_android')
self.document_root = os.path.abspath(document_root)
self.fixed_port = port
self.port = port or constants.LIGHTTPD_DEFAULT_PORT
self.server_tag = 'LightTPD ' + str(random.randint(111111, 999999))
self.lighttpd_path = lighttpd_path or '/usr/sbin/lighttpd'
self.lighttpd_module_path = lighttpd_module_path or '/usr/lib/lighttpd'
self.base_config_path = base_config_path
self.extra_config_contents = extra_config_contents
self.config_path = config_path or self._Mktmp('config')
self.error_log = error_log or self._Mktmp('error_log')
self.access_log = access_log or self._Mktmp('access_log')
self.pid_file = self._Mktmp('pid_file')
self.process = None
def _Mktmp(self, name):
return os.path.join(self.temp_dir, name)
def _GetRandomPort(self):
# The ports of test server is arranged in constants.py.
return random.randint(constants.LIGHTTPD_RANDOM_PORT_FIRST,
constants.LIGHTTPD_RANDOM_PORT_LAST)
def StartupHttpServer(self):
"""Starts up a http server with specified document root and port."""
# If we want a specific port, make sure no one else is listening on it.
if self.fixed_port:
self._KillProcessListeningOnPort(self.fixed_port)
while True:
if self.base_config_path:
# Read the config
with codecs.open(self.base_config_path, 'r', 'utf-8') as f:
config_contents = f.read()
else:
config_contents = self._GetDefaultBaseConfig()
if self.extra_config_contents:
config_contents += self.extra_config_contents
# Write out the config, filling in placeholders from the members of |self|
with codecs.open(self.config_path, 'w', 'utf-8') as f:
f.write(config_contents % self.__dict__)
if (not os.path.exists(self.lighttpd_path) or
not os.access(self.lighttpd_path, os.X_OK)):
raise EnvironmentError(
'Could not find lighttpd at %s.\n'
'It may need to be installed (e.g. sudo apt-get install lighttpd)'
% self.lighttpd_path)
self.process = pexpect.spawn(self.lighttpd_path,
['-D', '-f', self.config_path,
'-m', self.lighttpd_module_path],
cwd=self.temp_dir)
client_error, server_error = self._TestServerConnection()
if not client_error:
assert int(open(self.pid_file, 'r').read()) == self.process.pid
break
self.process.close()
if self.fixed_port or not 'in use' in server_error:
print('Client error:', client_error)
print('Server error:', server_error)
return False
self.port = self._GetRandomPort()
return True
def ShutdownHttpServer(self):
"""Shuts down our lighttpd processes."""
if self.process:
self.process.terminate()
shutil.rmtree(self.temp_dir, ignore_errors=True)
def _TestServerConnection(self):
# Wait for server to start
server_msg = ''
for timeout in range(1, 5):
client_error = None
try:
with contextlib.closing(http.client.HTTPConnection(
'127.0.0.1', self.port, timeout=timeout)) as http:
http.set_debuglevel(timeout > 3)
http.request('HEAD', '/')
r = http.getresponse()
r.read()
if (r.status == 200 and r.reason == 'OK' and
r.getheader('Server') == self.server_tag):
return (None, server_msg)
client_error = ('Bad response: %s %s version %s\n ' %
(r.status, r.reason, r.version) +
'\n '.join([': '.join(h) for h in r.getheaders()]))
except (http.client.HTTPException, socket.error) as client_error:
pass # Probably too quick connecting: try again
# Check for server startup error messages
ix = self.process.expect([pexpect.TIMEOUT, pexpect.EOF, '.+'],
timeout=timeout)
if ix == 2: # stdout spew from the server
server_msg += self.process.match.group(0)
elif ix == 1: # EOF -- server has quit so giveup.
client_error = client_error or 'Server exited'
break
return (client_error or 'Timeout', server_msg)
def _KillProcessListeningOnPort(self, port):
"""Checks if there is a process listening on port number |port| and
terminates it if found.
Args:
port: Port number to check.
"""
if subprocess.call(['fuser', '-kv', '%d/tcp' % port]) == 0:
# Give the process some time to terminate and check that it is gone.
time.sleep(2)
assert subprocess.call(['fuser', '-v', '%d/tcp' % port]) != 0, \
'Unable to kill process listening on port %d.' % port
def _GetDefaultBaseConfig(self):
return """server.tag = "%(server_tag)s"
server.modules = ( "mod_access",
"mod_accesslog",
"mod_alias",
"mod_cgi",
"mod_rewrite" )
# default document root required
#server.document-root = "."
# files to check for if .../ is requested
index-file.names = ( "index.php", "index.pl", "index.cgi",
"index.html", "index.htm", "default.htm" )
# mimetype mapping
mimetype.assign = (
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".svg" => "image/svg+xml",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".xhtml" => "application/xhtml+xml",
".xhtmlmp" => "application/vnd.wap.xhtml+xml",
".js" => "application/x-javascript",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".manifest" => "text/cache-manifest",
)
# Use the "Content-Type" extended attribute to obtain mime type if possible
mimetype.use-xattr = "enable"
##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".php", ".pl", ".cgi" )
server.bind = "127.0.0.1"
server.port = %(port)s
## virtual directory listings
dir-listing.activate = "enable"
#dir-listing.encoding = "iso-8859-2"
#dir-listing.external-css = "style/oldstyle.css"
## enable debugging
#debug.log-request-header = "enable"
#debug.log-response-header = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found = "enable"
#### SSL engine
#ssl.engine = "enable"
#ssl.pemfile = "server.pem"
# Autogenerated test-specific config follows.
cgi.assign = ( ".cgi" => "/usr/bin/env",
".pl" => "/usr/bin/env",
".asis" => "/bin/cat",
".php" => "/usr/bin/php-cgi" )
server.errorlog = "%(error_log)s"
accesslog.filename = "%(access_log)s"
server.upload-dirs = ( "/tmp" )
server.pid-file = "%(pid_file)s"
server.document-root = "%(document_root)s"
"""
def main(argv):
server = LighttpdServer(*argv[1:])
try:
if server.StartupHttpServer():
input('Server running at http://127.0.0.1:%s -'
' press Enter to exit it.' % server.port)
else:
print('Server exit code:', server.process.exitstatus)
finally:
server.ShutdownHttpServer()
if __name__ == '__main__':
sys.exit(main(sys.argv))
@@ -1,4 +0,0 @@
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
File diff suppressed because it is too large. Load diff
@@ -1,142 +0,0 @@
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Gathers information about APKs."""
import collections
import os
import re
from . import cmd_helper
class ApkInfo(object):
"""Helper class for inspecting APKs."""
_PROGUARD_PATH = os.path.join(os.environ['ANDROID_SDK_ROOT'],
'tools/proguard/bin/proguard.sh')
if not os.path.exists(_PROGUARD_PATH):
_PROGUARD_PATH = os.path.join(os.environ['ANDROID_BUILD_TOP'],
'external/proguard/bin/proguard.sh')
_PROGUARD_CLASS_RE = re.compile(r'\s*?- Program class:\s*([\S]+)$')
_PROGUARD_METHOD_RE = re.compile(r'\s*?- Method:\s*(\S*)[(].*$')
_PROGUARD_ANNOTATION_RE = re.compile(r'\s*?- Annotation \[L(\S*);\]:$')
_PROGUARD_ANNOTATION_CONST_RE = re.compile(r'\s*?- Constant element value.*$')
_PROGUARD_ANNOTATION_VALUE_RE = re.compile(r'\s*?- \S+? \[(.*)\]$')
_AAPT_PACKAGE_NAME_RE = re.compile(r'package: .*name=\'(\S*)\'')
def __init__(self, apk_path, jar_path):
if not os.path.exists(apk_path):
raise Exception('%s not found, please build it' % apk_path)
self._apk_path = apk_path
if not os.path.exists(jar_path):
raise Exception('%s not found, please build it' % jar_path)
self._jar_path = jar_path
self._annotation_map = collections.defaultdict(list)
self._test_methods = []
self._Initialize()
def _Initialize(self):
proguard_output = cmd_helper.GetCmdOutput([self._PROGUARD_PATH,
'-injars', self._jar_path,
'-dontshrink',
'-dontoptimize',
'-dontobfuscate',
'-dontpreverify',
'-dump',
]).split('\n')
clazz = None
method = None
annotation = None
has_value = False
qualified_method = None
for line in proguard_output:
m = self._PROGUARD_CLASS_RE.match(line)
if m:
clazz = m.group(1).replace('/', '.') # Change package delim.
annotation = None
continue
m = self._PROGUARD_METHOD_RE.match(line)
if m:
method = m.group(1)
annotation = None
qualified_method = clazz + '#' + method
if method.startswith('test') and clazz.endswith('Test'):
self._test_methods += [qualified_method]
continue
m = self._PROGUARD_ANNOTATION_RE.match(line)
if m:
assert qualified_method
annotation = m.group(1).split('/')[-1] # Ignore the annotation package.
self._annotation_map[qualified_method].append(annotation)
has_value = False
continue
if annotation:
assert qualified_method
if not has_value:
m = self._PROGUARD_ANNOTATION_CONST_RE.match(line)
if m:
has_value = True
else:
m = self._PROGUARD_ANNOTATION_VALUE_RE.match(line)
if m:
value = m.group(1)
self._annotation_map[qualified_method].append(
annotation + ':' + value)
has_value = False
def _GetAnnotationMap(self):
return self._annotation_map
def _IsTestMethod(self, test):
class_name, method = test.split('#')
return class_name.endswith('Test') and method.startswith('test')
def GetApkPath(self):
return self._apk_path
def GetPackageName(self):
"""Returns the package name of this APK."""
aapt_output = cmd_helper.GetCmdOutput(
['aapt', 'dump', 'badging', self._apk_path]).split('\n')
for line in aapt_output:
m = self._AAPT_PACKAGE_NAME_RE.match(line)
if m:
return m.group(1)
raise Exception('Failed to determine package name of %s' % self._apk_path)
def GetTestAnnotations(self, test):
"""Returns a list of all annotations for the given |test|. May be empty."""
if not self._IsTestMethod(test):
return []
return self._GetAnnotationMap()[test]
def _AnnotationsMatchFilters(self, annotation_filter_list, annotations):
"""Checks if annotations match any of the filters."""
if not annotation_filter_list:
return True
for annotation_filter in annotation_filter_list:
filters = annotation_filter.split('=')
if len(filters) == 2:
key = filters[0]
value_list = filters[1].split(',')
for value in value_list:
if key + ':' + value in annotations:
return True
elif annotation_filter in annotations:
return True
return False
def GetAnnotatedTests(self, annotation_filter_list):
"""Returns a list of all tests that match the given annotation filters."""
return [test for test, annotations in self._GetAnnotationMap().items()
if self._IsTestMethod(test) and self._AnnotationsMatchFilters(
annotation_filter_list, annotations)]
def GetTestMethods(self):
"""Returns a list of all test methods in this apk as Class#testMethod."""
return self._test_methods
@staticmethod
def IsPythonDrivenTest(test):
return 'pythonDrivenTests' in test
Loaded 100 of 653 files, more files were not shown because too many files have changed in this diff. Show more