Import Cobalt 21.lts.4.302122
diff --git a/src/base/logging.cc b/src/base/logging.cc
index e75d72e..e2e29eb 100644
--- a/src/base/logging.cc
+++ b/src/base/logging.cc
@@ -138,7 +138,11 @@
return "UNKNOWN";
}
-int g_min_log_level = 0;
+#if defined(OFFICIAL_BUILD)
+int g_min_log_level = LOG_FATAL;
+#else
+int g_min_log_level = LOG_INFO;
+#endif
LoggingDestination g_logging_destination = LOG_DEFAULT;
@@ -558,7 +562,7 @@
#endif
}
-#if defined(OFFICIAL_BUILD)
+#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
int GetMinLogLevel() {
return LOG_NUM_SEVERITIES;
}
@@ -582,7 +586,7 @@
void SetLogPrefix(const char* prefix) {}
-#else // defined(OFFICIAL_BUILD)
+#else // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
int GetMinLogLevel() {
return g_min_log_level;
@@ -626,7 +630,7 @@
base::ContainsOnlyChars(prefix, "abcdefghijklmnopqrstuvwxyz"));
g_log_prefix = prefix;
}
-#endif // defined(OFFICIAL_BUILD)
+#endif // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
void SetShowErrorDialogs(bool enable_dialogs) {
show_error_dialogs = enable_dialogs;
diff --git a/src/base/logging.h b/src/base/logging.h
index 5363975..e2e94b5 100644
--- a/src/base/logging.h
+++ b/src/base/logging.h
@@ -412,12 +412,12 @@
// LOG_IS_ON(DFATAL) always holds in debug mode. In particular, CHECK()s will
// always fire if they fail.
-#if defined(OFFICIAL_BUILD)
+#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
#define LOG_IS_ON(severity) false
-#else // defined(OFFICIAL_BUILD)
+#else // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
#define LOG_IS_ON(severity) \
(::logging::ShouldCreateLogMessage(::logging::LOG_##severity))
-#endif // defined(OFFICIAL_BUILD)
+#endif // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
// We can't do any caching tricks with VLOG_IS_ON() like the
// google-glog version since it requires GCC extensions. This means
@@ -445,9 +445,9 @@
#define LOG_IF(severity, condition) \
LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity) && (condition))
-#if defined(OFFICIAL_BUILD)
+#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
#define LOG_ONCE(severity) EAT_STREAM_PARAMETERS
-#else // defined(OFFICIAL_BUILD)
+#else // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
#define LOG_ONCE_MSG "[once] "
constexpr uint32_t kFnvOffsetBasis32 = 0x811c9dc5U;
@@ -481,7 +481,7 @@
((::logging::LogOnceHelper<::logging::hash_32_fnv1a_const(__FILE__), \
__LINE__>::logged_ = true) == true))) \
<< LOG_ONCE_MSG
-#endif // defined(OFFICIAL_BUILD)
+#endif // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
// The VLOG macros log with negative verbosities.
#define VLOG_STREAM(verbose_level) \
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index 9c41986..3799287 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -148,6 +148,12 @@
Platforms can implement UrlFetcher observer for performance tracing by
implementing CobaltExtensionUrlFetcherObserverApi.
+ - **Added support for Cobalt Updater Notification.**
+
+ Platforms can implement CobaltExtensionUpdaterNotificationApi to
+ receive notifications from the Cobalt Evergreen Updater.
+
+
## Version 20
- **Support for QUIC and SPDY is now enabled.**
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 3bd90e2..7d6a781 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -444,13 +444,15 @@
}
std::string GetMinLogLevelString() {
-#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(switches::kMinLogLevel)) {
return command_line->GetSwitchValueASCII(switches::kMinLogLevel);
}
-#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+#if defined(OFFICIAL_BUILD)
+ return "fatal";
+#else
return "info";
+#endif
}
int StringToLogLevel(const std::string& log_level) {
@@ -464,7 +466,11 @@
return logging::LOG_FATAL;
} else {
NOTREACHED() << "Unrecognized logging level: " << log_level;
+#if defined(OFFICIAL_BUILD)
+ return logging::LOG_FATAL;
+#else
return logging::LOG_INFO;
+#endif
}
}
@@ -846,7 +852,8 @@
#endif
#if SB_IS(EVERGREEN)
- if (SbSystemGetExtension(kCobaltExtensionInstallationManagerName)) {
+ if (SbSystemGetExtension(kCobaltExtensionInstallationManagerName) &&
+ !command_line->HasSwitch(switches::kDisableUpdaterModule)) {
updater_module_.reset(new updater::UpdaterModule(network_module_.get()));
}
#endif
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 27fab77..189622c 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -715,7 +715,8 @@
TRACE_EVENT0("cobalt::browser", "BrowserModule::RequestScreenshotToFile()");
DCHECK(screen_shot_writer_);
- scoped_refptr<render_tree::Node> render_tree = GetLastSubmissionAnimated();
+ scoped_refptr<render_tree::Node> render_tree =
+ web_module_->DoSynchronousLayoutAndGetRenderTree();
if (!render_tree) {
LOG(WARNING) << "Unable to get animated render tree";
return;
@@ -732,7 +733,8 @@
TRACE_EVENT0("cobalt::browser", "BrowserModule::RequestScreenshotToMemory()");
DCHECK(screen_shot_writer_);
- scoped_refptr<render_tree::Node> render_tree = GetLastSubmissionAnimated();
+ scoped_refptr<render_tree::Node> render_tree =
+ web_module_->DoSynchronousLayoutAndGetRenderTree();
if (!render_tree) {
LOG(WARNING) << "Unable to get animated render tree";
return;
@@ -742,25 +744,6 @@
clip_rect, screenshot_ready);
}
-scoped_refptr<render_tree::Node> BrowserModule::GetLastSubmissionAnimated() {
- DCHECK(main_web_module_layer_);
- base::Optional<renderer::Submission> last_submission =
- main_web_module_layer_->GetCurrentSubmission();
- if (!last_submission) {
- LOG(WARNING) << "Unable to find last submission.";
- return nullptr;
- }
- DCHECK(last_submission->render_tree);
-
- render_tree::animations::AnimateNode* animate_node =
- base::polymorphic_downcast<render_tree::animations::AnimateNode*>(
- last_submission->render_tree.get());
- render_tree::animations::AnimateNode::AnimateResults results =
- animate_node->Apply(last_submission->time_offset);
-
- return results.animated->source();
-}
-
void BrowserModule::ProcessRenderTreeSubmissionQueue() {
TRACE_EVENT0("cobalt::browser",
"BrowserModule::ProcessRenderTreeSubmissionQueue()");
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index f5bce8f..0b4d122 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -434,10 +434,6 @@
// Get the SbWindow via |system_window_| or potentially NULL.
SbWindow GetSbWindow();
- // This returns the render tree of the most recent submission, with animations
- // applied according to the current time.
- scoped_refptr<render_tree::Node> GetLastSubmissionAnimated();
-
// Sets the fallback splash screen url to a topic-specific URL, if applicable.
// Returns the topic used, or an empty Optional if a topic isn't found.
base::Optional<std::string> SetSplashScreenTopicFallback(const GURL& url);
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 64653d5..2021872 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -117,10 +117,6 @@
"The minimum version of Cobalt that will be checked during compatibility "
"validations.";
-const char kMinLogLevel[] = "min_log_level";
-const char kMinLogLevelHelp[] =
- "Set the minimum logging level: info|warning|error|fatal.";
-
const char kNullSavegame[] = "null_savegame";
const char kNullSavegameHelp[] =
"Setting NullSavegame will result in no data being read from previous "
@@ -208,6 +204,9 @@
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+const char kMinLogLevel[] = "min_log_level";
+const char kMinLogLevelHelp[] =
+ "Set the minimum logging level: info|warning|error|fatal.";
const char kDisableJavaScriptJit[] = "disable_javascript_jit";
const char kDisableJavaScriptJitHelp[] =
"Specifies that javascript jit should be disabled.";
@@ -225,6 +224,12 @@
"removed and the resolution will be 1us (or larger depending on the "
"platform.";
+const char kDisableUpdaterModule[] = "disable_updater_module";
+const char kDisableUpdaterModuleHelp[] =
+ "Disables the Cobalt Evergreen UpdaterModule which is responsible for "
+ "downloading and installing new Cobalt updates. Passing the flag is "
+ "equivalent to opting out from further updates.";
+
const char kEncodedImageCacheSizeInBytes[] =
"encoded_image_cache_size_in_bytes";
const char kEncodedImageCacheSizeInBytesHelp[] =
@@ -437,7 +442,7 @@
{kIgnoreCertificateErrors, kIgnoreCertificateErrorsHelp},
{kInputFuzzer, kInputFuzzerHelp}, {kMemoryTracker, kMemoryTrackerHelp},
{kMinCompatibilityVersion, kMinCompatibilityVersionHelp},
- {kMinLogLevel, kMinLogLevelHelp}, {kNullSavegame, kNullSavegameHelp},
+ {kNullSavegame, kNullSavegameHelp},
{kDisablePartialLayout, kDisablePartialLayoutHelp}, {kProd, kProdHelp},
{kRequireCSP, kRequireCSPHelp},
{kRequireHTTPSLocation, kRequireHTTPSLocationHelp},
@@ -453,10 +458,10 @@
#endif // SB_API_VERSION >= 12 ||
// SB_HAS(ON_SCREEN_KEYBOARD)
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
-
{kDisableJavaScriptJit, kDisableJavaScriptJitHelp},
{kDisableMapToMesh, kDisableMapToMeshHelp},
{kDisableTimerResolutionLimit, kDisableTimerResolutionLimitHelp},
+ {kDisableUpdaterModule, kDisableUpdaterModuleHelp},
{kEncodedImageCacheSizeInBytes, kEncodedImageCacheSizeInBytesHelp},
{kForceMigrationForStoragePartitioning,
kForceMigrationForStoragePartitioningHelp},
@@ -468,6 +473,7 @@
{kLocalStoragePartitionUrl, kLocalStoragePartitionUrlHelp},
{kMaxCobaltCpuUsage, kMaxCobaltCpuUsageHelp},
{kMaxCobaltGpuUsage, kMaxCobaltGpuUsageHelp},
+ {kMinLogLevel, kMinLogLevelHelp},
{kOffscreenTargetCacheSizeInBytes,
kOffscreenTargetCacheSizeInBytesHelp},
{kOmitDeviceAuthenticationQueryParameters,
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 67c03f7..94f052b 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -60,8 +60,6 @@
extern const char kMemoryTrackerHelp[];
extern const char kMinCompatibilityVersion[];
extern const char kMinCompatibilityVersionHelp[];
-extern const char kMinLogLevel[];
-extern const char kMinLogLevelHelp[];
extern const char kNullSavegame[];
extern const char kNullSavegameHelp[];
extern const char kDisablePartialLayout[];
@@ -102,6 +100,8 @@
extern const char kDisableMapToMeshHelp[];
extern const char kDisableTimerResolutionLimit[];
extern const char kDisableTimerResolutionLimitHelp[];
+extern const char kDisableUpdaterModule[];
+extern const char kDisableUpdaterModuleHelp[];
extern const char kEncodedImageCacheSizeInBytes[];
extern const char kEncodedImageCacheSizeInBytesHelp[];
extern const char kForceMigrationForStoragePartitioning[];
@@ -123,6 +123,8 @@
extern const char kMaxCobaltCpuUsageHelp[];
extern const char kMaxCobaltGpuUsage[];
extern const char kMaxCobaltGpuUsageHelp[];
+extern const char kMinLogLevel[];
+extern const char kMinLogLevelHelp[];
extern const char kOffscreenTargetCacheSizeInBytes[];
extern const char kOffscreenTargetCacheSizeInBytesHelp[];
extern const char kOmitDeviceAuthenticationQueryParameters[];
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index f570d3b..5036fd6 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -247,6 +247,9 @@
void CancelSynchronousLoads();
+ void DoSynchronousLayoutAndGetRenderTree(
+ scoped_refptr<render_tree::Node>* render_tree);
+
private:
class DocumentLoadedObserver;
@@ -993,6 +996,16 @@
synchronous_loader_interrupt_.Signal();
}
+void WebModule::Impl::DoSynchronousLayoutAndGetRenderTree(
+ scoped_refptr<render_tree::Node>* render_tree) {
+ TRACE_EVENT0("cobalt::browser",
+ "WebModule::Impl::DoSynchronousLayoutAndGetRenderTree()");
+ DCHECK(render_tree);
+ scoped_refptr<render_tree::Node> tree =
+ window_->document()->DoSynchronousLayoutAndGetRenderTree();
+ *render_tree = tree;
+}
+
void WebModule::Impl::OnCspPolicyChanged() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(is_running_);
@@ -1731,5 +1744,23 @@
base::Unretained(impl_.get()), callback));
}
+scoped_refptr<render_tree::Node>
+WebModule::DoSynchronousLayoutAndGetRenderTree() {
+ TRACE_EVENT0("cobalt::browser",
+ "WebModule::DoSynchronousLayoutAndGetRenderTree()");
+ DCHECK(message_loop());
+ DCHECK(impl_);
+ scoped_refptr<render_tree::Node> render_tree;
+ if (base::MessageLoop::current() != message_loop()) {
+ message_loop()->task_runner()->PostBlockingTask(
+ FROM_HERE,
+ base::Bind(&WebModule::Impl::DoSynchronousLayoutAndGetRenderTree,
+ base::Unretained(impl_.get()), &render_tree));
+ } else {
+ impl_->DoSynchronousLayoutAndGetRenderTree(&render_tree);
+ }
+ return render_tree;
+}
+
} // namespace browser
} // namespace cobalt
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index be762ae..0f340cd 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -396,6 +396,8 @@
void RequestJavaScriptHeapStatistics(
const JavaScriptHeapStatisticsCallback& callback);
+ scoped_refptr<render_tree::Node> DoSynchronousLayoutAndGetRenderTree();
+
private:
// Data required to construct a WebModule, initialized in the constructor and
// passed to |Initialize|.
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index ef7e632..22d7db0 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-301658
\ No newline at end of file
+302122
\ No newline at end of file
diff --git a/src/cobalt/extension/extension_test.cc b/src/cobalt/extension/extension_test.cc
index d57b5ed..246ef55 100644
--- a/src/cobalt/extension/extension_test.cc
+++ b/src/cobalt/extension/extension_test.cc
@@ -21,6 +21,7 @@
#include "cobalt/extension/installation_manager.h"
#include "cobalt/extension/javascript_cache.h"
#include "cobalt/extension/platform_service.h"
+#include "cobalt/extension/updater_notification.h"
#include "cobalt/extension/url_fetcher_observer.h"
#include "starboard/system.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -266,6 +267,26 @@
<< "Extension struct should be a singleton";
}
+TEST(ExtensionTest, UpdaterNotification) {
+ typedef CobaltExtensionUpdaterNotificationApi ExtensionApi;
+ const char* kExtensionName = kCobaltExtensionUpdaterNotificationName;
+
+ const ExtensionApi* extension_api =
+ static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+ if (!extension_api) {
+ return;
+ }
+
+ EXPECT_STREQ(extension_api->name, kExtensionName);
+ EXPECT_EQ(extension_api->version, 1u);
+ EXPECT_NE(extension_api->UpdaterState, nullptr);
+
+ const ExtensionApi* second_extension_api =
+ static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+ EXPECT_EQ(second_extension_api, extension_api)
+ << "Extension struct should be a singleton";
+}
+
} // namespace extension
} // namespace cobalt
#endif // SB_API_VERSION >= 11
diff --git a/src/cobalt/extension/updater_notification.h b/src/cobalt/extension/updater_notification.h
new file mode 100644
index 0000000..151437f
--- /dev/null
+++ b/src/cobalt/extension/updater_notification.h
@@ -0,0 +1,61 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_EXTENSION_UPDATER_NOTIFICATION_H_
+#define COBALT_EXTENSION_UPDATER_NOTIFICATION_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define kCobaltExtensionUpdaterNotificationName \
+ "dev.cobalt.extension.UpdaterNotification"
+
+typedef enum CobaltExtensionUpdaterNotificationState {
+ kCobaltExtensionUpdaterNotificationStateNone = 0,
+ kCobaltExtensionUpdaterNotificationStateChecking = 1,
+ kCobaltExtensionUpdaterNotificationStateUpdateAvailable = 2,
+ kCobaltExtensionUpdaterNotificationStateDownloading = 3,
+ kCobaltExtensionUpdaterNotificationStateDownloaded = 4,
+ kCobaltExtensionUpdaterNotificationStateInstalling = 5,
+ kCobaltExtensionUpdaterNotificationStatekUpdated = 6,
+ kCobaltExtensionUpdaterNotificationStatekUpToDate = 7,
+ kCobaltExtensionUpdaterNotificationStatekUpdateFailed = 8,
+} CobaltExtensionUpdaterNotificationState;
+
+typedef struct CobaltExtensionUpdaterNotificationApi {
+ // Name should be the string |kCobaltExtensionUpdaterNotificationName|.
+ // This helps to validate that the extension API is correct.
+ const char* name;
+
+ // This specifies the version of the API that is implemented.
+ uint32_t version;
+
+ // The fields below this point were added in version 1 or later.
+
+ // Notify the Starboard implementation of the updater state.
+ // The Starboard platform can check if the device is low on storage
+ // and prompt the user to free some storage. The implementation
+ // should keep track of the frequency of showing the prompt to the
+ // user and try to minimize the number of user notifications.
+ void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state);
+} CobaltExtensionUpdaterNotificationApi;
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // COBALT_EXTENSION_UPDATER_NOTIFICATION_H_
diff --git a/src/cobalt/extension/url_fetcher_observer.h b/src/cobalt/extension/url_fetcher_observer.h
index 7795689..d9a4a10 100644
--- a/src/cobalt/extension/url_fetcher_observer.h
+++ b/src/cobalt/extension/url_fetcher_observer.h
@@ -21,6 +21,9 @@
extern "C" {
#endif
+#define URL_FETCHER_OBSERVER_MAX_URL_SIZE 128
+#define URL_FETCHER_COMMAND_LINE_SWITCH "url_fetcher_observer"
+
#define kCobaltExtensionUrlFetcherObserverName \
"dev.cobalt.extension.UrlFetcherObserver"
diff --git a/src/cobalt/h5vcc/h5vcc_updater.cc b/src/cobalt/h5vcc/h5vcc_updater.cc
index 7db80e6..c4d7bbf 100644
--- a/src/cobalt/h5vcc/h5vcc_updater.cc
+++ b/src/cobalt/h5vcc/h5vcc_updater.cc
@@ -36,8 +36,7 @@
return;
}
- if (updater_module_->GetUpdaterChannel().compare(channel) != 0 &&
- updater_module_->IsChannelValid(channel)) {
+ if (updater_module_->GetUpdaterChannel().compare(channel) != 0) {
updater_module_->SetUpdaterChannel(channel);
updater_module_->CompareAndSwapChannelChanged(0, 1);
updater_module_->RunUpdateCheck();
diff --git a/src/cobalt/layout/topmost_event_target.cc b/src/cobalt/layout/topmost_event_target.cc
index 8801fef..0ee7b82 100644
--- a/src/cobalt/layout/topmost_event_target.cc
+++ b/src/cobalt/layout/topmost_event_target.cc
@@ -239,13 +239,11 @@
target_element->DispatchEvent(new dom::PointerEvent(
base::Tokens::pointerover(), view, *event_init));
for (scoped_refptr<dom::Element> element = target_element;
- element != nearest_common_ancestor;
+ element && element != nearest_common_ancestor;
element = element->parent_element()) {
- if (element) {
- element->DispatchEvent(new dom::PointerEvent(
- base::Tokens::pointerenter(), dom::Event::kNotBubbles,
- dom::Event::kNotCancelable, view, *event_init));
- }
+ element->DispatchEvent(new dom::PointerEvent(
+ base::Tokens::pointerenter(), dom::Event::kNotBubbles,
+ dom::Event::kNotCancelable, view, *event_init));
}
}
@@ -254,13 +252,11 @@
target_element->DispatchEvent(
new dom::MouseEvent(base::Tokens::mouseover(), view, *event_init));
for (scoped_refptr<dom::Element> element = target_element;
- element != nearest_common_ancestor;
+ element && element != nearest_common_ancestor;
element = element->parent_element()) {
- if (element) {
- element->DispatchEvent(new dom::MouseEvent(
- base::Tokens::mouseenter(), dom::Event::kNotBubbles,
- dom::Event::kNotCancelable, view, *event_init));
- }
+ element->DispatchEvent(new dom::MouseEvent(
+ base::Tokens::mouseenter(), dom::Event::kNotBubbles,
+ dom::Event::kNotCancelable, view, *event_init));
}
}
}
diff --git a/src/cobalt/updater/configurator.cc b/src/cobalt/updater/configurator.cc
index 925c06e..3657935 100644
--- a/src/cobalt/updater/configurator.cc
+++ b/src/cobalt/updater/configurator.cc
@@ -29,31 +29,6 @@
// Default time constants.
const int kDelayOneMinute = 60;
const int kDelayOneHour = kDelayOneMinute * 60;
-const std::set<std::string> valid_channels = {
- // Default channel for debug/devel builds.
- "dev",
- // Channel for dogfooders.
- "dogfood",
- // Default channel for gold builds.
- "prod",
- // Default channel for qa builds. A gold build can switch to this channel to
- // get an official qa build.
- "qa",
- // Test an update with higher version than prod channel.
- "test",
- // Test an update with mismatched sabi.
- "tmsabi",
- // Test an update that does nothing.
- "tnoop",
- // Test an update that crashes.
- "tcrash",
- // Test an update that fails verification.
- "tfailv",
- // Test an update that works for one app only.
- "t1app",
- // Test a series of continuous updates with two channels.
- "tseries1", "tseries2",
-};
#if defined(COBALT_BUILD_TYPE_DEBUG) || defined(COBALT_BUILD_TYPE_DEVEL)
const char kDefaultUpdaterChannel[] = "dev";
@@ -259,14 +234,6 @@
updater_channel_ = updater_channel;
}
-bool Configurator::IsChannelValid(const std::string& channel) {
- if (!valid_channels.count(channel)) {
- SetUpdaterStatus(std::string("Invalid channel requested"));
- return false;
- }
- return true;
-}
-
// The updater status is get by main web module thread and set by the updater
// thread. The getter and set use a lock to prevent synchronization issue.
std::string Configurator::GetUpdaterStatus() const {
diff --git a/src/cobalt/updater/configurator.h b/src/cobalt/updater/configurator.h
index c6fa12a..5314984 100644
--- a/src/cobalt/updater/configurator.h
+++ b/src/cobalt/updater/configurator.h
@@ -79,8 +79,6 @@
void CompareAndSwapChannelChanged(int old_value, int new_value) override;
- bool IsChannelValid(const std::string& channel);
-
std::string GetUpdaterStatus() const override;
void SetUpdaterStatus(const std::string& status) override;
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc
index 4cba4f3..db02d9a 100644
--- a/src/cobalt/updater/updater_module.cc
+++ b/src/cobalt/updater/updater_module.cc
@@ -51,6 +51,31 @@
void QuitLoop(base::OnceClosure quit_closure) { std::move(quit_closure).Run(); }
+CobaltExtensionUpdaterNotificationState
+ComponentStateToCobaltExtensionUpdaterNotificationState(
+ ComponentState component_state) {
+ switch (component_state) {
+ case ComponentState::kChecking:
+ return kCobaltExtensionUpdaterNotificationStateChecking;
+ case ComponentState::kCanUpdate:
+ return kCobaltExtensionUpdaterNotificationStateUpdateAvailable;
+ case ComponentState::kDownloading:
+ return kCobaltExtensionUpdaterNotificationStateDownloading;
+ case ComponentState::kDownloaded:
+ return kCobaltExtensionUpdaterNotificationStateDownloaded;
+ case ComponentState::kUpdating:
+ return kCobaltExtensionUpdaterNotificationStateInstalling;
+ case ComponentState::kUpdated:
+ return kCobaltExtensionUpdaterNotificationStatekUpdated;
+ case ComponentState::kUpToDate:
+ return kCobaltExtensionUpdaterNotificationStatekUpdated;
+ case ComponentState::kUpdateError:
+ return kCobaltExtensionUpdaterNotificationStatekUpdateFailed;
+ default:
+ return kCobaltExtensionUpdaterNotificationStateNone;
+ }
+}
+
} // namespace
namespace cobalt {
@@ -77,6 +102,11 @@
status +=
", error code is " + std::to_string(crx_update_item_.error_code);
}
+ if (updater_notification_ext_ != nullptr) {
+ updater_notification_ext_->UpdaterState(
+ ComponentStateToCobaltExtensionUpdaterNotificationState(
+ crx_update_item_.state));
+ }
} else {
status = "No status available";
}
@@ -240,17 +270,30 @@
base::TimeDelta::FromHours(kNextUpdateCheckHours));
}
+// The following methods are called by other threads than the updater_thread_.
+
void UpdaterModule::CompareAndSwapChannelChanged(int old_value, int new_value) {
- updater_configurator_->CompareAndSwapChannelChanged(old_value, new_value);
+ auto config = updater_configurator_;
+ if (config) config->CompareAndSwapChannelChanged(old_value, new_value);
}
-// The following three methods all called by the main web module thread.
std::string UpdaterModule::GetUpdaterChannel() const {
- return updater_configurator_->GetChannel();
+ auto config = updater_configurator_;
+ if (!config) return "";
+
+ return config->GetChannel();
}
void UpdaterModule::SetUpdaterChannel(const std::string& updater_channel) {
- updater_configurator_->SetChannel(updater_channel);
+ auto config = updater_configurator_;
+ if (config) config->SetChannel(updater_channel);
+}
+
+std::string UpdaterModule::GetUpdaterStatus() const {
+ auto config = updater_configurator_;
+ if (!config) return "";
+
+ return config->GetUpdaterStatus();
}
void UpdaterModule::RunUpdateCheck() {
diff --git a/src/cobalt/updater/updater_module.h b/src/cobalt/updater/updater_module.h
index f2c1d02..49b8715 100644
--- a/src/cobalt/updater/updater_module.h
+++ b/src/cobalt/updater/updater_module.h
@@ -22,6 +22,7 @@
#include "base/memory/scoped_refptr.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread.h"
+#include "cobalt/extension/updater_notification.h"
#include "cobalt/network/network_module.h"
#include "cobalt/updater/configurator.h"
#include "components/prefs/pref_service.h"
@@ -52,22 +53,22 @@
};
// Mapping a component state to an updater status.
-const std::map<ComponentState, UpdaterStatus>
- component_to_updater_status_map = {
- {ComponentState::kNew, UpdaterStatus::kNewUpdate},
- {ComponentState::kChecking, UpdaterStatus::kChecking},
- {ComponentState::kCanUpdate, UpdaterStatus::kUpdateAvailable},
- {ComponentState::kDownloadingDiff, UpdaterStatus::kDownloadingDiff},
- {ComponentState::kDownloading, UpdaterStatus::kDownloading},
- {ComponentState::kDownloaded, UpdaterStatus::kDownloaded},
- {ComponentState::kUpdatingDiff, UpdaterStatus::kUpdatingDiff},
- {ComponentState::kUpdating, UpdaterStatus::kUpdating},
- {ComponentState::kUpdated, UpdaterStatus::kUpdated},
- {ComponentState::kUpToDate, UpdaterStatus::kUpToDate},
- {ComponentState::kUpdateError, UpdaterStatus::kUpdateError},
- {ComponentState::kUninstalled, UpdaterStatus::kUninstalled},
- {ComponentState::kRun, UpdaterStatus::kRun},
- };
+const std::map<ComponentState, UpdaterStatus> component_to_updater_status_map =
+ {
+ {ComponentState::kNew, UpdaterStatus::kNewUpdate},
+ {ComponentState::kChecking, UpdaterStatus::kChecking},
+ {ComponentState::kCanUpdate, UpdaterStatus::kUpdateAvailable},
+ {ComponentState::kDownloadingDiff, UpdaterStatus::kDownloadingDiff},
+ {ComponentState::kDownloading, UpdaterStatus::kDownloading},
+ {ComponentState::kDownloaded, UpdaterStatus::kDownloaded},
+ {ComponentState::kUpdatingDiff, UpdaterStatus::kUpdatingDiff},
+ {ComponentState::kUpdating, UpdaterStatus::kUpdating},
+ {ComponentState::kUpdated, UpdaterStatus::kUpdated},
+ {ComponentState::kUpToDate, UpdaterStatus::kUpToDate},
+ {ComponentState::kUpdateError, UpdaterStatus::kUpdateError},
+ {ComponentState::kUninstalled, UpdaterStatus::kUninstalled},
+ {ComponentState::kRun, UpdaterStatus::kRun},
+};
// Translating an updater status to a status string.
const std::map<UpdaterStatus, const char*> updater_status_string_map = {
@@ -94,7 +95,20 @@
Observer(scoped_refptr<update_client::UpdateClient> update_client,
scoped_refptr<Configurator> updater_configurator)
: update_client_(update_client),
- updater_configurator_(updater_configurator) {}
+ updater_configurator_(updater_configurator) {
+ const CobaltExtensionUpdaterNotificationApi* updater_notification_ext =
+ static_cast<const CobaltExtensionUpdaterNotificationApi*>(
+ SbSystemGetExtension(kCobaltExtensionUpdaterNotificationName));
+ if (updater_notification_ext &&
+ SbStringCompareAll(updater_notification_ext->name,
+ kCobaltExtensionUpdaterNotificationName) == 0 &&
+ updater_notification_ext->version >= 1) {
+ updater_notification_ext_ = updater_notification_ext;
+ } else {
+ updater_notification_ext_ = nullptr;
+ }
+ }
+
// Overrides for update_client::UpdateClient::Observer.
void OnEvent(Events event, const std::string& id) override;
@@ -103,6 +117,7 @@
scoped_refptr<update_client::UpdateClient> update_client_;
scoped_refptr<Configurator> updater_configurator_;
update_client::CrxUpdateItem crx_update_item_;
+ const CobaltExtensionUpdaterNotificationApi* updater_notification_ext_;
DISALLOW_COPY_AND_ASSIGN(Observer);
};
@@ -122,15 +137,10 @@
void SetUpdaterChannel(const std::string& updater_channel);
void CompareAndSwapChannelChanged(int old_value, int new_value);
- bool IsChannelValid(const std::string& channel) {
- return updater_configurator_->IsChannelValid(channel);
- }
void RunUpdateCheck();
- std::string GetUpdaterStatus() const {
- return updater_configurator_->GetUpdaterStatus();
- }
+ std::string GetUpdaterStatus() const;
void ResetInstallations();
diff --git a/src/components/update_client/url_fetcher_downloader.cc b/src/components/update_client/url_fetcher_downloader.cc
index 9703910..f94b010 100644
--- a/src/components/update_client/url_fetcher_downloader.cc
+++ b/src/components/update_client/url_fetcher_downloader.cc
@@ -6,6 +6,7 @@
#include <stdint.h>
#include <stack>
+#include <string>
#include <utility>
#include <vector>
@@ -76,8 +77,7 @@
std::unique_ptr<CrxDownloader> successor,
scoped_refptr<NetworkFetcherFactory> network_fetcher_factory)
: CrxDownloader(std::move(successor)),
- network_fetcher_factory_(network_fetcher_factory) {
-}
+ network_fetcher_factory_(network_fetcher_factory) {}
#endif
UrlFetcherDownloader::~UrlFetcherDownloader() {
@@ -230,7 +230,11 @@
// the request and avoid overloading the server in this case.
// is not accepting requests for the moment.
int error = -1;
+#if defined(STARBOARD)
+ if (!file_path.empty() && response_code_ == 200 && net_error == 0) {
+#else
if (!file_path.empty() && response_code_ == 200) {
+#endif
DCHECK_EQ(0, net_error);
error = 0;
} else if (response_code_ != -1) {
diff --git a/src/net/url_request/url_fetcher_core.cc b/src/net/url_request/url_fetcher_core.cc
index 2979a78..1281828 100644
--- a/src/net/url_request/url_fetcher_core.cc
+++ b/src/net/url_request/url_fetcher_core.cc
@@ -139,15 +139,21 @@
CHECK(original_url_.is_valid());
#if SB_API_VERSION >= 11
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
const CobaltExtensionUrlFetcherObserverApi* observer_extension =
static_cast<const CobaltExtensionUrlFetcherObserverApi*>(
SbSystemGetExtension(kCobaltExtensionUrlFetcherObserverName));
- if (observer_extension &&
+ if (command_line.HasSwitch(URL_FETCHER_COMMAND_LINE_SWITCH) &&
+ observer_extension &&
SbStringCompareAll(observer_extension->name,
kCobaltExtensionUrlFetcherObserverName) == 0 &&
observer_extension->version >= 1) {
observer_extension_ = observer_extension;
- observer_extension_->FetcherCreated(original_url_.spec().c_str());
+ observer_extension_->FetcherCreated(
+ original_url_.spec()
+ .substr(0, URL_FETCHER_OBSERVER_MAX_URL_SIZE)
+ .c_str());
} else {
observer_extension_ = nullptr;
}
@@ -616,7 +622,10 @@
URLFetcherCore::~URLFetcherCore() {
if (observer_extension_ != nullptr) {
- observer_extension_->FetcherDestroyed(original_url_.spec().c_str());
+ observer_extension_->FetcherDestroyed(
+ original_url_.spec()
+ .substr(0, URL_FETCHER_OBSERVER_MAX_URL_SIZE)
+ .c_str());
}
// |request_| should be NULL. If not, it's unsafe to delete it here since we
// may not be on the IO thread.
@@ -647,7 +656,10 @@
DCHECK(network_task_runner_->BelongsToCurrentThread());
if (observer_extension_ != nullptr) {
- observer_extension_->StartURLRequest(original_url_.spec().c_str());
+ observer_extension_->StartURLRequest(
+ original_url_.spec()
+ .substr(0, URL_FETCHER_OBSERVER_MAX_URL_SIZE)
+ .c_str());
}
if (was_cancelled_) {
// Since StartURLRequest() is posted as a *delayed* task, it may
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
index 8df3ca9..c340a6b 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
@@ -107,7 +107,7 @@
public void setLifecycleCallback(LifecycleCallback lifecycleCallback) {
this.lifecycleCallback = lifecycleCallback;
- if (lifecycleCallback != null) {
+ if (lifecycleCallback != null && this.mediaSession != null) {
lifecycleCallback.onMediaSessionLifecycle(
this.mediaSession.isActive(), this.mediaSession.getSessionToken());
}
diff --git a/src/starboard/android/apk/build.id b/src/starboard/android/apk/build.id
new file mode 100644
index 0000000..ef01811
--- /dev/null
+++ b/src/starboard/android/apk/build.id
@@ -0,0 +1 @@
+301999
\ No newline at end of file
diff --git a/src/starboard/android/apk/cobalt-gradle.sh b/src/starboard/android/apk/cobalt-gradle.sh
index 156c8f2..a5b430f 100755
--- a/src/starboard/android/apk/cobalt-gradle.sh
+++ b/src/starboard/android/apk/cobalt-gradle.sh
@@ -54,7 +54,7 @@
# Allow parallel gradle builds, as defined by a COBALT_GRADLE_BUILD_COUNT envvar
# or default to 1 if that's not set (so buildbot only runs 1 gradle at a time).
BUCKETS=${COBALT_GRADLE_BUILD_COUNT:-1}
-if [ "$BUCKETS"==1 ]; then
+if [ "$BUCKETS" -eq 1 ]; then
echo "Gradle daemon and parallel gradle disabled for Cobalt build"
GRADLE_ARGS+=(
"-Dorg.gradle.parallel=false"
diff --git a/src/starboard/android/shared/model_year_test.cc b/src/starboard/android/shared/model_year_test.cc
new file mode 100644
index 0000000..1197242
--- /dev/null
+++ b/src/starboard/android/shared/model_year_test.cc
@@ -0,0 +1,43 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <string>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+namespace {
+
+TEST(ModelYearTest, YearIsFourDigitsOrUnknown) {
+ const size_t kValueSize = 1024;
+ char value[kValueSize] = {0};
+ SbMemorySet(value, 0xCD, kValueSize);
+ bool result =
+ SbSystemGetProperty(kSbSystemPropertyModelYear, value, kValueSize);
+ SB_DCHECK(result);
+ std::string year = value;
+ if (year == "unknown") {
+ return;
+ }
+ EXPECT_EQ(4, year.length());
+ EXPECT_EQ(std::string::npos, year.find_first_not_of("0123456789"));
+ EXPECT_EQ("20", year.substr(0, 2));
+}
+
+} // namespace
+} // namespace shared
+} // namespace android
+} // namespace starboard
diff --git a/src/starboard/android/shared/starboard_platform_tests.gypi b/src/starboard/android/shared/starboard_platform_tests.gypi
index 5b8fe50..0c34f23 100644
--- a/src/starboard/android/shared/starboard_platform_tests.gypi
+++ b/src/starboard/android/shared/starboard_platform_tests.gypi
@@ -23,6 +23,7 @@
'<(DEPTH)/starboard/common/test_main.cc',
'<@(media_tests_sources)',
'jni_env_ext_test.cc',
+ 'model_year_test.cc',
'video_frame_tracker_test.cc',
],
'defines': [
diff --git a/src/starboard/android/shared/system_get_property.cc b/src/starboard/android/shared/system_get_property.cc
index 192dabc..b77d103 100644
--- a/src/starboard/android/shared/system_get_property.cc
+++ b/src/starboard/android/shared/system_get_property.cc
@@ -104,8 +104,24 @@
case kSbSystemPropertyChipsetModelNumber:
return GetAndroidSystemProperty("ro.board.platform", out_value,
value_length, kUnknownValue);
- case kSbSystemPropertyModelYear:
- return false;
+ case kSbSystemPropertyModelYear: {
+ char key1[PROP_VALUE_MAX] = "";
+ SB_DCHECK(GetAndroidSystemProperty("ro.oem.key1", key1, PROP_VALUE_MAX,
+ kUnknownValue));
+ if (SbStringCompareAll(key1, kUnknownValue) == 0 ||
+ SbStringGetLength(key1) < 10) {
+ return CopyStringAndTestIfSuccess(out_value, value_length,
+ kUnknownValue);
+ }
+ // See
+ // https://support.google.com/androidpartners_androidtv/answer/9351639?hl=en
+ // for the format of key1.
+ std::string year = "20";
+ year += key1[9];
+ year += key1[10];
+ return CopyStringAndTestIfSuccess(out_value, value_length, year.c_str());
+ }
+
#if SB_API_VERSION >= 12
case kSbSystemPropertySystemIntegratorName:
#else
@@ -125,8 +141,8 @@
case kSbSystemPropertyUserAgentAuxField: {
JniEnvExt* env = JniEnvExt::Get();
ScopedLocalJavaRef<jstring> aux_string(
- env->CallStarboardObjectMethodOrAbort(
- "getUserAgentAuxField", "()Ljava/lang/String;"));
+ env->CallStarboardObjectMethodOrAbort("getUserAgentAuxField",
+ "()Ljava/lang/String;"));
std::string utf_str = env->GetStringStandardUTFOrAbort(aux_string.Get());
bool success =
diff --git a/src/starboard/common/log.cc b/src/starboard/common/log.cc
index b7a6ab0..08994c2 100644
--- a/src/starboard/common/log.cc
+++ b/src/starboard/common/log.cc
@@ -35,7 +35,11 @@
namespace starboard {
namespace logging {
namespace {
+#if SB_LOGGING_IS_OFFICIAL_BUILD
+SbLogPriority g_min_log_level = kSbLogPriorityFatal;
+#else
SbLogPriority g_min_log_level = kSbLogPriorityUnknown;
+#endif
#if SB_API_VERSION < 11
SB_ONCE_INITIALIZE_FUNCTION(RecursiveMutex, g_log_mutex);
@@ -61,11 +65,7 @@
}
SbLogPriority GetMinLogLevel() {
-#if SB_LOGGING_IS_OFFICIAL_BUILD
- return SB_LOG_FATAL;
-#else
return g_min_log_level;
-#endif
}
SbLogPriority StringToLogLevel(const std::string& log_level) {
diff --git a/src/starboard/common/log.h b/src/starboard/common/log.h
index df38642..f1ec6b9 100644
--- a/src/starboard/common/log.h
+++ b/src/starboard/common/log.h
@@ -123,7 +123,8 @@
#define SB_LAZY_STREAM(stream, condition) \
!(condition) ? (void)0 : ::starboard::logging::LogMessageVoidify() & (stream)
-#if SB_LOGGING_IS_OFFICIAL_BUILD
+#if SB_LOGGING_IS_OFFICIAL_BUILD && !SB_IS(EVERGREEN) && \
+ !SB_IS(EVERGREEN_COMPATIBLE)
#define SB_LOG_IS_ON(severity) \
((::starboard::logging::SB_LOG_##severity >= \
::starboard::logging::SB_LOG_FATAL) \
diff --git a/src/starboard/evergreen/testing/tests/out_of_storage_test.sh b/src/starboard/evergreen/testing/tests/out_of_storage_test.sh
index 5f69e22..3e13e55 100755
--- a/src/starboard/evergreen/testing/tests/out_of_storage_test.sh
+++ b/src/starboard/evergreen/testing/tests/out_of_storage_test.sh
@@ -46,7 +46,7 @@
OLD_TIMEOUT="${TIMEOUT}"
TIMEOUT=300
- cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.0.log" "Failed to update, log "error" code is 12"
+ cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.0.log" "Failed to update, log \"error\" code is 12"
# Remove the symbolic link.
run_command "rm -f ${STORAGE_DIR}" 1> /dev/null
diff --git a/src/starboard/shared/starboard/application.cc b/src/starboard/shared/starboard/application.cc
index fcf8612..f9addee 100644
--- a/src/starboard/shared/starboard/application.cc
+++ b/src/starboard/shared/starboard/application.cc
@@ -114,7 +114,11 @@
::starboard::logging::SetMinLogLevel(::starboard::logging::StringToLogLevel(
command_line_->GetSwitchValue(kMinLogLevel)));
} else {
+#if SB_LOGGING_IS_OFFICIAL_BUILD
+ ::starboard::logging::SetMinLogLevel(::starboard::logging::SB_LOG_FATAL);
+#else
::starboard::logging::SetMinLogLevel(::starboard::logging::SB_LOG_INFO);
+#endif
}
#endif // SB_API_VERSION >= 11