diff options
author | asanka <asanka@chromium.org> | 2015-12-18 20:45:39 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-19 04:46:36 +0000 |
commit | dc5a2994948c060ab7c3a584107fa7ba21ee1486 (patch) | |
tree | 90432536b1dfe09e38719f560dd80f7264528d26 | |
parent | a82b9b57547c3b9fe783827e626ddec109298e79 (diff) | |
download | chromium_src-dc5a2994948c060ab7c3a584107fa7ba21ee1486.zip chromium_src-dc5a2994948c060ab7c3a584107fa7ba21ee1486.tar.gz chromium_src-dc5a2994948c060ab7c3a584107fa7ba21ee1486.tar.bz2 |
Enable download resumption by default.
BUG=7648
Review URL: https://codereview.chromium.org/1538933002
Cr-Commit-Position: refs/heads/master@{#366264}
-rw-r--r-- | chrome/browser/about_flags.cc | 2 | ||||
-rw-r--r-- | chrome/browser/download/download_browsertest.cc | 40 | ||||
-rw-r--r-- | chrome/browser/download/download_shelf_context_menu.cc | 6 | ||||
-rw-r--r-- | chrome/browser/download/notification/download_notification_browsertest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc | 10 | ||||
-rw-r--r-- | content/browser/download/download_browsertest.cc | 12 | ||||
-rw-r--r-- | content/browser/download/download_item_impl.cc | 13 | ||||
-rw-r--r-- | content/browser/download/download_item_impl_unittest.cc | 32 | ||||
-rw-r--r-- | content/public/common/content_features.cc | 5 | ||||
-rw-r--r-- | content/public/common/content_features.h | 3 | ||||
-rw-r--r-- | content/public/common/content_switches.cc | 3 | ||||
-rw-r--r-- | content/public/common/content_switches.h | 1 |
12 files changed, 59 insertions, 72 deletions
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index fe09246..8c96baa 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -804,7 +804,7 @@ const FeatureEntry kFeatureEntries[] = { IDS_FLAGS_DOWNLOAD_RESUMPTION_NAME, IDS_FLAGS_DOWNLOAD_RESUMPTION_DESCRIPTION, kOsDesktop, - SINGLE_VALUE_TYPE(switches::kEnableDownloadResumption)}, + FEATURE_VALUE_TYPE(features::kDownloadResumption)}, #if defined(OS_CHROMEOS) {"download-notification", IDS_FLAGS_DOWNLOAD_NOTIFICATION_NAME, diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index e5f6c5d..9e1ffb6 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" +#include "base/feature_list.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -80,6 +81,7 @@ #include "content/public/browser/render_widget_host.h" #include "content/public/browser/resource_context.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/context_menu_params.h" #include "content/public/test/browser_test_utils.h" @@ -407,6 +409,11 @@ class DownloadTest : public InProcessBrowserTest { DownloadTest() {} void SetUpOnMainThread() override { + base::FeatureList::ClearInstanceForTesting(); + scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + feature_list->InitializeFromCommandLine( + features::kDownloadResumption.name, std::string()); + base::FeatureList::SetInstance(std::move(feature_list)); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); @@ -844,11 +851,16 @@ class DownloadTest : public InProcessBrowserTest { browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_contents); - scoped_ptr<content::DownloadTestObserver> observer( - new content::DownloadTestObserverTerminal( - download_manager, - 1, - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); + scoped_ptr<content::DownloadTestObserver> observer; + if (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) { + observer.reset(new content::DownloadTestObserverTerminal( + download_manager, 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); + } else { + observer.reset(new content::DownloadTestObserverInterrupted( + download_manager, 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); + } if (download_info.download_method == DOWNLOAD_DIRECT) { // Go directly to download. Don't wait for navigation. @@ -1691,9 +1703,11 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { // at this point as our queries will be behind the history updates // invoked by completion. scoped_ptr<content::DownloadTestObserver> download_observer( - CreateWaiter(browser(), 1)); - ui_test_utils::NavigateToURL(browser(), - GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl)); + new content::DownloadTestObserverInterrupted( + DownloadManagerForBrowser(browser()), 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); + ui_test_utils::NavigateToURL( + browser(), GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl)); download_observer->WaitForFinished(); EXPECT_EQ(1u, download_observer->NumDownloadsSeenInState( DownloadItem::INTERRUPTED)); @@ -3018,8 +3032,6 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, MAYBE_DownloadTest_PercentComplete) { // A download that is interrupted due to a file error should be able to be // resumed. IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_NoPrompt) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); @@ -3043,8 +3055,6 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_NoPrompt) { // path is invalid or unusable should cause a prompt to be displayed on // resumption. IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPrompt) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); @@ -3067,8 +3077,6 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPrompt) { // The user shouldn't be prompted on a resumed download unless a prompt is // necessary due to the interrupt reason. IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPromptAlways) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); browser()->profile()->GetPrefs()->SetBoolean( prefs::kPromptForDownload, true); scoped_refptr<content::TestFileErrorInjector> error_injector( @@ -3097,8 +3105,6 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPromptAlways) { // A download that is interrupted due to a transient error should be resumed // automatically. IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_Automatic) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); @@ -3117,8 +3123,6 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_Automatic) { // An interrupting download should be resumable multiple times. IN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_MultipleAttempts) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); diff --git a/chrome/browser/download/download_shelf_context_menu.cc b/chrome/browser/download/download_shelf_context_menu.cc index b541b59..91a5728 100644 --- a/chrome/browser/download/download_shelf_context_menu.cc +++ b/chrome/browser/download/download_shelf_context_menu.cc @@ -4,10 +4,9 @@ #include "chrome/browser/download/download_shelf_context_menu.h" -#include "base/command_line.h" #include "chrome/browser/download/download_item_model.h" #include "chrome/grit/generated_resources.h" -#include "content/public/common/content_switches.h" +#include "content/public/common/content_features.h" #include "extensions/common/extension.h" #include "ui/base/l10n/l10n_util.h" @@ -21,8 +20,7 @@ namespace { // Returns true if downloads resumption is enabled. bool IsDownloadResumptionEnabled() { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableDownloadResumption); + return base::FeatureList::IsEnabled(features::kDownloadResumption); } } // namespace diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc index 7846aea..a04323e 100644 --- a/chrome/browser/download/notification/download_notification_browsertest.cc +++ b/chrome/browser/download/notification/download_notification_browsertest.cc @@ -668,7 +668,7 @@ IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, InterruptDownload) { // Installs observers before requesting. NotificationUpdateObserver download_notification_update_observer(notification_id()); - content::DownloadTestObserverTerminal download_terminal_observer( + content::DownloadTestObserverInterrupted download_terminal_observer( GetDownloadManager(browser()), 1u, /* wait_count */ content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); @@ -722,7 +722,7 @@ IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, // Installs observers before requesting the completion. NotificationAddObserver download_notification_add_observer; - content::DownloadTestObserverTerminal download_terminal_observer( + content::DownloadTestObserverInterrupted download_terminal_observer( download_manager, 1u, /* wait_count */ content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc index 6e8821d..6f78404 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc @@ -37,7 +37,7 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" -#include "content/public/common/content_switches.h" +#include "content/public/common/content_features.h" #include "content/public/test/download_test_observer.h" #include "extensions/browser/event_router.h" #include "extensions/browser/notification_types.h" @@ -309,6 +309,12 @@ class DownloadExtensionTest : public ExtensionApiTest { // InProcessBrowserTest void SetUpOnMainThread() override { + base::FeatureList::ClearInstanceForTesting(); + scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + feature_list->InitializeFromCommandLine( + features::kDownloadResumption.name, std::string()); + base::FeatureList::SetInstance(std::move(feature_list)); + ExtensionApiTest::SetUpOnMainThread(); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, @@ -3858,8 +3864,6 @@ IN_PROC_BROWSER_TEST_F( IN_PROC_BROWSER_TEST_F( DownloadExtensionTest, MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); LoadExtension("downloads_split"); ASSERT_TRUE(StartEmbeddedTestServer()); GoOnTheRecord(); diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index 73a21c4..c763b87 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc @@ -8,7 +8,7 @@ #include <vector> #include "base/callback_helpers.h" -#include "base/command_line.h" +#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" @@ -26,7 +26,7 @@ #include "content/browser/download/download_resource_handler.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/power_save_blocker.h" -#include "content/public/common/content_switches.h" +#include "content/public/common/content_features.h" #include "content/public/common/webplugininfo.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" @@ -709,8 +709,12 @@ class DownloadResumptionContentTest public ::testing::WithParamInterface<DownloadResumptionTestType> { public: void SetUpOnMainThread() override { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); + base::FeatureList::ClearInstanceForTesting(); + scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + feature_list->InitializeFromCommandLine( + features::kDownloadResumption.name, std::string()); + base::FeatureList::SetInstance(std::move(feature_list)); + DownloadContentTest::SetUpOnMainThread(); if (GetParam() == DownloadResumptionTestType::RESUME_WITHOUT_RENDERER) diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc index cf42944..2826d31 100644 --- a/content/browser/download/download_item_impl.cc +++ b/content/browser/download/download_item_impl.cc @@ -27,7 +27,6 @@ #include "base/basictypes.h" #include "base/bind.h" -#include "base/command_line.h" #include "base/files/file_util.h" #include "base/format_macros.h" #include "base/logging.h" @@ -49,7 +48,7 @@ #include "content/public/browser/download_danger_type.h" #include "content/public/browser/download_interrupt_reasons.h" #include "content/public/browser/download_url_parameters.h" -#include "content/public/common/content_switches.h" +#include "content/public/common/content_features.h" #include "content/public/common/referrer.h" #include "net/base/net_util.h" @@ -93,8 +92,7 @@ static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { } bool IsDownloadResumptionEnabled() { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableDownloadResumption); + return base::FeatureList::IsEnabled(features::kDownloadResumption); } } // namespace @@ -1672,12 +1670,7 @@ void DownloadItemImpl::AutoResumeIfValid() { void DownloadItemImpl::ResumeInterruptedDownload() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - - // If the flag for downloads resumption isn't enabled, ignore - // this request. - const base::CommandLine& command_line = - *base::CommandLine::ForCurrentProcess(); - if (!command_line.HasSwitch(switches::kEnableDownloadResumption)) + if (!IsDownloadResumptionEnabled()) return; // If we're not interrupted, ignore the request; our caller is drunk. diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc index 862d7d8..75fce50 100644 --- a/content/browser/download/download_item_impl_unittest.cc +++ b/content/browser/download/download_item_impl_unittest.cc @@ -3,7 +3,7 @@ // found in the LICENSE file. #include "base/callback.h" -#include "base/command_line.h" +#include "base/feature_list.h" #include "base/message_loop/message_loop.h" #include "base/stl_util.h" #include "base/threading/thread.h" @@ -17,7 +17,7 @@ #include "content/public/browser/download_destination_observer.h" #include "content/public/browser/download_interrupt_reasons.h" #include "content/public/browser/download_url_parameters.h" -#include "content/public/common/content_switches.h" +#include "content/public/common/content_features.h" #include "content/public/test/mock_download_item.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread.h" @@ -192,6 +192,11 @@ class DownloadItemTest : public testing::Test { } virtual void SetUp() { + base::FeatureList::ClearInstanceForTesting(); + scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + feature_list->InitializeFromCommandLine(features::kDownloadResumption.name, + std::string()); + base::FeatureList::SetInstance(std::move(feature_list)); } virtual void TearDown() { @@ -399,9 +404,6 @@ TEST_F(DownloadItemTest, NotificationAfterDestroyed) { } TEST_F(DownloadItemTest, ContinueAfterInterrupted) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); - TestBrowserContext test_browser_context; DownloadItemImpl* item = CreateDownloadItem(); TestDownloadItemObserver observer(item); @@ -432,9 +434,6 @@ TEST_F(DownloadItemTest, ContinueAfterInterrupted) { // Same as above, but with a non-continuable interrupt. TEST_F(DownloadItemTest, RestartAfterInterrupted) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); - DownloadItemImpl* item = CreateDownloadItem(); TestDownloadItemObserver observer(item); MockDownloadFile* download_file = @@ -455,9 +454,6 @@ TEST_F(DownloadItemTest, RestartAfterInterrupted) { // Check we do correct cleanup for RESUME_MODE_INVALID interrupts. TEST_F(DownloadItemTest, UnresumableInterrupt) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); - DownloadItemImpl* item = CreateDownloadItem(); TestDownloadItemObserver observer(item); MockDownloadFile* download_file = @@ -484,9 +480,6 @@ TEST_F(DownloadItemTest, UnresumableInterrupt) { } TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); - TestBrowserContext test_browser_context; DownloadItemImpl* item = CreateDownloadItem(); base::WeakPtr<DownloadDestinationObserver> as_observer( @@ -546,9 +539,6 @@ TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { // Test that resumption uses the final URL in a URL chain when resuming. TEST_F(DownloadItemTest, ResumeUsingFinalURL) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); - TestBrowserContext test_browser_context; scoped_ptr<DownloadCreateInfo> create_info(new DownloadCreateInfo); create_info->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); @@ -847,8 +837,6 @@ TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Restart) { // intermediate path should be retained when the download is interrupted after // the intermediate rename succeeds. TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); DownloadItemImpl* item = CreateDownloadItem(); DownloadItemImplDelegate::DownloadTargetCallback callback; MockDownloadFile* download_file = @@ -882,8 +870,6 @@ TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { // As above. If the intermediate rename fails, then the interrupt reason should // be set to the destination error and the intermediate path should be empty. TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Failed) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); DownloadItemImpl* item = CreateDownloadItem(); DownloadItemImplDelegate::DownloadTargetCallback callback; MockDownloadFile* download_file = @@ -1282,8 +1268,6 @@ TEST_F(DownloadItemTest, StealDangerousDownload) { } TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); base::FilePath returned_path; DownloadItemImpl* item = CreateDownloadItem(); MockDownloadFile* download_file = @@ -1308,8 +1292,6 @@ TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { } TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableDownloadResumption); base::FilePath returned_path; DownloadItemImpl* item = CreateDownloadItem(); MockDownloadFile* download_file = diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index fef006d..a9e9acf 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc @@ -8,6 +8,11 @@ namespace features { // All features in alphabetical order. +// Downloads resumption will be controllable via a flag until it's enabled +// permanently. See https://crbug.com/7648 +const base::Feature kDownloadResumption{"DownloadResumption", + base::FEATURE_ENABLED_BY_DEFAULT}; + // The Experimental Framework for controlling access to API experiments. const base::Feature kExperimentalFramework{"ExperimentalFramework", base::FEATURE_DISABLED_BY_DEFAULT}; diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 3abb36b..0645a2e 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h @@ -8,14 +8,15 @@ #ifndef CONTENT_PUBLIC_COMMON_CONTENT_FEATURES_H_ #define CONTENT_PUBLIC_COMMON_CONTENT_FEATURES_H_ -#include "build/build_config.h" #include "base/feature_list.h" +#include "build/build_config.h" #include "content/common/content_export.h" namespace features { // All features in alphabetical order. The features should be documented // alongside the definition of their values in the .cc file. +CONTENT_EXPORT extern const base::Feature kDownloadResumption; CONTENT_EXPORT extern const base::Feature kExperimentalFramework; #if defined(OS_ANDROID) diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 2399fe5..ceb611e 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -337,9 +337,6 @@ const char kEnableDisplayList2dCanvas[] = "enable-display-list-2d-canvas"; const char kForceDisplayList2dCanvas[] = "force-display-list-2d-canvas"; const char kDisableDisplayList2dCanvas[] = "disable-display-list-2d-canvas"; -// Enables restarting interrupted downloads. -const char kEnableDownloadResumption[] = "enable-download-resumption"; - // Disables (unprefixed) Encrypted Media Extensions. const char kDisableEncryptedMedia[] = "disable-encrypted-media"; diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 168ed4b..3c9954f 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h @@ -104,7 +104,6 @@ CONTENT_EXPORT extern const char kEnableBlinkFeatures[]; CONTENT_EXPORT extern const char kEnableBrowserSideNavigation[]; CONTENT_EXPORT extern const char kEnableDisplayList2dCanvas[]; CONTENT_EXPORT extern const char kEnableDistanceFieldText[]; -CONTENT_EXPORT extern const char kEnableDownloadResumption[]; CONTENT_EXPORT extern const char kEnableExperimentalCanvasFeatures[]; CONTENT_EXPORT extern const char kEnableExperimentalWebPlatformFeatures[]; CONTENT_EXPORT extern const char kEnableFeatures[]; |