Import Cobalt 3.16138
Change-Id: Iad7893b4f903845cfb7cbda22d7f5e4153ed8dea
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 7949da2..0e1bd9d 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -296,6 +296,8 @@
}
void BrowserModule::Navigate(const GURL& url) {
+ web_module_loaded_.Reset();
+
// Always post this as a task in case this is being called from the WebModule.
self_message_loop_->PostTask(
FROM_HERE, base::Bind(&BrowserModule::NavigateInternal, weak_this_, url));
@@ -326,8 +328,6 @@
void BrowserModule::NavigateInternal(const GURL& url) {
DCHECK_EQ(MessageLoop::current(), self_message_loop_);
- web_module_loaded_.Reset();
-
// First try the registered handlers (e.g. for h5vcc://). If one of these
// handles the URL, we don't use the web module.
if (TryURLHandlers(url)) {
@@ -391,9 +391,11 @@
web_module_loaded_.Signal();
}
+#if defined(ENABLE_WEBDRIVER)
bool BrowserModule::WaitForLoad(const base::TimeDelta& timeout) {
return web_module_loaded_.TimedWait(timeout);
}
+#endif
#if defined(ENABLE_SCREENSHOT)
void BrowserModule::RequestScreenshotToFile(const FilePath& path,
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index 5d39973..0a0584c 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -134,10 +134,12 @@
// Called when the WebModule's Window.onload event is fired.
void OnLoad();
+#if defined(ENABLE_WEBDRIVER)
// Wait for the onload event to be fired with the specified timeout. If the
// webmodule is not currently loading the document, this will return
// immediately.
bool WaitForLoad(const base::TimeDelta& timeout);
+#endif
// Glue function to deal with the production of the main render tree,
// and will manage handing it off to the renderer.
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index f9b0452..389d8f5 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-12305
\ No newline at end of file
+16138
\ No newline at end of file
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/google_logging.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/google_logging.cc
index bab22ce..bc53d2f 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/google_logging.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/google_logging.cc
@@ -19,7 +19,9 @@
base::StringAppendV(&message, format, ap);
va_end(ap);
- logging::LogMessage(file, line,
- fatal ? logging::LOG_FATAL : logging::LOG_INFO).stream()
- << message;
+ if (fatal) {
+ logging::LogMessage(file, line, logging::LOG_FATAL).stream() << message;
+ } else if (DLOG_IS_ON(INFO)) {
+ logging::LogMessage(file, line, logging::LOG_INFO).stream() << message;
+ }
}
diff --git a/src/cobalt/script/mozjs/mozjs_global_environment.cc b/src/cobalt/script/mozjs/mozjs_global_environment.cc
index 25fa34b..ebcc75f 100644
--- a/src/cobalt/script/mozjs/mozjs_global_environment.cc
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.cc
@@ -238,6 +238,58 @@
return success;
}
+bool MozjsGlobalEnvironment::EvaluateScript(
+ const scoped_refptr<SourceCode>& source_code,
+ const scoped_refptr<Wrappable>& owning_object,
+ base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ JSAutoRequest auto_request(context_);
+ JSAutoCompartment auto_compartment(context_, global_object_proxy_);
+ JSExceptionState* previous_exception_state = JS_SaveExceptionState(context_);
+ JS::RootedValue result_value(context_);
+ if (!EvaluateScriptInternal(source_code, &result_value)) {
+ return false;
+ }
+ if (out_opaque_handle) {
+ JS::RootedObject js_object(context_);
+ JS_ValueToObject(context_, result_value, js_object.address());
+ MozjsObjectHandleHolder mozjs_object_holder(js_object, context_,
+ wrapper_factory());
+ out_opaque_handle->emplace(owning_object.get(), mozjs_object_holder);
+ }
+ JS_RestoreExceptionState(context_, previous_exception_state);
+ return true;
+}
+
+bool MozjsGlobalEnvironment::EvaluateScriptInternal(
+ const scoped_refptr<SourceCode>& source_code,
+ JS::MutableHandleValue out_result) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(global_object_proxy_);
+ MozjsSourceCode* mozjs_source_code =
+ base::polymorphic_downcast<MozjsSourceCode*>(source_code.get());
+
+ const std::string& script = mozjs_source_code->source_utf8();
+ const base::SourceLocation location = mozjs_source_code->location();
+
+ JS::RootedObject global_object(
+ context_, js::GetProxyTargetObject(global_object_proxy_));
+
+ size_t length = script.size();
+ jschar* inflated_buffer =
+ js::InflateUTF8String(context_, script.c_str(), &length);
+ DCHECK(inflated_buffer);
+ bool success = false;
+ if (inflated_buffer) {
+ success = JS_EvaluateUCScript(context_, global_object, inflated_buffer,
+ length, location.file_path.c_str(),
+ location.line_number, out_result.address());
+ js_free(inflated_buffer);
+ }
+
+ return success;
+}
+
std::vector<StackFrame> MozjsGlobalEnvironment::GetStackTrace(int max_frames) {
DCHECK(thread_checker_.CalledOnValidThread());
return util::GetStackTrace(context_, max_frames);
@@ -321,7 +373,7 @@
if (global_object_proxy_ && garbage_collection_count_ == 1) {
DCHECK(!opaque_root_state_);
JSAutoRequest auto_request(context_);
- JSAutoCompartment auto_comparment(context_, global_object_proxy_);
+ JSAutoCompartment auto_compartment(context_, global_object_proxy_);
// Get the current state of opaque root relationships. Keep this object
// alive for the duration of the GC phase to ensure that reachability
// between roots and reachable objects is maintained.
diff --git a/src/cobalt/script/mozjs/mozjs_global_environment.h b/src/cobalt/script/mozjs/mozjs_global_environment.h
index 54f75de..d13d7f0 100644
--- a/src/cobalt/script/mozjs/mozjs_global_environment.h
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.h
@@ -56,10 +56,7 @@
bool EvaluateScript(const scoped_refptr<SourceCode>& script_utf8,
const scoped_refptr<Wrappable>& owning_object,
base::optional<OpaqueHandleHolder::Reference>*
- out_opaque_handle) OVERRIDE {
- NOTIMPLEMENTED();
- return false;
- }
+ out_opaque_handle) OVERRIDE;
std::vector<StackFrame> GetStackTrace(int max_frames = 0) OVERRIDE;
@@ -133,7 +130,10 @@
// with an error that eval() is disabled.
static JSBool CheckEval(JSContext* context);
- protected:
+ private:
+ bool EvaluateScriptInternal(const scoped_refptr<SourceCode>& source_code,
+ JS::MutableHandleValue out_result);
+
static void ReportErrorHandler(JSContext* context, const char* message,
JSErrorReport* report);
diff --git a/src/nb/reuse_allocator.cc b/src/nb/reuse_allocator.cc
index 61a40a6..988d530 100644
--- a/src/nb/reuse_allocator.cc
+++ b/src/nb/reuse_allocator.cc
@@ -196,21 +196,8 @@
}
void ReuseAllocator::Free(void* memory) {
- if (!memory) {
- return;
- }
-
- AllocatedBlockMap::iterator it = allocated_blocks_.find(memory);
- SB_DCHECK(it != allocated_blocks_.end());
-
- // Mark this block as free and remove it from the allocated set.
- const MemoryBlock& block = (*it).second;
- AddFreeBlock(block.address, block.size);
-
- SB_DCHECK(block.size <= total_allocated_);
- total_allocated_ -= block.size;
-
- allocated_blocks_.erase(it);
+ bool result = TryFree(memory);
+ SB_DCHECK(result);
}
void ReuseAllocator::PrintAllocations() const {
@@ -232,4 +219,25 @@
SB_LOG(INFO) << "Total allocations: " << allocated_blocks_.size();
}
+bool ReuseAllocator::TryFree(void* memory) {
+ if (!memory) {
+ return true;
+ }
+
+ AllocatedBlockMap::iterator it = allocated_blocks_.find(memory);
+ if (it == allocated_blocks_.end()) {
+ return false;
+ }
+
+ // Mark this block as free and remove it from the allocated set.
+ const MemoryBlock& block = (*it).second;
+ AddFreeBlock(block.address, block.size);
+
+ SB_DCHECK(block.size <= total_allocated_);
+ total_allocated_ -= block.size;
+
+ allocated_blocks_.erase(it);
+ return true;
+}
+
} // namespace nb
diff --git a/src/nb/reuse_allocator.h b/src/nb/reuse_allocator.h
index 6f4f16a..942bc45 100644
--- a/src/nb/reuse_allocator.h
+++ b/src/nb/reuse_allocator.h
@@ -49,6 +49,8 @@
void PrintAllocations() const;
+ bool TryFree(void* memory);
+
private:
// We will allocate from the given allocator whenever we can't find
// pre-used memory to allocate.
diff --git a/src/net/socket/tcp_client_socket_starboard.cc b/src/net/socket/tcp_client_socket_starboard.cc
index 042acd7..516be9d 100644
--- a/src/net/socket/tcp_client_socket_starboard.cc
+++ b/src/net/socket/tcp_client_socket_starboard.cc
@@ -48,8 +48,10 @@
SbSocketSetTcpNoDelay(socket, true);
SbSocketSetTcpKeepAlive(socket, true, kTCPKeepAliveDuration);
SbSocketSetTcpWindowScaling(socket, true);
- SbSocketSetReceiveBufferSize(socket,
- TCPClientSocketStarboard::kReceiveBufferSize);
+ if (TCPClientSocketStarboard::kReceiveBufferSize != 0) {
+ SbSocketSetReceiveBufferSize(socket,
+ TCPClientSocketStarboard::kReceiveBufferSize);
+ }
return 0;
}
diff --git a/src/starboard/linux/shared/configuration_public.h b/src/starboard/linux/shared/configuration_public.h
index 624909f..468f0c6 100644
--- a/src/starboard/linux/shared/configuration_public.h
+++ b/src/starboard/linux/shared/configuration_public.h
@@ -340,8 +340,19 @@
// --- Tuneable Parameters ---------------------------------------------------
-// Specifies the network receive buffer size.
-#define SB_NETWORK_RECEIVE_BUFFER_SIZE (16 * 1024)
+// Specifies the network receive buffer size in bytes, set via
+// SbSocketSetReceiveBufferSize().
+//
+// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
+// not be called. Use this for OSs (such as Linux) where receive buffer
+// auto-tuning is better.
+//
+// On some platforms, this may affect max TCP window size which may
+// dramatically affect throughput in the presence of latency.
+//
+// If your platform does not have a good TCP auto-tuning mechanism,
+// a setting of (128 * 1024) here is recommended.
+#define SB_NETWORK_RECEIVE_BUFFER_SIZE (0)
// --- User Configuration ----------------------------------------------------
diff --git a/src/starboard/nplb/socket_send_to_test.cc b/src/starboard/nplb/socket_send_to_test.cc
index b7b2f06..9db1d36 100644
--- a/src/starboard/nplb/socket_send_to_test.cc
+++ b/src/starboard/nplb/socket_send_to_test.cc
@@ -15,19 +15,78 @@
// SendTo is largely tested with ReceiveFrom, so look there for more invovled
// tests.
+#include "starboard/memory.h"
+#include "starboard/nplb/socket_helpers.h"
#include "starboard/socket.h"
+#include "starboard/thread.h"
+#include "starboard/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
namespace nplb {
namespace {
+// Thread entry point to continuously write to a socket that is expected to
+// be closed on another thread.
+void* SendToServerSocketEntryPoint(void* trio_as_void_ptr) {
+ ConnectedTrio* trio = static_cast<ConnectedTrio*>(trio_as_void_ptr);
+ // The contents of this buffer are inconsequential.
+ const size_t kBufSize = 1024;
+ char* send_buf = new char[kBufSize];
+ SbMemorySet(send_buf, 0, kBufSize);
+
+ // Continue sending to the socket until it fails to send. It's expected that
+ // SbSocketSendTo will fail when the server socket closes, but the application
+ // should
+ // not terminate.
+ SbTime start = SbTimeGetNow();
+ SbTime now = start;
+ SbTime kTimeout = kSbTimeSecond;
+ int result = 0;
+ while (result >= 0 && (now - start < kTimeout)) {
+ result = SbSocketSendTo(trio->server_socket, send_buf, kBufSize, NULL);
+ now = SbTimeGetNow();
+ }
+
+ delete[] send_buf;
+ return NULL;
+}
+
TEST(SbSocketSendToTest, RainyDayInvalidSocket) {
char buf[16];
int result = SbSocketSendTo(NULL, buf, sizeof(buf), NULL);
EXPECT_EQ(-1, result);
}
+TEST(SbSocketSendToTest, RainyDaySendToClosedSocket) {
+ ConnectedTrio trio =
+ CreateAndConnect(GetPortNumberForTests(), kSocketTimeout);
+ EXPECT_NE(trio.client_socket, kSbSocketInvalid);
+ EXPECT_NE(trio.server_socket, kSbSocketInvalid);
+ EXPECT_NE(trio.listen_socket, kSbSocketInvalid);
+
+ // We don't need the listen socket, so close it.
+ EXPECT_TRUE(SbSocketDestroy(trio.listen_socket));
+
+ // Start a thread to write to the client socket.
+ const bool kJoinable = true;
+ SbThread send_thread = SbThreadCreate(
+ 0, kSbThreadNoPriority, kSbThreadNoAffinity, kJoinable, "SendToTest",
+ SendToServerSocketEntryPoint, static_cast<void*>(&trio));
+
+ // Close the client, which should cause writes to the server socket to fail.
+ EXPECT_TRUE(SbSocketDestroy(trio.client_socket));
+
+ // Wait for the thread to exit and check the last socket error.
+ void* thread_result;
+ EXPECT_TRUE(SbThreadJoin(send_thread, &thread_result));
+ // Check that the server_socket failed, as expected.
+ EXPECT_EQ(SbSocketGetLastError(trio.server_socket), kSbSocketErrorFailed);
+
+ // Clean up the server socket.
+ EXPECT_TRUE(SbSocketDestroy(trio.server_socket));
+}
+
} // namespace
} // namespace nplb
} // namespace starboard
diff --git a/src/starboard/raspi/shared/configuration_public.h b/src/starboard/raspi/shared/configuration_public.h
index b7ba3a6..a677867 100644
--- a/src/starboard/raspi/shared/configuration_public.h
+++ b/src/starboard/raspi/shared/configuration_public.h
@@ -335,8 +335,19 @@
// --- Tuneable Parameters ---------------------------------------------------
-// Specifies the network receive buffer size.
-#define SB_NETWORK_RECEIVE_BUFFER_SIZE (16 * 1024)
+// Specifies the network receive buffer size in bytes, set via
+// SbSocketSetReceiveBufferSize().
+//
+// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
+// not be called. Use this for OSs (such as Linux) where receive buffer
+// auto-tuning is better.
+//
+// On some platforms, this may affect max TCP window size which may
+// dramatically affect throughput in the presence of latency.
+//
+// If your platform does not have a good TCP auto-tuning mechanism,
+// a setting of (128 * 1024) here is recommended.
+#define SB_NETWORK_RECEIVE_BUFFER_SIZE (0)
// --- User Configuration ----------------------------------------------------
diff --git a/src/starboard/shared/posix/socket_receive_from.cc b/src/starboard/shared/posix/socket_receive_from.cc
index 6acea4c..c4819b6 100644
--- a/src/starboard/shared/posix/socket_receive_from.cc
+++ b/src/starboard/shared/posix/socket_receive_from.cc
@@ -27,6 +27,12 @@
char* out_data,
int data_size,
SbSocketAddress* out_source) {
+#if defined(MSG_NOSIGNAL)
+ const int kRecvFlags = MSG_NOSIGNAL;
+#else
+ const int kRecvFlags = 0;
+#endif
+
if (!SbSocketIsValid(socket)) {
errno = EBADF;
return -1;
@@ -52,7 +58,8 @@
}
}
- ssize_t bytes_read = recv(socket->socket_fd, out_data, data_size, 0);
+ ssize_t bytes_read =
+ recv(socket->socket_fd, out_data, data_size, kRecvFlags);
if (bytes_read >= 0) {
socket->error = kSbSocketOk;
return static_cast<int>(bytes_read);
@@ -66,8 +73,9 @@
return -1;
} else if (socket->protocol == kSbSocketProtocolUdp) {
sbposix::SockAddr sock_addr;
- ssize_t bytes_read = recvfrom(socket->socket_fd, out_data, data_size, 0,
- sock_addr.sockaddr(), &sock_addr.length);
+ ssize_t bytes_read =
+ recvfrom(socket->socket_fd, out_data, data_size, kRecvFlags,
+ sock_addr.sockaddr(), &sock_addr.length);
if (bytes_read >= 0) {
if (out_source) {
diff --git a/src/starboard/shared/posix/socket_send_to.cc b/src/starboard/shared/posix/socket_send_to.cc
index 23e134d..6cd0c70 100644
--- a/src/starboard/shared/posix/socket_send_to.cc
+++ b/src/starboard/shared/posix/socket_send_to.cc
@@ -26,6 +26,11 @@
const char* data,
int data_size,
const SbSocketAddress* destination) {
+#if defined(MSG_NOSIGNAL)
+ const int kSendFlags = MSG_NOSIGNAL;
+#else
+ const int kSendFlags = 0;
+#endif
if (!SbSocketIsValid(socket)) {
errno = EBADF;
return -1;
@@ -39,7 +44,8 @@
return -1;
}
- ssize_t bytes_written = send(socket->socket_fd, data, data_size, 0);
+ ssize_t bytes_written =
+ send(socket->socket_fd, data, data_size, kSendFlags);
if (bytes_written >= 0) {
socket->error = kSbSocketOk;
return static_cast<int>(bytes_written);
@@ -70,8 +76,8 @@
sockaddr_length = sock_addr.length;
}
- ssize_t bytes_written = sendto(socket->socket_fd, data, data_size, 0,
- sockaddr, sockaddr_length);
+ ssize_t bytes_written = sendto(socket->socket_fd, data, data_size,
+ kSendFlags, sockaddr, sockaddr_length);
if (bytes_written >= 0) {
socket->error = kSbSocketOk;
return static_cast<int>(bytes_written);
diff --git a/src/starboard/shared/starboard/log_message.cc b/src/starboard/shared/starboard/log_message.cc
index 8e654b4..444bcd6 100644
--- a/src/starboard/shared/starboard/log_message.cc
+++ b/src/starboard/shared/starboard/log_message.cc
@@ -51,7 +51,11 @@
}
SbLogPriority GetMinLogLevel() {
+#if SB_LOGGING_IS_OFFICIAL_BUILD
+ return SB_LOG_FATAL;
+#else
return g_min_log_level;
+#endif
}
void Break() {
diff --git a/src/starboard/stub/configuration_public.h b/src/starboard/stub/configuration_public.h
index af9c671..792ecbb 100644
--- a/src/starboard/stub/configuration_public.h
+++ b/src/starboard/stub/configuration_public.h
@@ -408,8 +408,19 @@
// --- Tuneable Parameters ---------------------------------------------------
-// Specifies the network receive buffer size.
-#define SB_NETWORK_RECEIVE_BUFFER_SIZE (16 * 1024)
+// Specifies the network receive buffer size in bytes, set via
+// SbSocketSetReceiveBufferSize().
+//
+// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
+// not be called. Use this for OSs (such as Linux) where receive buffer
+// auto-tuning is better.
+//
+// On some platforms, this may affect max TCP window size which may
+// dramatically affect throughput in the presence of latency.
+//
+// If your platform does not have a good TCP auto-tuning mechanism,
+// a setting of (128 * 1024) here is recommended.
+#define SB_NETWORK_RECEIVE_BUFFER_SIZE (0)
// --- User Configuration ----------------------------------------------------