diff --git a/DEPS b/DEPS index 3f99299f..d1956b6f 100644 --- a/DEPS +++ b/DEPS
@@ -44,7 +44,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'ddd9218d2cec032d77cdc41b8e426c860e4c7898', + 'v8_revision': '4c672f28bb3980d31dd916a426a5e1138775f8d1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other.
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0ff9de1..b419498ae 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4137,6 +4137,7 @@ "//chrome/browser/ui/webui/omnibox:mojo_bindings__generator", "//chrome/browser/ui/webui/usb_internals:mojo_bindings__generator", "//device/bluetooth/public/interfaces:experimental_interfaces__generator", + "//device/bluetooth/public/interfaces:interfaces__generator", "//url/mojo:url_mojom_gurl__generator", "//url/mojo:url_mojom_origin__generator", ]
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc index d21b916..00dd9e6d 100644 --- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc +++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -58,6 +58,9 @@ #include "chrome/browser/android/chrome_feature_list.h" #include "chrome/browser/android/ntp/ntp_snippets_launcher.h" #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "chrome/browser/download/download_history.h" +#include "chrome/browser/download/download_service.h" +#include "chrome/browser/download/download_service_factory.h" #include "chrome/browser/ntp_snippets/download_suggestions_provider.h" #include "components/ntp_snippets/offline_pages/recent_tab_suggestions_provider.h" #include "components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.h" @@ -120,13 +123,14 @@ void RegisterDownloadsProvider(OfflinePageModel* offline_page_model, DownloadManager* download_manager, + DownloadHistory* download_history, ContentSuggestionsService* service, PrefService* pref_service) { bool download_manager_ui_enabled = base::FeatureList::IsEnabled(chrome::android::kDownloadsUiFeature); auto provider = base::MakeUnique<DownloadSuggestionsProvider>( - service, offline_page_model, download_manager, pref_service, - download_manager_ui_enabled); + service, offline_page_model, download_manager, download_history, + pref_service, download_manager_ui_enabled); service->RegisterProvider(std::move(provider)); } #endif // OS_ANDROID @@ -288,6 +292,9 @@ OfflinePageModelFactory::GetForBrowserContext(profile); DownloadManager* download_manager = content::BrowserContext::GetDownloadManager(profile); + DownloadService* download_service = + DownloadServiceFactory::GetForBrowserContext(profile); + DownloadHistory* download_history = download_service->GetDownloadHistory(); PhysicalWebDataSource* physical_web_data_source = g_browser_process->GetPhysicalWebDataSource(); #endif // OS_ANDROID @@ -312,8 +319,8 @@ if (show_asset_downloads || show_offline_page_downloads) { RegisterDownloadsProvider( show_offline_page_downloads ? offline_page_model : nullptr, - show_asset_downloads ? download_manager : nullptr, service, - pref_service); + show_asset_downloads ? download_manager : nullptr, download_history, + service, pref_service); } #endif // OS_ANDROID
diff --git a/chrome/browser/ntp_snippets/download_suggestions_provider.cc b/chrome/browser/ntp_snippets/download_suggestions_provider.cc index a37f7878..b4f04691 100644 --- a/chrome/browser/ntp_snippets/download_suggestions_provider.cc +++ b/chrome/browser/ntp_snippets/download_suggestions_provider.cc
@@ -17,7 +17,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" -#include "base/values.h" #include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" #include "components/ntp_snippets/features.h" @@ -30,7 +29,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/image/image.h" -using base::ContainsValue; using content::DownloadItem; using content::DownloadManager; using ntp_snippets::Category; @@ -51,9 +49,6 @@ const char* kMaxSuggestionsCountParamName = "downloads_max_count"; -// Maximal number of dismissed asset download IDs stored at any time. -const int kMaxDismissedIdCount = 100; - bool CompareOfflinePagesMostRecentlyCreatedFirst(const OfflinePageItem& left, const OfflinePageItem& right) { return left.creation_time > right.creation_time; @@ -131,6 +126,7 @@ ContentSuggestionsProvider::Observer* observer, offline_pages::OfflinePageModel* offline_page_model, content::DownloadManager* download_manager, + DownloadHistory* download_history, PrefService* pref_service, bool download_manager_ui_enabled) : ContentSuggestionsProvider(observer), @@ -139,8 +135,10 @@ ntp_snippets::KnownCategories::DOWNLOADS)), offline_page_model_(offline_page_model), download_manager_(download_manager), + download_history_(download_history), pref_service_(pref_service), download_manager_ui_enabled_(download_manager_ui_enabled), + is_asset_downloads_initialization_complete_(false), weak_ptr_factory_(this) { observer->OnCategoryStatusChanged(this, provided_category_, category_status_); @@ -150,23 +148,35 @@ } if (download_manager_) { - download_manager_->AddObserver(this); + // We will start listening to download manager once it is loaded. + // May be nullptr in tests. + if (download_history_) { + download_history_->AddObserver(this); + } + } else { + download_history_ = nullptr; } - // We explicitly fetch the asset downloads in case some of |OnDownloadCreated| - // happened earlier and, therefore, were missed. - AsynchronouslyFetchAllDownloadsAndSubmitSuggestions(); + if (!download_manager_) { + // Usually, all downloads are fetched when the download manager is loaded, + // but now it is disabled, so offline pages are fetched here instead. + AsynchronouslyFetchOfflinePagesDownloads(/*notify=*/true); + } } DownloadSuggestionsProvider::~DownloadSuggestionsProvider() { - if (offline_page_model_) { - offline_page_model_->RemoveObserver(this); + if (download_history_) { + download_history_->RemoveObserver(this); } if (download_manager_) { download_manager_->RemoveObserver(this); UnregisterDownloadItemObservers(); } + + if (offline_page_model_) { + offline_page_model_->RemoveObserver(this); + } } CategoryStatus DownloadSuggestionsProvider::GetCategoryStatus( @@ -190,8 +200,12 @@ void DownloadSuggestionsProvider::DismissSuggestion( const ContentSuggestion::ID& suggestion_id) { DCHECK_EQ(provided_category_, suggestion_id.category()); + std::set<std::string> dismissed_ids = + ReadDismissedIDsFromPrefs(CorrespondsToOfflinePage(suggestion_id)); + dismissed_ids.insert(suggestion_id.id_within_category()); + StoreDismissedIDsToPrefs(CorrespondsToOfflinePage(suggestion_id), + dismissed_ids); - AddToDismissedStorageIfNeeded(suggestion_id); RemoveSuggestionFromCacheAndRetrieveMoreIfNeeded(suggestion_id); } @@ -262,7 +276,7 @@ void DownloadSuggestionsProvider::ClearDismissedSuggestionsForDebugging( Category category) { DCHECK_EQ(provided_category_, category); - StoreAssetDismissedIDsToPrefs(std::vector<std::string>()); + StoreAssetDismissedIDsToPrefs(std::set<std::string>()); StoreOfflinePageDismissedIDsToPrefs(std::set<std::string>()); AsynchronouslyFetchAllDownloadsAndSubmitSuggestions(); } @@ -274,10 +288,6 @@ registry->RegisterListPref(kDismissedOfflinePageDownloadSuggestions); } -int DownloadSuggestionsProvider::GetMaxDismissedCountForTesting() { - return kMaxDismissedIdCount; -} - //////////////////////////////////////////////////////////////////////////////// // Private methods @@ -285,12 +295,10 @@ GetPagesMatchingQueryCallbackForGetDismissedSuggestions( const ntp_snippets::DismissedSuggestionsCallback& callback, const std::vector<OfflinePageItem>& offline_pages) const { - std::set<std::string> dismissed_offline_ids = - ReadOfflinePageDismissedIDsFromPrefs(); + std::set<std::string> dismissed_ids = ReadOfflinePageDismissedIDsFromPrefs(); std::vector<ContentSuggestion> suggestions; for (const OfflinePageItem& item : offline_pages) { - if (dismissed_offline_ids.count( - GetOfflinePagePerCategoryID(item.offline_id))) { + if (dismissed_ids.count(GetOfflinePagePerCategoryID(item.offline_id))) { suggestions.push_back(ConvertOfflinePage(item)); } } @@ -299,12 +307,10 @@ std::vector<DownloadItem*> all_downloads; download_manager_->GetAllDownloads(&all_downloads); - std::vector<std::string> dismissed_asset_ids = - ReadAssetDismissedIDsFromPrefs(); + dismissed_ids = ReadAssetDismissedIDsFromPrefs(); for (const DownloadItem* item : all_downloads) { - if (ContainsValue(dismissed_asset_ids, - GetAssetDownloadPerCategoryID(item->GetId()))) { + if (dismissed_ids.count(GetAssetDownloadPerCategoryID(item->GetId()))) { suggestions.push_back(ConvertDownloadItem(*item)); } } @@ -361,9 +367,11 @@ void DownloadSuggestionsProvider::OnDownloadCreated(DownloadManager* manager, DownloadItem* item) { + DCHECK(is_asset_downloads_initialization_complete_); DCHECK_EQ(download_manager_, manager); - // This is called when new downloads are started and on startup for existing - // ones. We listen to each item to know when it is destroyed. + + // This is called when new downloads are started. We listen to each item to + // know when it is finished or destroyed. item->AddObserver(this); if (CacheAssetDownloadIfNeeded(item)) { SubmitContentSuggestions(); @@ -374,10 +382,15 @@ DCHECK_EQ(download_manager_, manager); UnregisterDownloadItemObservers(); download_manager_ = nullptr; + if (download_history_) { + download_history_->RemoveObserver(this); + download_history_ = nullptr; + } } void DownloadSuggestionsProvider::OnDownloadUpdated(DownloadItem* item) { - if (ContainsValue(cached_asset_downloads_, item)) { + DCHECK(is_asset_downloads_initialization_complete_); + if (base::ContainsValue(cached_asset_downloads_, item)) { if (item->GetFileExternallyRemoved()) { InvalidateSuggestion(GetAssetDownloadPerCategoryID(item->GetId())); } else { @@ -404,6 +417,8 @@ void DownloadSuggestionsProvider::OnDownloadDestroyed( content::DownloadItem* item) { + DCHECK(is_asset_downloads_initialization_complete_); + item->RemoveObserver(this); if (!IsDownloadCompleted(*item)) { @@ -414,6 +429,20 @@ InvalidateSuggestion(GetAssetDownloadPerCategoryID(item->GetId())); } +void DownloadSuggestionsProvider::OnHistoryQueryComplete() { + is_asset_downloads_initialization_complete_ = true; + if (download_manager_) { + download_manager_->AddObserver(this); + } + AsynchronouslyFetchAllDownloadsAndSubmitSuggestions(); +} + +void DownloadSuggestionsProvider::OnDownloadHistoryDestroyed() { + DCHECK(download_history_); + download_history_->RemoveObserver(this); + download_history_ = nullptr; +} + void DownloadSuggestionsProvider::NotifyStatusChanged( CategoryStatus new_status) { DCHECK_NE(CategoryStatus::NOT_PROVIDED, category_status_); @@ -458,23 +487,27 @@ std::vector<DownloadItem*> all_downloads; download_manager_->GetAllDownloads(&all_downloads); - std::vector<std::string> old_dismissed_ids = ReadAssetDismissedIDsFromPrefs(); + std::set<std::string> old_dismissed_ids = ReadAssetDismissedIDsFromPrefs(); + std::set<std::string> retained_dismissed_ids; cached_asset_downloads_.clear(); - for (const DownloadItem* item : all_downloads) { + for (DownloadItem* item : all_downloads) { std::string within_category_id = GetAssetDownloadPerCategoryID(item->GetId()); - if (!ContainsValue(old_dismissed_ids, within_category_id)) { - if (IsDownloadCompleted(*item)) { - cached_asset_downloads_.push_back(item); - } + if (old_dismissed_ids.count(within_category_id)) { + retained_dismissed_ids.insert(within_category_id); + } else if (IsDownloadCompleted(*item)) { + cached_asset_downloads_.push_back(item); + // We may already observe this item and, therefore, we remove the + // observer first. + item->RemoveObserver(this); + item->AddObserver(this); } } - // We do not prune dismissed IDs, because it is not possible to ensure that - // the list of downloads is complete (i.e. DownloadManager has finished - // reading them). - // TODO(vitaliii): Prune dismissed IDs once the |OnLoaded| notification is - // provided. See crbug.com/672758. + if (old_dismissed_ids.size() != retained_dismissed_ids.size()) { + StoreAssetDismissedIDsToPrefs(retained_dismissed_ids); + } + const int max_suggestions_count = GetMaxSuggestionsCount(); if (static_cast<int>(cached_asset_downloads_.size()) > max_suggestions_count) { @@ -572,13 +605,12 @@ return false; } - if (ContainsValue(cached_asset_downloads_, item)) { + if (base::ContainsValue(cached_asset_downloads_, item)) { return false; } - std::vector<std::string> dismissed_ids = ReadAssetDismissedIDsFromPrefs(); - if (ContainsValue(dismissed_ids, - GetAssetDownloadPerCategoryID(item->GetId()))) { + std::set<std::string> dismissed_ids = ReadAssetDismissedIDsFromPrefs(); + if (dismissed_ids.count(GetAssetDownloadPerCategoryID(item->GetId()))) { return false; } @@ -716,38 +748,31 @@ ContentSuggestion::ID suggestion_id(provided_category_, id_within_category); observer()->OnSuggestionInvalidated(this, suggestion_id); - RemoveFromDismissedStorageIfNeeded(suggestion_id); + std::set<std::string> dismissed_ids = + ReadDismissedIDsFromPrefs(CorrespondsToOfflinePage(suggestion_id)); + auto it = dismissed_ids.find(id_within_category); + if (it != dismissed_ids.end()) { + dismissed_ids.erase(it); + StoreDismissedIDsToPrefs(CorrespondsToOfflinePage(suggestion_id), + dismissed_ids); + } + RemoveSuggestionFromCacheAndRetrieveMoreIfNeeded(suggestion_id); } -// TODO(vitaliii): Do not use std::vector, when we ensure that pruning happens -// at the right time (crbug.com/672758). -std::vector<std::string> +std::set<std::string> DownloadSuggestionsProvider::ReadAssetDismissedIDsFromPrefs() const { - std::vector<std::string> dismissed_ids; - const base::ListValue* list = - pref_service_->GetList(kDismissedAssetDownloadSuggestions); - for (const std::unique_ptr<base::Value>& value : *list) { - std::string dismissed_id; - bool success = value->GetAsString(&dismissed_id); - DCHECK(success) << "Failed to parse dismissed id from prefs param " - << kDismissedAssetDownloadSuggestions << " into string."; - dismissed_ids.push_back(dismissed_id); - } - return dismissed_ids; + return ntp_snippets::prefs::ReadDismissedIDsFromPrefs( + *pref_service_, kDismissedAssetDownloadSuggestions); } void DownloadSuggestionsProvider::StoreAssetDismissedIDsToPrefs( - const std::vector<std::string>& dismissed_ids) { + const std::set<std::string>& dismissed_ids) { DCHECK(std::all_of( dismissed_ids.begin(), dismissed_ids.end(), [](const std::string& id) { return id[0] == kAssetDownloadsPrefix; })); - - base::ListValue list; - for (const std::string& dismissed_id : dismissed_ids) { - list.AppendString(dismissed_id); - } - pref_service_->Set(kDismissedAssetDownloadSuggestions, list); + ntp_snippets::prefs::StoreDismissedIDsToPrefs( + pref_service_, kDismissedAssetDownloadSuggestions, dismissed_ids); } std::set<std::string> @@ -766,45 +791,21 @@ pref_service_, kDismissedOfflinePageDownloadSuggestions, dismissed_ids); } -void DownloadSuggestionsProvider::AddToDismissedStorageIfNeeded( - const ContentSuggestion::ID& suggestion_id) { - if (CorrespondsToOfflinePage(suggestion_id)) { - std::set<std::string> dismissed_ids = - ReadOfflinePageDismissedIDsFromPrefs(); - dismissed_ids.insert(suggestion_id.id_within_category()); - StoreOfflinePageDismissedIDsToPrefs(dismissed_ids); - } else { - std::vector<std::string> dismissed_ids = ReadAssetDismissedIDsFromPrefs(); - // The suggestion may be double dismissed from previously opened NTPs. - if (!ContainsValue(dismissed_ids, suggestion_id.id_within_category())) { - dismissed_ids.push_back(suggestion_id.id_within_category()); - // TODO(vitaliii): Remove this workaround once the dismissed ids are - // pruned. See crbug.com/672758. - while (dismissed_ids.size() > kMaxDismissedIdCount) { - dismissed_ids.erase(dismissed_ids.begin()); - } - StoreAssetDismissedIDsToPrefs(dismissed_ids); - } +std::set<std::string> DownloadSuggestionsProvider::ReadDismissedIDsFromPrefs( + bool for_offline_page_downloads) const { + if (for_offline_page_downloads) { + return ReadOfflinePageDismissedIDsFromPrefs(); } + return ReadAssetDismissedIDsFromPrefs(); } -void DownloadSuggestionsProvider::RemoveFromDismissedStorageIfNeeded( - const ContentSuggestion::ID& suggestion_id) { - if (CorrespondsToOfflinePage(suggestion_id)) { - std::set<std::string> dismissed_ids = - ReadOfflinePageDismissedIDsFromPrefs(); - if (dismissed_ids.count(suggestion_id.id_within_category())) { - dismissed_ids.erase(suggestion_id.id_within_category()); - StoreOfflinePageDismissedIDsToPrefs(dismissed_ids); - } +void DownloadSuggestionsProvider::StoreDismissedIDsToPrefs( + bool for_offline_page_downloads, + const std::set<std::string>& dismissed_ids) { + if (for_offline_page_downloads) { + StoreOfflinePageDismissedIDsToPrefs(dismissed_ids); } else { - std::vector<std::string> dismissed_ids = ReadAssetDismissedIDsFromPrefs(); - auto it = std::find(dismissed_ids.begin(), dismissed_ids.end(), - suggestion_id.id_within_category()); - if (it != dismissed_ids.end()) { - dismissed_ids.erase(it); - StoreAssetDismissedIDsToPrefs(dismissed_ids); - } + StoreAssetDismissedIDsToPrefs(dismissed_ids); } }
diff --git a/chrome/browser/ntp_snippets/download_suggestions_provider.h b/chrome/browser/ntp_snippets/download_suggestions_provider.h index 5ee5baf..a6f2fb39 100644 --- a/chrome/browser/ntp_snippets/download_suggestions_provider.h +++ b/chrome/browser/ntp_snippets/download_suggestions_provider.h
@@ -12,6 +12,7 @@ #include "base/callback_forward.h" #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/download/download_history.h" #include "components/ntp_snippets/callbacks.h" #include "components/ntp_snippets/category.h" #include "components/ntp_snippets/category_status.h" @@ -37,12 +38,14 @@ : public ntp_snippets::ContentSuggestionsProvider, public offline_pages::OfflinePageModel::Observer, public content::DownloadManager::Observer, - public content::DownloadItem::Observer { + public content::DownloadItem::Observer, + public DownloadHistory::Observer { public: DownloadSuggestionsProvider( ContentSuggestionsProvider::Observer* observer, offline_pages::OfflinePageModel* offline_page_model, content::DownloadManager* download_manager, + DownloadHistory* download_history, PrefService* pref_service, bool download_manager_ui_enabled); ~DownloadSuggestionsProvider() override; @@ -73,8 +76,6 @@ static void RegisterProfilePrefs(PrefRegistrySimple* registry); - static int GetMaxDismissedCountForTesting(); - private: friend class DownloadSuggestionsProviderTest; @@ -101,6 +102,10 @@ void OnDownloadRemoved(content::DownloadItem* item) override; void OnDownloadDestroyed(content::DownloadItem* item) override; + // DownloadHistory::Observer implementation. + void OnHistoryQueryComplete() override; + void OnDownloadHistoryDestroyed() override; + // Updates the |category_status_| of the |provided_category_| and notifies the // |observer_|, if necessary. void NotifyStatusChanged(ntp_snippets::CategoryStatus new_status); @@ -171,11 +176,11 @@ void InvalidateSuggestion(const std::string& id_within_category); // Reads dismissed IDs related to asset downloads from prefs. - std::vector<std::string> ReadAssetDismissedIDsFromPrefs() const; + std::set<std::string> ReadAssetDismissedIDsFromPrefs() const; // Writes |dismissed_ids| into prefs for asset downloads. void StoreAssetDismissedIDsToPrefs( - const std::vector<std::string>& dismissed_ids); + const std::set<std::string>& dismissed_ids); // Reads dismissed IDs related to offline page downloads from prefs. std::set<std::string> ReadOfflinePageDismissedIDsFromPrefs() const; @@ -184,15 +189,15 @@ void StoreOfflinePageDismissedIDsToPrefs( const std::set<std::string>& dismissed_ids); - // Adds a suggestion ID to the dismissed list in prefs, if it is not there. - // Works for both Offline Page and Asset downloads. - void AddToDismissedStorageIfNeeded( - const ntp_snippets::ContentSuggestion::ID& suggestion_id); + // Reads from prefs dismissed IDs related to either offline page or asset + // downloads (given by |for_offline_page_downloads|). + std::set<std::string> ReadDismissedIDsFromPrefs( + bool for_offline_page_downloads) const; - // Removes a suggestion ID from the dismissed list in prefs, if it is there. - // Works for both Offline Page and Asset downloads. - void RemoveFromDismissedStorageIfNeeded( - const ntp_snippets::ContentSuggestion::ID& suggestion_id); + // Writes |dismissed_ids| into prefs for either offline page or asset + // downloads (given by |for_offline_page_downloads|). + void StoreDismissedIDsToPrefs(bool for_offline_page_downloads, + const std::set<std::string>& dismissed_ids); void UnregisterDownloadItemObservers(); @@ -200,6 +205,7 @@ const ntp_snippets::Category provided_category_; offline_pages::OfflinePageModel* offline_page_model_; content::DownloadManager* download_manager_; + DownloadHistory* download_history_; PrefService* pref_service_; @@ -220,6 +226,8 @@ // for the Downloads section can redirect there. const bool download_manager_ui_enabled_; + bool is_asset_downloads_initialization_complete_; + base::WeakPtrFactory<DownloadSuggestionsProvider> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(DownloadSuggestionsProvider);
diff --git a/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc b/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc index 94d78f2..939bbed4 100644 --- a/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc +++ b/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc
@@ -18,17 +18,18 @@ #include "components/prefs/testing_pref_service.h" #include "content/public/test/mock_download_item.h" #include "content/public/test/mock_download_manager.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" using content::DownloadItem; using content::MockDownloadManager; using ntp_snippets::Category; +using ntp_snippets::CategoryStatus; using ntp_snippets::ContentSuggestion; using ntp_snippets::ContentSuggestionsProvider; using ntp_snippets::MockContentSuggestionsProviderObserver; using ntp_snippets::test::CaptureDismissedSuggestions; using ntp_snippets::test::FakeOfflinePageModel; -using ntp_snippets::CategoryStatus; using offline_pages::ClientId; using offline_pages::OfflinePageItem; using test::FakeDownloadItem; @@ -227,12 +228,28 @@ std::vector<std::unique_ptr<FakeDownloadItem>> items_; }; +class DummyHistoryAdapter : public DownloadHistory::HistoryAdapter { + public: + DummyHistoryAdapter() : HistoryAdapter(nullptr) {} + void QueryDownloads( + const history::HistoryService::DownloadQueryCallback& callback) override { + } + void CreateDownload(const history::DownloadRow& info, + const history::HistoryService::DownloadCreateCallback& + callback) override {} + void UpdateDownload(const history::DownloadRow& data, + bool should_commit_immediately) override {} + void RemoveDownloads(const std::set<uint32_t>& ids) override {} +}; + } // namespace class DownloadSuggestionsProviderTest : public testing::Test { public: DownloadSuggestionsProviderTest() - : pref_service_(new TestingPrefServiceSimple()) { + : download_history_(&downloads_manager_for_history_, + base::MakeUnique<DummyHistoryAdapter>()), + pref_service_(new TestingPrefServiceSimple()) { DownloadSuggestionsProvider::RegisterProfilePrefs( pref_service()->registry()); } @@ -251,13 +268,24 @@ EXPECT_CALL(observer_, OnSuggestionInvalidated(_, _)).Times(AnyNumber()); } + DownloadSuggestionsProvider* CreateLoadedProvider(bool show_assets, + bool show_offline_pages) { + CreateProvider(show_assets, show_offline_pages); + FireHistoryQueryComplete(); + return provider_.get(); + } + DownloadSuggestionsProvider* CreateProvider(bool show_assets, bool show_offline_pages) { DCHECK(!provider_); DCHECK(show_assets || show_offline_pages); + + // TODO(crbug.com/681766): Extract DownloadHistory interface and move + // implementation into DownloadHistoryImpl. Then mock it. provider_ = base::MakeUnique<DownloadSuggestionsProvider>( &observer_, show_offline_pages ? &offline_pages_model_ : nullptr, - show_assets ? &downloads_manager_ : nullptr, pref_service(), + show_assets ? &downloads_manager_ : nullptr, &download_history_, + pref_service(), /*download_manager_ui_enabled=*/false); return provider_.get(); } @@ -297,6 +325,8 @@ } } + void FireHistoryQueryComplete() { provider_->OnHistoryQueryComplete(); } + ContentSuggestion::ID GetDummySuggestionId(int id, bool is_offline_page) { return ContentSuggestion::ID( downloads_category(), @@ -324,6 +354,13 @@ TestingPrefServiceSimple* pref_service() { return pref_service_.get(); } private: + // DownloadHistory requires UI thread. + content::TestBrowserThreadBundle thread_bundle_; + + // We do not use DownloadHistory functionality in the tests, so we provide an + // empty manager to ensure no notifications, so that it does not intervene. + ObservedMockDownloadManager downloads_manager_for_history_; + DownloadHistory download_history_; ObservedMockDownloadManager downloads_manager_; FakeOfflinePageModel offline_pages_model_; StrictMock<MockContentSuggestionsProviderObserver> observer_; @@ -350,7 +387,7 @@ HasDownloadSuggestionExtra( /*is_download_asset=*/false, FILE_PATH_LITERAL(""), ""))))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); } TEST_F(DownloadSuggestionsProviderTest, @@ -360,7 +397,7 @@ EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), SizeIs(0))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); std::vector<std::unique_ptr<FakeDownloadItem>> asset_downloads = CreateDummyAssetDownloads({1, 2}); @@ -401,7 +438,7 @@ UnorderedElementsAre( HasUrl("http://dummy.com/1"), HasUrl("http://dummy.com/2")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); std::vector<std::unique_ptr<FakeDownloadItem>> asset_downloads = CreateDummyAssetDownloads({1, 2}); @@ -442,7 +479,7 @@ OnNewSuggestions(_, downloads_category(), ElementsAre(HasUrl("http://dummy.com/2"), HasUrl("http://dummy.com/1")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); std::vector<std::unique_ptr<FakeDownloadItem>> asset_downloads; asset_downloads.push_back(CreateDummyAssetDownload(3, next_week)); @@ -468,9 +505,8 @@ ShouldDismissWithoutNotifyingObservers) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(4ul)))) - .Times(2); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -478,11 +514,7 @@ HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); EXPECT_CALL(*observer(), OnNewSuggestions(_, _, _)).Times(0); EXPECT_CALL(*observer(), OnSuggestionInvalidated(_, _)).Times(0); @@ -499,9 +531,8 @@ ShouldNotReportDismissedSuggestionsOnNewData) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(4ul)))) - .Times(2); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -509,10 +540,7 @@ HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); @@ -531,9 +559,8 @@ TEST_F(DownloadSuggestionsProviderTest, ShouldReturnDismissedSuggestions) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(4ul)))) - .Times(2); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -541,10 +568,7 @@ HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); @@ -559,9 +583,8 @@ TEST_F(DownloadSuggestionsProviderTest, ShouldClearDismissedSuggestions) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(4ul)))) - .Times(2); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -569,10 +592,7 @@ HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); @@ -594,9 +614,8 @@ ShouldNotDismissOtherTypeWithTheSameID) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(4ul)))) - .Times(2); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -604,10 +623,7 @@ HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); @@ -625,9 +641,10 @@ TEST_F(DownloadSuggestionsProviderTest, ShouldReplaceDismissedItemWithNewData) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(5ul)))) - .Times(5); + // Currently the provider stores five items in its internal cache, so six + // items are needed to check whether all downloads are fetched on dismissal. + *(downloads_manager()->mutable_items()) = + CreateDummyAssetDownloads({1, 2, 3, 4, 5, 6}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -636,12 +653,7 @@ HasUrl("http://download.com/3"), HasUrl("http://download.com/4"), HasUrl("http://download.com/5")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - // Currently the provider stores five items in its internal cache, so six - // items are needed to check whether all downloads are fetched on dismissal. - *(downloads_manager()->mutable_items()) = - CreateDummyAssetDownloads({1, 2, 3, 4, 5, 6}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/false)); @@ -665,18 +677,15 @@ ShouldInvalidateWhenUnderlyingItemDeleted) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(3ul)))); + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), UnorderedElementsAre(HasUrl("http://dummy.com/1"), HasUrl("http://dummy.com/2"), HasUrl("http://download.com/1")))); - *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); // We add another item manually, so that when it gets deleted it is not // present in DownloadsManager list. @@ -706,9 +715,8 @@ IgnoreOnCategoryStatusChangedToAvailable(); IgnoreOnSuggestionInvalidated(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(5ul)))) - .Times(5); + *(downloads_manager()->mutable_items()) = + CreateDummyAssetDownloads({1, 2, 3, 4, 5}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), @@ -717,10 +725,7 @@ HasUrl("http://download.com/3"), HasUrl("http://download.com/4"), HasUrl("http://download.com/5")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); - *(downloads_manager()->mutable_items()) = - CreateDummyAssetDownloads({1, 2, 3, 4, 5}); - FireDownloadsCreated(downloads_manager()->items()); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); // Note that |CreateDummyAssetDownloads| creates items "downloaded" before // |base::Time::Now()|, so for a new item the time is set in future to enforce @@ -764,7 +769,7 @@ HasUrl("http://dummy.com/1"), HasUrl("http://dummy.com/2"), HasUrl("http://dummy.com/3")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); @@ -788,12 +793,13 @@ IgnoreOnCategoryStatusChangedToAvailable(); IgnoreOnSuggestionInvalidated(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(Lt(3ul)))) - .Times(3); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); - FireDownloadsCreated(downloads_manager()->items()); + EXPECT_CALL( + *observer(), + OnNewSuggestions(_, downloads_category(), + UnorderedElementsAre(HasUrl("http://download.com/1"), + HasUrl("http://download.com/2")))); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/false)); @@ -809,28 +815,41 @@ ShouldFetchAssetDownloadsOnStartupButOnlyOnce) { IgnoreOnCategoryStatusChangedToAvailable(); - // Downloads manager was created before the provider, so |OnDownloadCreated| - // calls "were" missed, but the provider must show missed items anyway. *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); EXPECT_CALL( *observer(), OnNewSuggestions(_, downloads_category(), UnorderedElementsAre(HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); +} + +TEST_F(DownloadSuggestionsProviderTest, + ShouldFetchAssetDownloadsOnHistoryQueryComplete) { + IgnoreOnCategoryStatusChangedToAvailable(); + + EXPECT_CALL(*observer(), OnNewSuggestions(_, _, _)).Times(0); CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1, 2}); + EXPECT_CALL( + *observer(), + OnNewSuggestions(_, downloads_category(), + UnorderedElementsAre(HasUrl("http://download.com/1"), + HasUrl("http://download.com/2")))); + FireHistoryQueryComplete(); } TEST_F(DownloadSuggestionsProviderTest, ShouldInvalidateAssetDownloadWhenItsFileRemoved) { IgnoreOnCategoryStatusChangedToAvailable(); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), IsEmpty())); - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), SizeIs(1))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); - FireDownloadsCreated(downloads_manager()->items()); + EXPECT_CALL( + *observer(), + OnNewSuggestions(_, downloads_category(), + UnorderedElementsAre(HasUrl("http://download.com/1")))); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); EXPECT_CALL(*observer(), OnSuggestionInvalidated( @@ -847,7 +866,7 @@ *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), IsEmpty())); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/false); std::vector<std::unique_ptr<FakeDownloadItem>> asset_downloads = CreateDummyAssetDownloads({1}); @@ -885,7 +904,7 @@ offline_pages_model()->set_is_loaded(false); EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), IsEmpty())); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateProvider(/*show_assets=*/false, /*show_offline_pages=*/true); *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); offline_pages_model()->set_is_loaded(true); @@ -907,7 +926,7 @@ UnorderedElementsAre( HasUrl("http://dummy.com/1"), HasUrl("http://dummy.com/2")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateProvider(/*show_assets=*/false, /*show_offline_pages=*/true); } TEST_F(DownloadSuggestionsProviderTest, @@ -921,35 +940,21 @@ OnNewSuggestions(_, downloads_category(), UnorderedElementsAre(HasUrl("http://download.com/1"), HasUrl("http://download.com/2")))); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/false); } TEST_F(DownloadSuggestionsProviderTest, - ShouldNotPruneDismissedSuggestionsOnStartup) { + ShouldLoadAndSubmitOfflinePagesEvenIfAssetDownloadsAreTurnedOff) { IgnoreOnCategoryStatusChangedToAvailable(); IgnoreOnSuggestionInvalidated(); - // We dismiss an item to store it in the list of dismissed items. - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); - EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); - provider()->DismissSuggestion( - GetDummySuggestionId(1, /*is_offline_page=*/false)); - DestroyProvider(); - - // We simulate current DownloadManager behaviour; - // The download manager has not started reading the list yet, so it is empty. - downloads_manager()->mutable_items()->clear(); - EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); - Mock::VerifyAndClearExpectations(observer()); - - // The first download is being read. - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); - EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)) - .Times(0); - FireDownloadCreated(downloads_manager()->items()[0].get()); - // The first download should not be reported, because it is dismissed. + *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1, 2}); + offline_pages_model()->set_is_loaded(true); + EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), + UnorderedElementsAre( + HasUrl("http://dummy.com/1"), + HasUrl("http://dummy.com/2")))); + CreateProvider(/*show_assets=*/false, /*show_offline_pages=*/true); } TEST_F(DownloadSuggestionsProviderTest, ShouldStoreDismissedSuggestions) { @@ -960,7 +965,7 @@ *(offline_pages_model()->mutable_items()) = CreateDummyOfflinePages({1}); *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); provider()->DismissSuggestion( GetDummySuggestionId(1, /*is_offline_page=*/true)); provider()->DismissSuggestion( @@ -969,41 +974,45 @@ DestroyProvider(); EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/true); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/true); EXPECT_THAT(GetDismissedSuggestions(), UnorderedElementsAre(HasUrl("http://dummy.com/1"), HasUrl("http://download.com/1"))); } -// TODO(vitaliii): Remove this test once the dismissed ids are pruned. See -// crbug.com/672758. -TEST_F(DownloadSuggestionsProviderTest, ShouldRemoveOldDismissedIdsIfTooMany) { +TEST_F(DownloadSuggestionsProviderTest, + ShouldNotPruneDismissedAssetDownloadsBeforeHistoryQueryComplete) { IgnoreOnCategoryStatusChangedToAvailable(); IgnoreOnSuggestionInvalidated(); - const int kMaxDismissedIdCount = - DownloadSuggestionsProvider::GetMaxDismissedCountForTesting(); - std::vector<int> ids; - for (int i = 0; i < kMaxDismissedIdCount + 1; ++i) { - ids.push_back(i); - } - - *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads(ids); + // Dismiss items to store them in the list of dismissed items. + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); EXPECT_CALL(*observer(), OnNewSuggestions(_, downloads_category(), _)); - CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); - - for (int i = 0; i < static_cast<int>(ids.size()); ++i) { - provider()->DismissSuggestion( - GetDummySuggestionId(i, /*is_offline_page=*/false)); - } - - EXPECT_THAT(GetDismissedSuggestions(), SizeIs(kMaxDismissedIdCount)); + CreateLoadedProvider(/*show_assets=*/true, /*show_offline_pages=*/false); + provider()->DismissSuggestion( + GetDummySuggestionId(1, /*is_offline_page=*/false)); + ASSERT_THAT(GetDismissedSuggestions(), + UnorderedElementsAre(HasUrl("http://download.com/1"))); + // Destroy and create provider to simulate turning off Chrome. DestroyProvider(); - // The oldest dismissed suggestion must become undismissed now. This is a - // temporary workaround and not what we want in long term. This test must be - // removed once we start pruning dismissed asset downloads on startup. - EXPECT_CALL(*observer(), - OnNewSuggestions(_, downloads_category(), - ElementsAre(HasUrl("http://download.com/0")))); + + downloads_manager()->mutable_items()->clear(); + + EXPECT_CALL(*observer(), OnNewSuggestions(_, _, _)).Times(0); CreateProvider(/*show_assets=*/true, /*show_offline_pages=*/false); + + // Dismissed IDs should not be pruned yet, because the downloads list at the + // manager is not complete. + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); + EXPECT_THAT(GetDismissedSuggestions(), + UnorderedElementsAre(HasUrl("http://download.com/1"))); + + EXPECT_CALL(*observer(), OnNewSuggestions(_, _, _)); + + downloads_manager()->mutable_items()->clear(); + FireHistoryQueryComplete(); + + *(downloads_manager()->mutable_items()) = CreateDummyAssetDownloads({1}); + // Once the manager has been loaded, the ids should be pruned. + EXPECT_THAT(GetDismissedSuggestions(), IsEmpty()); }
diff --git a/chrome/browser/resources/md_downloads/crisper.js b/chrome/browser/resources/md_downloads/crisper.js index 0be3e13f..1fc3129 100644 --- a/chrome/browser/resources/md_downloads/crisper.js +++ b/chrome/browser/resources/md_downloads/crisper.js
@@ -43,8 +43,8 @@ // Copyright 2015 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. -cr.define("downloads",function(){var Item=Polymer({is:"downloads-item",properties:{data:{type:Object},completelyOnDisk_:{computed:"computeCompletelyOnDisk_("+"data.state, data.file_externally_removed)",type:Boolean,value:true},controlledBy_:{computed:"computeControlledBy_(data.by_ext_id, data.by_ext_name)",type:String,value:""},isActive_:{computed:"computeIsActive_("+"data.state, data.file_externally_removed)",type:Boolean,value:true},isDangerous_:{computed:"computeIsDangerous_(data.state)",type:Boolean,value:false},isMalware_:{computed:"computeIsMalware_(isDangerous_, data.danger_type)",type:Boolean,value:false},isInProgress_:{computed:"computeIsInProgress_(data.state)",type:Boolean,value:false},pauseOrResumeText_:{computed:"computePauseOrResumeText_(isInProgress_, data.resume)",type:String},showCancel_:{computed:"computeShowCancel_(data.state)",type:Boolean,value:false},showProgress_:{computed:"computeShowProgress_(showCancel_, data.percent)",type:Boolean,value:false}},observers:["observeControlledBy_(controlledBy_)","observeIsDangerous_(isDangerous_, data)"],ready:function(){this.content=this.$.content},chopUrl_:function(url){return url.slice(0,300)},computeClass_:function(){var classes=[];if(this.isActive_)classes.push("is-active");if(this.isDangerous_)classes.push("dangerous");if(this.showProgress_)classes.push("show-progress");return classes.join(" ")},computeCompletelyOnDisk_:function(){return this.data.state==downloads.States.COMPLETE&&!this.data.file_externally_removed},computeControlledBy_:function(){if(!this.data.by_ext_id||!this.data.by_ext_name)return"";var url="chrome://extensions#"+this.data.by_ext_id;var name=this.data.by_ext_name;return loadTimeData.getStringF("controlledByUrl",url,HTMLEscape(name))},computeDangerIcon_:function(){return this.isDangerous_?"cr:warning":""},computeDate_:function(){assert(typeof this.data.hideDate=="boolean");if(this.data.hideDate)return"";return assert(this.data.since_string||this.data.date_string)},computeDescription_:function(){var data=this.data;switch(data.state){case downloads.States.DANGEROUS:var fileName=data.file_name;switch(data.danger_type){case downloads.DangerType.DANGEROUS_FILE:return loadTimeData.getString("dangerFileDesc");case downloads.DangerType.DANGEROUS_URL:case downloads.DangerType.DANGEROUS_CONTENT:case downloads.DangerType.DANGEROUS_HOST:return loadTimeData.getString("dangerDownloadDesc");case downloads.DangerType.UNCOMMON_CONTENT:return loadTimeData.getString("dangerUncommonDesc");case downloads.DangerType.POTENTIALLY_UNWANTED:return loadTimeData.getString("dangerSettingsDesc")}break;case downloads.States.IN_PROGRESS:case downloads.States.PAUSED:return data.progress_status_text}return""},computeIsActive_:function(){return this.data.state!=downloads.States.CANCELLED&&this.data.state!=downloads.States.INTERRUPTED&&!this.data.file_externally_removed},computeIsDangerous_:function(){return this.data.state==downloads.States.DANGEROUS},computeIsInProgress_:function(){return this.data.state==downloads.States.IN_PROGRESS},computeIsMalware_:function(){return this.isDangerous_&&(this.data.danger_type==downloads.DangerType.DANGEROUS_CONTENT||this.data.danger_type==downloads.DangerType.DANGEROUS_HOST||this.data.danger_type==downloads.DangerType.DANGEROUS_URL||this.data.danger_type==downloads.DangerType.POTENTIALLY_UNWANTED)},computePauseOrResumeText_:function(){if(this.isInProgress_)return loadTimeData.getString("controlPause");if(this.data.resume)return loadTimeData.getString("controlResume");return""},computeRemoveStyle_:function(){var canDelete=loadTimeData.getBoolean("allowDeletingHistory");var hideRemove=this.isDangerous_||this.showCancel_||!canDelete;return hideRemove?"visibility: hidden":""},computeShowCancel_:function(){return this.data.state==downloads.States.IN_PROGRESS||this.data.state==downloads.States.PAUSED},computeShowProgress_:function(){return this.showCancel_&&this.data.percent>=-1},computeTag_:function(){switch(this.data.state){case downloads.States.CANCELLED:return loadTimeData.getString("statusCancelled");case downloads.States.INTERRUPTED:return this.data.last_reason_text;case downloads.States.COMPLETE:return this.data.file_externally_removed?loadTimeData.getString("statusRemoved"):""}return""},isIndeterminate_:function(){return this.data.percent==-1},observeControlledBy_:function(){this.$["controlled-by"].innerHTML=this.controlledBy_},observeIsDangerous_:function(){if(!this.data)return;if(this.isDangerous_){this.$.url.removeAttribute("href")}else{this.$.url.href=assert(this.data.url);var filePath=encodeURIComponent(this.data.file_path);var scaleFactor="?scale="+window.devicePixelRatio+"x";this.$["file-icon"].src="chrome://fileicon/"+filePath+scaleFactor}},onCancelTap_:function(){downloads.ActionService.getInstance().cancel(this.data.id)},onDiscardDangerousTap_:function(){downloads.ActionService.getInstance().discardDangerous(this.data.id)},onDragStart_:function(e){e.preventDefault();downloads.ActionService.getInstance().drag(this.data.id)},onFileLinkTap_:function(e){e.preventDefault();downloads.ActionService.getInstance().openFile(this.data.id)},onPauseOrResumeTap_:function(){if(this.isInProgress_)downloads.ActionService.getInstance().pause(this.data.id);else downloads.ActionService.getInstance().resume(this.data.id)},onRemoveTap_:function(){downloads.ActionService.getInstance().remove(this.data.id)},onRetryTap_:function(){downloads.ActionService.getInstance().download(this.data.url)},onSaveDangerousTap_:function(){downloads.ActionService.getInstance().saveDangerous(this.data.id)},onShowTap_:function(){downloads.ActionService.getInstance().show(this.data.id)}});return{Item:Item}});Polymer.PaperItemBehaviorImpl={hostAttributes:{role:"option",tabindex:"0"}};Polymer.PaperItemBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperItemBehaviorImpl];Polymer({is:"paper-item",behaviors:[Polymer.PaperItemBehavior]});Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer.IronMultiSelectableBehaviorImpl={properties:{multi:{type:Boolean,value:false,observer:"multiChanged"},selectedValues:{type:Array,notify:true},selectedItems:{type:Array,readOnly:true,notify:true}},observers:["_updateSelected(selectedValues.splices)"],select:function(value){if(this.multi){if(this.selectedValues){this._toggleSelected(value)}else{this.selectedValues=[value]}}else{this.selected=value}},multiChanged:function(multi){this._selection.multi=multi},get _shouldUpdateSelection(){return this.selected!=null||this.selectedValues!=null&&this.selectedValues.length},_updateAttrForSelected:function(){if(!this.multi){Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this)}else if(this._shouldUpdateSelection){this.selectedValues=this.selectedItems.map(function(selectedItem){return this._indexToValue(this.indexOf(selectedItem))},this).filter(function(unfilteredValue){return unfilteredValue!=null},this)}},_updateSelected:function(){if(this.multi){this._selectMulti(this.selectedValues)}else{this._selectSelected(this.selected)}},_selectMulti:function(values){if(values){var selectedItems=this._valuesToItems(values);this._selection.clear(selectedItems);for(var i=0;i<selectedItems.length;i++){this._selection.setItemSelected(selectedItems[i],true)}if(this.fallbackSelection&&this.items.length&&!this._selection.get().length){var fallback=this._valueToItem(this.fallbackSelection);if(fallback){this.selectedValues=[this.fallbackSelection]}}}else{this._selection.clear()}},_selectionChange:function(){var s=this._selection.get();if(this.multi){this._setSelectedItems(s)}else{this._setSelectedItems([s]);this._setSelectedItem(s)}},_toggleSelected:function(value){var i=this.selectedValues.indexOf(value);var unselected=i<0;if(unselected){this.push("selectedValues",value)}else{this.splice("selectedValues",i,1)}},_valuesToItems:function(values){return values==null?null:values.map(function(value){return this._valueToItem(value)},this)}};Polymer.IronMultiSelectableBehavior=[Polymer.IronSelectableBehavior,Polymer.IronMultiSelectableBehaviorImpl];Polymer.IronMenuBehaviorImpl={properties:{focusedItem:{observer:"_focusedItemChanged",readOnly:true,type:Object},attrForItemTitle:{type:String}},hostAttributes:{role:"menu",tabindex:"0"},observers:["_updateMultiselectable(multi)"],listeners:{focus:"_onFocus",keydown:"_onKeydown","iron-items-changed":"_onIronItemsChanged"},keyBindings:{up:"_onUpKey",down:"_onDownKey",esc:"_onEscKey","shift+tab:keydown":"_onShiftTabDown"},attached:function(){this._resetTabindices()},select:function(value){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}var item=this._valueToItem(value);if(item&&item.hasAttribute("disabled"))return;this._setFocusedItem(item);Polymer.IronMultiSelectableBehaviorImpl.select.apply(this,arguments)},_resetTabindices:function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this.items.forEach(function(item){item.setAttribute("tabindex",item===selectedItem?"0":"-1")},this)},_updateMultiselectable:function(multi){if(multi){this.setAttribute("aria-multiselectable","true")}else{this.removeAttribute("aria-multiselectable")}},_focusWithKeyboardEvent:function(event){for(var i=0,item;item=this.items[i];i++){var attr=this.attrForItemTitle||"textContent";var title=item[attr]||item.getAttribute(attr);if(!item.hasAttribute("disabled")&&title&&title.trim().charAt(0).toLowerCase()===String.fromCharCode(event.keyCode).toLowerCase()){this._setFocusedItem(item);break}}},_focusPrevious:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex-i+length)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_focusNext:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex+i)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_applySelection:function(item,isSelected){if(isSelected){item.setAttribute("aria-selected","true")}else{item.removeAttribute("aria-selected")}Polymer.IronSelectableBehavior._applySelection.apply(this,arguments)},_focusedItemChanged:function(focusedItem,old){old&&old.setAttribute("tabindex","-1");if(focusedItem){focusedItem.setAttribute("tabindex","0");focusedItem.focus()}},_onIronItemsChanged:function(event){if(event.detail.addedNodes.length){this._resetTabindices()}},_onShiftTabDown:function(event){var oldTabIndex=this.getAttribute("tabindex");Polymer.IronMenuBehaviorImpl._shiftTabPressed=true;this._setFocusedItem(null);this.setAttribute("tabindex","-1");this.async(function(){this.setAttribute("tabindex",oldTabIndex);Polymer.IronMenuBehaviorImpl._shiftTabPressed=false},1)},_onFocus:function(event){if(Polymer.IronMenuBehaviorImpl._shiftTabPressed){return}var rootTarget=Polymer.dom(event).rootTarget;if(rootTarget!==this&&typeof rootTarget.tabIndex!=="undefined"&&!this.isLightDescendant(rootTarget)){return}this._defaultFocusAsync=this.async(function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this._setFocusedItem(null);if(selectedItem){this._setFocusedItem(selectedItem)}else if(this.items[0]){this._focusNext()}})},_onUpKey:function(event){this._focusPrevious();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this._focusNext();event.detail.keyboardEvent.preventDefault()},_onEscKey:function(event){this.focusedItem.blur()},_onKeydown:function(event){if(!this.keyboardEventMatchesKeys(event,"up down esc")){this._focusWithKeyboardEvent(event)}event.stopPropagation()},_activateHandler:function(event){Polymer.IronSelectableBehavior._activateHandler.call(this,event);event.stopPropagation()}};Polymer.IronMenuBehaviorImpl._shiftTabPressed=false;Polymer.IronMenuBehavior=[Polymer.IronMultiSelectableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronMenuBehaviorImpl];(function(){Polymer({is:"paper-menu",behaviors:[Polymer.IronMenuBehavior]})})();Polymer.IronFitBehavior={properties:{sizingTarget:{type:Object,value:function(){return this}},fitInto:{type:Object,value:window},noOverlap:{type:Boolean},positionTarget:{type:Element},horizontalAlign:{type:String},verticalAlign:{type:String},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},autoFitOnAttach:{type:Boolean,value:false},_fitInfo:{type:Object}},get _fitWidth(){var fitWidth;if(this.fitInto===window){fitWidth=this.fitInto.innerWidth}else{fitWidth=this.fitInto.getBoundingClientRect().width}return fitWidth},get _fitHeight(){var fitHeight;if(this.fitInto===window){fitHeight=this.fitInto.innerHeight}else{fitHeight=this.fitInto.getBoundingClientRect().height}return fitHeight},get _fitLeft(){var fitLeft;if(this.fitInto===window){fitLeft=0}else{fitLeft=this.fitInto.getBoundingClientRect().left}return fitLeft},get _fitTop(){var fitTop;if(this.fitInto===window){fitTop=0}else{fitTop=this.fitInto.getBoundingClientRect().top}return fitTop},get _defaultPositionTarget(){var parent=Polymer.dom(this).parentNode;if(parent&&parent.nodeType===Node.DOCUMENT_FRAGMENT_NODE){parent=parent.host}return parent},get _localeHorizontalAlign(){if(this._isRTL){if(this.horizontalAlign==="right"){return"left"}if(this.horizontalAlign==="left"){return"right"}}return this.horizontalAlign},attached:function(){this._isRTL=window.getComputedStyle(this).direction=="rtl";this.positionTarget=this.positionTarget||this._defaultPositionTarget;if(this.autoFitOnAttach){if(window.getComputedStyle(this).display==="none"){setTimeout(function(){this.fit()}.bind(this))}else{this.fit()}}},fit:function(){this.position();this.constrain();this.center()},_discoverInfo:function(){if(this._fitInfo){return}var target=window.getComputedStyle(this);var sizer=window.getComputedStyle(this.sizingTarget);this._fitInfo={inlineStyle:{top:this.style.top||"",left:this.style.left||"",position:this.style.position||""},sizerInlineStyle:{maxWidth:this.sizingTarget.style.maxWidth||"",maxHeight:this.sizingTarget.style.maxHeight||"",boxSizing:this.sizingTarget.style.boxSizing||""},positionedBy:{vertically:target.top!=="auto"?"top":target.bottom!=="auto"?"bottom":null,horizontally:target.left!=="auto"?"left":target.right!=="auto"?"right":null},sizedBy:{height:sizer.maxHeight!=="none",width:sizer.maxWidth!=="none",minWidth:parseInt(sizer.minWidth,10)||0,minHeight:parseInt(sizer.minHeight,10)||0},margin:{top:parseInt(target.marginTop,10)||0,right:parseInt(target.marginRight,10)||0,bottom:parseInt(target.marginBottom,10)||0,left:parseInt(target.marginLeft,10)||0}};if(this.verticalOffset){this._fitInfo.margin.top=this._fitInfo.margin.bottom=this.verticalOffset;this._fitInfo.inlineStyle.marginTop=this.style.marginTop||"";this._fitInfo.inlineStyle.marginBottom=this.style.marginBottom||"";this.style.marginTop=this.style.marginBottom=this.verticalOffset+"px"}if(this.horizontalOffset){this._fitInfo.margin.left=this._fitInfo.margin.right=this.horizontalOffset;this._fitInfo.inlineStyle.marginLeft=this.style.marginLeft||"";this._fitInfo.inlineStyle.marginRight=this.style.marginRight||"";this.style.marginLeft=this.style.marginRight=this.horizontalOffset+"px"}},resetFit:function(){var info=this._fitInfo||{};for(var property in info.sizerInlineStyle){this.sizingTarget.style[property]=info.sizerInlineStyle[property]}for(var property in info.inlineStyle){this.style[property]=info.inlineStyle[property]}this._fitInfo=null},refit:function(){var scrollLeft=this.sizingTarget.scrollLeft;var scrollTop=this.sizingTarget.scrollTop;this.resetFit();this.fit();this.sizingTarget.scrollLeft=scrollLeft;this.sizingTarget.scrollTop=scrollTop},position:function(){if(!this.horizontalAlign&&!this.verticalAlign){return}this._discoverInfo();this.style.position="fixed";this.sizingTarget.style.boxSizing="border-box";this.style.left="0px";this.style.top="0px";var rect=this.getBoundingClientRect();var positionRect=this.__getNormalizedRect(this.positionTarget);var fitRect=this.__getNormalizedRect(this.fitInto);var margin=this._fitInfo.margin;var size={width:rect.width+margin.left+margin.right,height:rect.height+margin.top+margin.bottom};var position=this.__getPosition(this._localeHorizontalAlign,this.verticalAlign,size,positionRect,fitRect);var left=position.left+margin.left;var top=position.top+margin.top;var right=Math.min(fitRect.right-margin.right,left+rect.width);var bottom=Math.min(fitRect.bottom-margin.bottom,top+rect.height);var minWidth=this._fitInfo.sizedBy.minWidth;var minHeight=this._fitInfo.sizedBy.minHeight;if(left<margin.left){left=margin.left;if(right-left<minWidth){left=right-minWidth}}if(top<margin.top){top=margin.top;if(bottom-top<minHeight){top=bottom-minHeight}}this.sizingTarget.style.maxWidth=right-left+"px";this.sizingTarget.style.maxHeight=bottom-top+"px";this.style.left=left-rect.left+"px";this.style.top=top-rect.top+"px"},constrain:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var info=this._fitInfo;if(!info.positionedBy.vertically){this.style.position="fixed";this.style.top="0px"}if(!info.positionedBy.horizontally){this.style.position="fixed";this.style.left="0px"}this.sizingTarget.style.boxSizing="border-box";var rect=this.getBoundingClientRect();if(!info.sizedBy.height){this.__sizeDimension(rect,info.positionedBy.vertically,"top","bottom","Height")}if(!info.sizedBy.width){this.__sizeDimension(rect,info.positionedBy.horizontally,"left","right","Width")}},_sizeDimension:function(rect,positionedBy,start,end,extent){this.__sizeDimension(rect,positionedBy,start,end,extent)},__sizeDimension:function(rect,positionedBy,start,end,extent){var info=this._fitInfo;var fitRect=this.__getNormalizedRect(this.fitInto);var max=extent==="Width"?fitRect.width:fitRect.height;var flip=positionedBy===end;var offset=flip?max-rect[end]:rect[start];var margin=info.margin[flip?start:end];var offsetExtent="offset"+extent;var sizingOffset=this[offsetExtent]-this.sizingTarget[offsetExtent];this.sizingTarget.style["max"+extent]=max-margin-offset-sizingOffset+"px"},center:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var positionedBy=this._fitInfo.positionedBy;if(positionedBy.vertically&&positionedBy.horizontally){return}this.style.position="fixed";if(!positionedBy.vertically){this.style.top="0px"}if(!positionedBy.horizontally){this.style.left="0px"}var rect=this.getBoundingClientRect();var fitRect=this.__getNormalizedRect(this.fitInto);if(!positionedBy.vertically){var top=fitRect.top-rect.top+(fitRect.height-rect.height)/2;this.style.top=top+"px"}if(!positionedBy.horizontally){var left=fitRect.left-rect.left+(fitRect.width-rect.width)/2;this.style.left=left+"px"}},__getNormalizedRect:function(target){if(target===document.documentElement||target===window){return{top:0,left:0,width:window.innerWidth,height:window.innerHeight,right:window.innerWidth,bottom:window.innerHeight}}return target.getBoundingClientRect()},__getCroppedArea:function(position,size,fitRect){var verticalCrop=Math.min(0,position.top)+Math.min(0,fitRect.bottom-(position.top+size.height));var horizontalCrop=Math.min(0,position.left)+Math.min(0,fitRect.right-(position.left+size.width));return Math.abs(verticalCrop)*size.width+Math.abs(horizontalCrop)*size.height},__getPosition:function(hAlign,vAlign,size,positionRect,fitRect){var positions=[{verticalAlign:"top",horizontalAlign:"left",top:positionRect.top,left:positionRect.left},{verticalAlign:"top",horizontalAlign:"right",top:positionRect.top,left:positionRect.right-size.width},{verticalAlign:"bottom",horizontalAlign:"left",top:positionRect.bottom-size.height,left:positionRect.left},{verticalAlign:"bottom",horizontalAlign:"right",top:positionRect.bottom-size.height,left:positionRect.right-size.width}];if(this.noOverlap){for(var i=0,l=positions.length;i<l;i++){var copy={};for(var key in positions[i]){copy[key]=positions[i][key]}positions.push(copy)}positions[0].top=positions[1].top+=positionRect.height;positions[2].top=positions[3].top-=positionRect.height;positions[4].left=positions[6].left+=positionRect.width;positions[5].left=positions[7].left-=positionRect.width}vAlign=vAlign==="auto"?null:vAlign;hAlign=hAlign==="auto"?null:hAlign;var position;for(var i=0;i<positions.length;i++){var pos=positions[i];if(!this.dynamicAlign&&!this.noOverlap&&pos.verticalAlign===vAlign&&pos.horizontalAlign===hAlign){position=pos;break}var alignOk=(!vAlign||pos.verticalAlign===vAlign)&&(!hAlign||pos.horizontalAlign===hAlign);if(!this.dynamicAlign&&!alignOk){continue}position=position||pos;pos.croppedArea=this.__getCroppedArea(pos,size,fitRect);var diff=pos.croppedArea-position.croppedArea;if(diff<0||diff===0&&alignOk){position=pos}if(position.croppedArea===0&&alignOk){break}}return position}};(function(){"use strict";Polymer({is:"iron-overlay-backdrop",properties:{opened:{reflectToAttribute:true,type:Boolean,value:false,observer:"_openedChanged"}},listeners:{transitionend:"_onTransitionend"},created:function(){this.__openedRaf=null},attached:function(){this.opened&&this._openedChanged(this.opened)},prepare:function(){if(this.opened&&!this.parentNode){Polymer.dom(document.body).appendChild(this)}},open:function(){this.opened=true},close:function(){this.opened=false},complete:function(){if(!this.opened&&this.parentNode===document.body){Polymer.dom(this.parentNode).removeChild(this)}},_onTransitionend:function(event){if(event&&event.target===this){this.complete()}},_openedChanged:function(opened){if(opened){this.prepare()}else{var cs=window.getComputedStyle(this);if(cs.transitionDuration==="0s"||cs.opacity==0){this.complete()}}if(!this.isAttached){return}if(this.__openedRaf){window.cancelAnimationFrame(this.__openedRaf);this.__openedRaf=null}this.scrollTop=this.scrollTop;this.__openedRaf=window.requestAnimationFrame(function(){this.__openedRaf=null;this.toggleClass("opened",this.opened)}.bind(this))}})})();Polymer.IronOverlayManagerClass=function(){this._overlays=[];this._minimumZ=101;this._backdropElement=null;Polymer.Gestures.add(document,"tap",this._onCaptureClick.bind(this));document.addEventListener("focus",this._onCaptureFocus.bind(this),true);document.addEventListener("keydown",this._onCaptureKeyDown.bind(this),true)};Polymer.IronOverlayManagerClass.prototype={constructor:Polymer.IronOverlayManagerClass,get backdropElement(){if(!this._backdropElement){this._backdropElement=document.createElement("iron-overlay-backdrop")}return this._backdropElement},get deepActiveElement(){var active=document.activeElement||document.body;while(active.root&&Polymer.dom(active.root).activeElement){active=Polymer.dom(active.root).activeElement}return active},_bringOverlayAtIndexToFront:function(i){var overlay=this._overlays[i];if(!overlay){return}var lastI=this._overlays.length-1;var currentOverlay=this._overlays[lastI];if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){lastI--}if(i>=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i<lastI){this._overlays[i]=this._overlays[i+1];i++}this._overlays[lastI]=overlay},addOrRemoveOverlay:function(overlay){if(overlay.opened){this.addOverlay(overlay)}else{this.removeOverlay(overlay)}},addOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i>=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){backdrops.push(this._overlays[i])}}return backdrops},backdropZ:function(){return this._getZ(this._overlayWithBackdrop())-1},_overlayWithBackdrop:function(){for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){return this._overlays[i]}}},_getZ:function(overlay){var z=this._minimumZ;if(overlay){var z1=Number(overlay.style.zIndex||window.getComputedStyle(overlay).zIndex);if(z1===z1){z=z1}}return z},_setZ:function(element,z){element.style.zIndex=z},_applyOverlayZ:function(overlay,aboveZ){this._setZ(overlay,aboveZ+2)},_overlayInPath:function(path){path=path||[];for(var i=0;i<path.length;i++){if(path[i]._manager===this){return path[i]}}},_onCaptureClick:function(event){var overlay=this.currentOverlay();if(overlay&&this._overlayInPath(Polymer.dom(event).path)!==overlay){overlay._onCaptureClick(event)}},_onCaptureFocus:function(event){var overlay=this.currentOverlay();if(overlay){overlay._onCaptureFocus(event)}},_onCaptureKeyDown:function(event){var overlay=this.currentOverlay();if(overlay){if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"esc")){overlay._onCaptureEsc(event)}else if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"tab")){overlay._onCaptureTab(event)}}},_shouldBeBehindOverlay:function(overlay1,overlay2){return!overlay1.alwaysOnTop&&overlay2.alwaysOnTop}};Polymer.IronOverlayManager=new Polymer.IronOverlayManagerClass;(function(){"use strict";Polymer.IronOverlayBehaviorImpl={properties:{opened:{observer:"_openedChanged",type:Boolean,value:false,notify:true},canceled:{observer:"_canceledChanged",readOnly:true,type:Boolean,value:false},withBackdrop:{observer:"_withBackdropChanged",type:Boolean},noAutoFocus:{type:Boolean,value:false},noCancelOnEscKey:{type:Boolean,value:false},noCancelOnOutsideClick:{type:Boolean,value:false},closingReason:{ -type:Object},restoreFocusOnClose:{type:Boolean,value:false},alwaysOnTop:{type:Boolean},_manager:{type:Object,value:Polymer.IronOverlayManager},_focusedChild:{type:Object}},listeners:{"iron-resize":"_onIronResize"},get backdropElement(){return this._manager.backdropElement},get _focusNode(){return this._focusedChild||Polymer.dom(this).querySelector("[autofocus]")||this},get _focusableNodes(){var FOCUSABLE_WITH_DISABLED=["a[href]","area[href]","iframe","[tabindex]","[contentEditable=true]"];var FOCUSABLE_WITHOUT_DISABLED=["input","select","textarea","button"];var selector=FOCUSABLE_WITH_DISABLED.join(':not([tabindex="-1"]),')+':not([tabindex="-1"]),'+FOCUSABLE_WITHOUT_DISABLED.join(':not([disabled]):not([tabindex="-1"]),')+':not([disabled]):not([tabindex="-1"])';var focusables=Polymer.dom(this).querySelectorAll(selector);if(this.tabIndex>=0){focusables.splice(0,0,this)}return focusables.sort(function(a,b){if(a.tabIndex===b.tabIndex){return 0}if(a.tabIndex===0||a.tabIndex>b.tabIndex){return 1}return-1})},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1];this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.notifyResize()}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i<activeEntries.length;i++){if(activeEntries[i].animation.playState!="finished"){finished=false;break}}return finished},_complete:function(activeEntries){for(var i=0;i<activeEntries.length;i++){activeEntries[i].neonAnimation.complete(activeEntries[i].config)}for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.cancel()}},playAnimation:function(type,cookie){var configs=this.getAnimationConfig(type);if(!configs){return}this._active=this._active||{};if(this._active[type]){this._complete(this._active[type]);delete this._active[type]}var activeEntries=this._configureAnimations(configs);if(activeEntries.length==0){this.fire("neon-animation-finish",cookie,{bubbles:false});return}this._active[type]=activeEntries;for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.onfinish=function(){if(this._shouldComplete(activeEntries)){this._complete(activeEntries);delete this._active[type];this.fire("neon-animation-finish",cookie,{bubbles:false})}}.bind(this)}},cancelAnimation:function(){for(var k in this._animations){this._animations[k].cancel()}this._animations={}}};Polymer.NeonAnimationRunnerBehavior=[Polymer.NeonAnimatableBehavior,Polymer.NeonAnimationRunnerBehaviorImpl];Polymer.NeonAnimationBehavior={properties:{animationTiming:{type:Object,value:function(){return{duration:500,easing:"cubic-bezier(0.4, 0, 0.2, 1)",fill:"both"}}}},isNeonAnimation:true,timingFromConfig:function(config){if(config.timing){for(var property in config.timing){this.animationTiming[property]=config.timing[property]}}return this.animationTiming},setPrefixedProperty:function(node,property,value){var map={transform:["webkitTransform"],transformOrigin:["mozTransformOrigin","webkitTransformOrigin"]};var prefixes=map[property];for(var prefix,index=0;prefix=prefixes[index];index++){node.style[prefix]=value}node.style[property]=value},complete:function(){}};Polymer({is:"opaque-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"1"}],this.timingFromConfig(config));node.style.opacity="0";return this._effect},complete:function(config){config.node.style.opacity=""}});(function(){"use strict";var LAST_TOUCH_POSITION={pageX:0,pageY:0};var ROOT_TARGET=null;var SCROLLABLE_NODES=[];Polymer.IronDropdownScrollManager={get currentLockingElement(){return this._lockingElements[this._lockingElements.length-1]},elementIsScrollLocked:function(element){var currentLockingElement=this.currentLockingElement;if(currentLockingElement===undefined)return false;var scrollLocked;if(this._hasCachedLockedElement(element)){return true}if(this._hasCachedUnlockedElement(element)){return false}scrollLocked=!!currentLockingElement&¤tLockingElement!==element&&!this._composedTreeContains(currentLockingElement,element);if(scrollLocked){this._lockedElementCache.push(element)}else{this._unlockedElementCache.push(element)}return scrollLocked},pushScrollLock:function(element){if(this._lockingElements.indexOf(element)>=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex<contentElements.length;++contentIndex){distributedNodes=Polymer.dom(contentElements[contentIndex]).getDistributedNodes();for(nodeIndex=0;nodeIndex<distributedNodes.length;++nodeIndex){if(this._composedTreeContains(distributedNodes[nodeIndex],child)){return true}}}return false},_scrollInteractionHandler:function(event){if(event.cancelable&&this._shouldPreventScrolling(event)){event.preventDefault()}if(event.targetTouches){var touch=event.targetTouches[0];LAST_TOUCH_POSITION.pageX=touch.pageX;LAST_TOUCH_POSITION.pageY=touch.pageY}},_lockScrollInteractions:function(){this._boundScrollHandler=this._boundScrollHandler||this._scrollInteractionHandler.bind(this);document.addEventListener("wheel",this._boundScrollHandler,true);document.addEventListener("mousewheel",this._boundScrollHandler,true);document.addEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.addEventListener("touchstart",this._boundScrollHandler,true);document.addEventListener("touchmove",this._boundScrollHandler,true)},_unlockScrollInteractions:function(){document.removeEventListener("wheel",this._boundScrollHandler,true);document.removeEventListener("mousewheel",this._boundScrollHandler,true);document.removeEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.removeEventListener("touchstart",this._boundScrollHandler,true);document.removeEventListener("touchmove",this._boundScrollHandler,true)},_shouldPreventScrolling:function(event){var target=Polymer.dom(event).rootTarget;if(event.type!=="touchmove"&&ROOT_TARGET!==target){ROOT_TARGET=target;SCROLLABLE_NODES=this._getScrollableNodes(Polymer.dom(event).path)}if(!SCROLLABLE_NODES.length){return true}if(event.type==="touchstart"){return false}var info=this._getScrollInfo(event);return!this._getScrollingNode(SCROLLABLE_NODES,info.deltaX,info.deltaY)},_getScrollableNodes:function(nodes){var scrollables=[];var lockingIndex=nodes.indexOf(this.currentLockingElement);for(var i=0;i<=lockingIndex;i++){var node=nodes[i];if(node.nodeType===11){continue}var style=node.style;if(style.overflow!=="scroll"&&style.overflow!=="auto"){style=window.getComputedStyle(node)}if(style.overflow==="scroll"||style.overflow==="auto"){scrollables.push(node)}}return scrollables},_getScrollingNode:function(nodes,deltaX,deltaY){if(!deltaX&&!deltaY){return}var verticalScroll=Math.abs(deltaY)>=Math.abs(deltaX);for(var i=0;i<nodes.length;i++){var node=nodes[i];var canScroll=false;if(verticalScroll){canScroll=deltaY<0?node.scrollTop>0:node.scrollTop<node.scrollHeight-node.clientHeight}else{canScroll=deltaX<0?node.scrollLeft>0:node.scrollLeft<node.scrollWidth-node.clientWidth}if(canScroll){return node}}},_getScrollInfo:function(event){var info={deltaX:event.deltaX,deltaY:event.deltaY};if("deltaX"in event){}else if("wheelDeltaX"in event){info.deltaX=-event.wheelDeltaX;info.deltaY=-event.wheelDeltaY}else if("axis"in event){info.deltaX=event.axis===1?event.detail:0;info.deltaY=event.axis===2?event.detail:0}else if(event.targetTouches){var touch=event.targetTouches[0];info.deltaX=LAST_TOUCH_POSITION.pageX-touch.pageX;info.deltaY=LAST_TOUCH_POSITION.pageY-touch.pageY}return info}}})();(function(){"use strict";Polymer({is:"iron-dropdown",behaviors:[Polymer.IronControlState,Polymer.IronA11yKeysBehavior,Polymer.IronOverlayBehavior,Polymer.NeonAnimationRunnerBehavior],properties:{horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},openAnimationConfig:{type:Object},closeAnimationConfig:{type:Object},focusTarget:{type:Object},noAnimations:{type:Boolean,value:false},allowOutsideScroll:{type:Boolean,value:false},_boundOnCaptureScroll:{type:Function,value:function(){return this._onCaptureScroll.bind(this)}}},listeners:{"neon-animation-finish":"_onNeonAnimationFinish"},observers:["_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)"],get containedElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},get _focusTarget(){return this.focusTarget||this.containedElement},ready:function(){this._scrollTop=0;this._scrollLeft=0;this._refitOnScrollRAF=null},attached:function(){if(!this.sizingTarget||this.sizingTarget===this){this.sizingTarget=this.containedElement}},detached:function(){this.cancelAnimation();document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)},_openedChanged:function(){if(this.opened&&this.disabled){this.cancel()}else{this.cancelAnimation();this._updateAnimationConfig();this._saveScrollPosition();if(this.opened){document.addEventListener("scroll",this._boundOnCaptureScroll);!this.allowOutsideScroll&&Polymer.IronDropdownScrollManager.pushScrollLock(this)}else{document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)}Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this,arguments)}},_renderOpened:function(){if(!this.noAnimations&&this.animationConfig.open){this.$.contentWrapper.classList.add("animating");this.playAnimation("open")}else{Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this,arguments)}},_renderClosed:function(){if(!this.noAnimations&&this.animationConfig.close){this.$.contentWrapper.classList.add("animating");this.playAnimation("close")}else{Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this,arguments)}},_onNeonAnimationFinish:function(){this.$.contentWrapper.classList.remove("animating");if(this.opened){this._finishRenderOpened()}else{this._finishRenderClosed()}},_onCaptureScroll:function(){if(!this.allowOutsideScroll){this._restoreScrollPosition()}else{this._refitOnScrollRAF&&window.cancelAnimationFrame(this._refitOnScrollRAF);this._refitOnScrollRAF=window.requestAnimationFrame(this.refit.bind(this))}},_saveScrollPosition:function(){if(document.scrollingElement){this._scrollTop=document.scrollingElement.scrollTop;this._scrollLeft=document.scrollingElement.scrollLeft}else{this._scrollTop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);this._scrollLeft=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft)}},_restoreScrollPosition:function(){if(document.scrollingElement){document.scrollingElement.scrollTop=this._scrollTop;document.scrollingElement.scrollLeft=this._scrollLeft}else{document.documentElement.scrollTop=this._scrollTop;document.documentElement.scrollLeft=this._scrollLeft;document.body.scrollTop=this._scrollTop;document.body.scrollLeft=this._scrollLeft}},_updateAnimationConfig:function(){var animations=(this.openAnimationConfig||[]).concat(this.closeAnimationConfig||[]);for(var i=0;i<animations.length;i++){animations[i].node=this.containedElement}this.animationConfig={open:this.openAnimationConfig,close:this.closeAnimationConfig}},_updateOverlayPosition:function(){if(this.isAttached){this.notifyResize()}},_applyFocus:function(){var focusTarget=this.focusTarget||this.containedElement;if(focusTarget&&this.opened&&!this.noAutoFocus){focusTarget.focus()}else{Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this,arguments)}}})})();Polymer({is:"fade-in-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"0"},{opacity:"1"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"fade-out-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"0"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-grow-height-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var height=rect.height;this._effect=new KeyframeEffect(node,[{height:height/2+"px"},{height:height+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-grow-width-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var width=rect.width;this._effect=new KeyframeEffect(node,[{width:width/2+"px"},{width:width+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-shrink-width-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var width=rect.width;this._effect=new KeyframeEffect(node,[{width:width+"px"},{width:width-width/20+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-shrink-height-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var height=rect.height;var top=rect.top;this.setPrefixedProperty(node,"transformOrigin","0 0");this._effect=new KeyframeEffect(node,[{height:height+"px",transform:"translateY(0)"},{height:height/2+"px",transform:"translateY(-20px)"}],this.timingFromConfig(config));return this._effect}});(function(){"use strict";var config={ANIMATION_CUBIC_BEZIER:"cubic-bezier(.3,.95,.5,1)",MAX_ANIMATION_TIME_MS:400};var PaperMenuButton=Polymer({is:"paper-menu-button",behaviors:[Polymer.IronA11yKeysBehavior,Polymer.IronControlState],properties:{opened:{type:Boolean,value:false,notify:true,observer:"_openedChanged"},horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},noOverlap:{type:Boolean},noAnimations:{type:Boolean,value:false},ignoreSelect:{type:Boolean,value:false},closeOnActivate:{type:Boolean,value:false},openAnimationConfig:{type:Object,value:function(){return[{name:"fade-in-animation",timing:{delay:100,duration:200}},{name:"paper-menu-grow-width-animation",timing:{delay:100,duration:150,easing:config.ANIMATION_CUBIC_BEZIER}},{name:"paper-menu-grow-height-animation",timing:{delay:100,duration:275,easing:config.ANIMATION_CUBIC_BEZIER}}]}},closeAnimationConfig:{type:Object,value:function(){return[{name:"fade-out-animation",timing:{duration:150}},{name:"paper-menu-shrink-width-animation",timing:{delay:100,duration:50,easing:config.ANIMATION_CUBIC_BEZIER}},{name:"paper-menu-shrink-height-animation",timing:{duration:200,easing:"ease-in"}}]}},allowOutsideScroll:{type:Boolean,value:false},restoreFocusOnClose:{type:Boolean,value:true},_dropdownContent:{type:Object}},hostAttributes:{role:"group","aria-haspopup":"true"},listeners:{"iron-activate":"_onIronActivate","iron-select":"_onIronSelect"},get contentElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},toggle:function(){if(this.opened){this.close()}else{this.open()}},open:function(){if(this.disabled){return}this.$.dropdown.open()},close:function(){this.$.dropdown.close()},_onIronSelect:function(event){if(!this.ignoreSelect){this.close()}},_onIronActivate:function(event){if(this.closeOnActivate){this.close()}},_openedChanged:function(opened,oldOpened){if(opened){this._dropdownContent=this.contentElement;this.fire("paper-dropdown-open")}else if(oldOpened!=null){this.fire("paper-dropdown-close")}},_disabledChanged:function(disabled){Polymer.IronControlState._disabledChanged.apply(this,arguments);if(disabled&&this.opened){this.close()}},__onIronOverlayCanceled:function(event){var uiEvent=event.detail;var target=Polymer.dom(uiEvent).rootTarget;var trigger=this.$.trigger;var path=Polymer.dom(uiEvent).path;if(path.indexOf(trigger)>-1){event.preventDefault()}}});Object.keys(config).forEach(function(key){PaperMenuButton[key]=config[key]});Polymer.PaperMenuButton=PaperMenuButton})();Polymer.PaperInkyFocusBehaviorImpl={observers:["_focusedChanged(receivedFocusFromKeyboard)"],_focusedChanged:function(receivedFocusFromKeyboard){if(receivedFocusFromKeyboard){this.ensureRipple()}if(this.hasRipple()){this._ripple.holdDown=receivedFocusFromKeyboard}},_createRipple:function(){var ripple=Polymer.PaperRippleBehavior._createRipple();ripple.id="ink";ripple.setAttribute("center","");ripple.classList.add("circle");return ripple}};Polymer.PaperInkyFocusBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperRippleBehavior,Polymer.PaperInkyFocusBehaviorImpl];Polymer({is:"paper-icon-button",hostAttributes:{role:"button",tabindex:"0"},behaviors:[Polymer.PaperInkyFocusBehavior],properties:{src:{type:String},icon:{type:String},alt:{type:String,observer:"_altChanged"}},_altChanged:function(newValue,oldValue){var label=this.getAttribute("aria-label");if(!label||oldValue==label){this.setAttribute("aria-label",newValue)}}});Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});Polymer.PaperSpinnerBehavior={listeners:{animationend:"__reset",webkitAnimationEnd:"__reset"},properties:{active:{type:Boolean,value:false,reflectToAttribute:true,observer:"__activeChanged"},alt:{type:String,value:"loading",observer:"__altChanged"},__coolingDown:{type:Boolean,value:false}},__computeContainerClasses:function(active,coolingDown){return[active||coolingDown?"active":"",coolingDown?"cooldown":""].join(" ")},__activeChanged:function(active,old){this.__setAriaHidden(!active);this.__coolingDown=!active&&old},__altChanged:function(alt){if(alt===this.getPropertyInfo("alt").value){this.alt=this.getAttribute("aria-label")||alt}else{this.__setAriaHidden(alt==="");this.setAttribute("aria-label",alt)}},__setAriaHidden:function(hidden){var attr="aria-hidden";if(hidden){this.setAttribute(attr,"true")}else{this.removeAttribute(attr)}},__reset:function(){this.active=false;this.__coolingDown=false}};Polymer({is:"paper-spinner-lite",behaviors:[Polymer.PaperSpinnerBehavior]}); +cr.define("downloads",function(){var Item=Polymer({is:"downloads-item",properties:{data:{type:Object},completelyOnDisk_:{computed:"computeCompletelyOnDisk_("+"data.state, data.file_externally_removed)",type:Boolean,value:true},controlledBy_:{computed:"computeControlledBy_(data.by_ext_id, data.by_ext_name)",type:String,value:""},isActive_:{computed:"computeIsActive_("+"data.state, data.file_externally_removed)",type:Boolean,value:true},isDangerous_:{computed:"computeIsDangerous_(data.state)",type:Boolean,value:false},isMalware_:{computed:"computeIsMalware_(isDangerous_, data.danger_type)",type:Boolean,value:false},isInProgress_:{computed:"computeIsInProgress_(data.state)",type:Boolean,value:false},pauseOrResumeText_:{computed:"computePauseOrResumeText_(isInProgress_, data.resume)",type:String},showCancel_:{computed:"computeShowCancel_(data.state)",type:Boolean,value:false},showProgress_:{computed:"computeShowProgress_(showCancel_, data.percent)",type:Boolean,value:false}},observers:["observeControlledBy_(controlledBy_)","observeIsDangerous_(isDangerous_, data)"],ready:function(){this.content=this.$.content},chopUrl_:function(url){return url.slice(0,300)},computeClass_:function(){var classes=[];if(this.isActive_)classes.push("is-active");if(this.isDangerous_)classes.push("dangerous");if(this.showProgress_)classes.push("show-progress");return classes.join(" ")},computeCompletelyOnDisk_:function(){return this.data.state==downloads.States.COMPLETE&&!this.data.file_externally_removed},computeControlledBy_:function(){if(!this.data.by_ext_id||!this.data.by_ext_name)return"";var url="chrome://extensions#"+this.data.by_ext_id;var name=this.data.by_ext_name;return loadTimeData.getStringF("controlledByUrl",url,HTMLEscape(name))},computeDangerIcon_:function(){return this.isDangerous_?"cr:warning":""},computeDate_:function(){assert(typeof this.data.hideDate=="boolean");if(this.data.hideDate)return"";return assert(this.data.since_string||this.data.date_string)},computeDescription_:function(){var data=this.data;switch(data.state){case downloads.States.DANGEROUS:var fileName=data.file_name;switch(data.danger_type){case downloads.DangerType.DANGEROUS_FILE:return loadTimeData.getString("dangerFileDesc");case downloads.DangerType.DANGEROUS_URL:case downloads.DangerType.DANGEROUS_CONTENT:case downloads.DangerType.DANGEROUS_HOST:return loadTimeData.getString("dangerDownloadDesc");case downloads.DangerType.UNCOMMON_CONTENT:return loadTimeData.getString("dangerUncommonDesc");case downloads.DangerType.POTENTIALLY_UNWANTED:return loadTimeData.getString("dangerSettingsDesc")}break;case downloads.States.IN_PROGRESS:case downloads.States.PAUSED:return data.progress_status_text}return""},computeIsActive_:function(){return this.data.state!=downloads.States.CANCELLED&&this.data.state!=downloads.States.INTERRUPTED&&!this.data.file_externally_removed},computeIsDangerous_:function(){return this.data.state==downloads.States.DANGEROUS},computeIsInProgress_:function(){return this.data.state==downloads.States.IN_PROGRESS},computeIsMalware_:function(){return this.isDangerous_&&(this.data.danger_type==downloads.DangerType.DANGEROUS_CONTENT||this.data.danger_type==downloads.DangerType.DANGEROUS_HOST||this.data.danger_type==downloads.DangerType.DANGEROUS_URL||this.data.danger_type==downloads.DangerType.POTENTIALLY_UNWANTED)},computePauseOrResumeText_:function(){if(this.isInProgress_)return loadTimeData.getString("controlPause");if(this.data.resume)return loadTimeData.getString("controlResume");return""},computeRemoveStyle_:function(){var canDelete=loadTimeData.getBoolean("allowDeletingHistory");var hideRemove=this.isDangerous_||this.showCancel_||!canDelete;return hideRemove?"visibility: hidden":""},computeShowCancel_:function(){return this.data.state==downloads.States.IN_PROGRESS||this.data.state==downloads.States.PAUSED},computeShowProgress_:function(){return this.showCancel_&&this.data.percent>=-1},computeTag_:function(){switch(this.data.state){case downloads.States.CANCELLED:return loadTimeData.getString("statusCancelled");case downloads.States.INTERRUPTED:return this.data.last_reason_text;case downloads.States.COMPLETE:return this.data.file_externally_removed?loadTimeData.getString("statusRemoved"):""}return""},isIndeterminate_:function(){return this.data.percent==-1},observeControlledBy_:function(){this.$["controlled-by"].innerHTML=this.controlledBy_},observeIsDangerous_:function(){if(!this.data)return;if(this.isDangerous_){this.$.url.removeAttribute("href")}else{this.$.url.href=assert(this.data.url);var filePath=encodeURIComponent(this.data.file_path);var scaleFactor="?scale="+window.devicePixelRatio+"x";this.$["file-icon"].src="chrome://fileicon/"+filePath+scaleFactor}},onCancelTap_:function(){downloads.ActionService.getInstance().cancel(this.data.id)},onDiscardDangerousTap_:function(){downloads.ActionService.getInstance().discardDangerous(this.data.id)},onDragStart_:function(e){e.preventDefault();downloads.ActionService.getInstance().drag(this.data.id)},onFileLinkTap_:function(e){e.preventDefault();downloads.ActionService.getInstance().openFile(this.data.id)},onPauseOrResumeTap_:function(){if(this.isInProgress_)downloads.ActionService.getInstance().pause(this.data.id);else downloads.ActionService.getInstance().resume(this.data.id)},onRemoveTap_:function(){downloads.ActionService.getInstance().remove(this.data.id)},onRetryTap_:function(){downloads.ActionService.getInstance().download(this.data.url)},onSaveDangerousTap_:function(){downloads.ActionService.getInstance().saveDangerous(this.data.id)},onShowTap_:function(){downloads.ActionService.getInstance().show(this.data.id)}});return{Item:Item}});Polymer.PaperItemBehaviorImpl={hostAttributes:{role:"option",tabindex:"0"}};Polymer.PaperItemBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperItemBehaviorImpl];Polymer({is:"paper-item",behaviors:[Polymer.PaperItemBehavior]});Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer.IronMultiSelectableBehaviorImpl={properties:{multi:{type:Boolean,value:false,observer:"multiChanged"},selectedValues:{type:Array,notify:true},selectedItems:{type:Array,readOnly:true,notify:true}},observers:["_updateSelected(selectedValues.splices)"],select:function(value){if(this.multi){if(this.selectedValues){this._toggleSelected(value)}else{this.selectedValues=[value]}}else{this.selected=value}},multiChanged:function(multi){this._selection.multi=multi},get _shouldUpdateSelection(){return this.selected!=null||this.selectedValues!=null&&this.selectedValues.length},_updateAttrForSelected:function(){if(!this.multi){Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this)}else if(this._shouldUpdateSelection){this.selectedValues=this.selectedItems.map(function(selectedItem){return this._indexToValue(this.indexOf(selectedItem))},this).filter(function(unfilteredValue){return unfilteredValue!=null},this)}},_updateSelected:function(){if(this.multi){this._selectMulti(this.selectedValues)}else{this._selectSelected(this.selected)}},_selectMulti:function(values){if(values){var selectedItems=this._valuesToItems(values);this._selection.clear(selectedItems);for(var i=0;i<selectedItems.length;i++){this._selection.setItemSelected(selectedItems[i],true)}if(this.fallbackSelection&&this.items.length&&!this._selection.get().length){var fallback=this._valueToItem(this.fallbackSelection);if(fallback){this.selectedValues=[this.fallbackSelection]}}}else{this._selection.clear()}},_selectionChange:function(){var s=this._selection.get();if(this.multi){this._setSelectedItems(s)}else{this._setSelectedItems([s]);this._setSelectedItem(s)}},_toggleSelected:function(value){var i=this.selectedValues.indexOf(value);var unselected=i<0;if(unselected){this.push("selectedValues",value)}else{this.splice("selectedValues",i,1)}},_valuesToItems:function(values){return values==null?null:values.map(function(value){return this._valueToItem(value)},this)}};Polymer.IronMultiSelectableBehavior=[Polymer.IronSelectableBehavior,Polymer.IronMultiSelectableBehaviorImpl];Polymer.IronMenuBehaviorImpl={properties:{focusedItem:{observer:"_focusedItemChanged",readOnly:true,type:Object},attrForItemTitle:{type:String}},hostAttributes:{role:"menu",tabindex:"0"},observers:["_updateMultiselectable(multi)"],listeners:{focus:"_onFocus",keydown:"_onKeydown","iron-items-changed":"_onIronItemsChanged"},keyBindings:{up:"_onUpKey",down:"_onDownKey",esc:"_onEscKey","shift+tab:keydown":"_onShiftTabDown"},attached:function(){this._resetTabindices()},select:function(value){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}var item=this._valueToItem(value);if(item&&item.hasAttribute("disabled"))return;this._setFocusedItem(item);Polymer.IronMultiSelectableBehaviorImpl.select.apply(this,arguments)},_resetTabindices:function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this.items.forEach(function(item){item.setAttribute("tabindex",item===selectedItem?"0":"-1")},this)},_updateMultiselectable:function(multi){if(multi){this.setAttribute("aria-multiselectable","true")}else{this.removeAttribute("aria-multiselectable")}},_focusWithKeyboardEvent:function(event){for(var i=0,item;item=this.items[i];i++){var attr=this.attrForItemTitle||"textContent";var title=item[attr]||item.getAttribute(attr);if(!item.hasAttribute("disabled")&&title&&title.trim().charAt(0).toLowerCase()===String.fromCharCode(event.keyCode).toLowerCase()){this._setFocusedItem(item);break}}},_focusPrevious:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex-i+length)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_focusNext:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex+i)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_applySelection:function(item,isSelected){if(isSelected){item.setAttribute("aria-selected","true")}else{item.removeAttribute("aria-selected")}Polymer.IronSelectableBehavior._applySelection.apply(this,arguments)},_focusedItemChanged:function(focusedItem,old){old&&old.setAttribute("tabindex","-1");if(focusedItem){focusedItem.setAttribute("tabindex","0");focusedItem.focus()}},_onIronItemsChanged:function(event){if(event.detail.addedNodes.length){this._resetTabindices()}},_onShiftTabDown:function(event){var oldTabIndex=this.getAttribute("tabindex");Polymer.IronMenuBehaviorImpl._shiftTabPressed=true;this._setFocusedItem(null);this.setAttribute("tabindex","-1");this.async(function(){this.setAttribute("tabindex",oldTabIndex);Polymer.IronMenuBehaviorImpl._shiftTabPressed=false},1)},_onFocus:function(event){if(Polymer.IronMenuBehaviorImpl._shiftTabPressed){return}var rootTarget=Polymer.dom(event).rootTarget;if(rootTarget!==this&&typeof rootTarget.tabIndex!=="undefined"&&!this.isLightDescendant(rootTarget)){return}this._defaultFocusAsync=this.async(function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this._setFocusedItem(null);if(selectedItem){this._setFocusedItem(selectedItem)}else if(this.items[0]){this._focusNext()}})},_onUpKey:function(event){this._focusPrevious();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this._focusNext();event.detail.keyboardEvent.preventDefault()},_onEscKey:function(event){this.focusedItem.blur()},_onKeydown:function(event){if(!this.keyboardEventMatchesKeys(event,"up down esc")){this._focusWithKeyboardEvent(event)}event.stopPropagation()},_activateHandler:function(event){Polymer.IronSelectableBehavior._activateHandler.call(this,event);event.stopPropagation()}};Polymer.IronMenuBehaviorImpl._shiftTabPressed=false;Polymer.IronMenuBehavior=[Polymer.IronMultiSelectableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronMenuBehaviorImpl];(function(){Polymer({is:"paper-menu",behaviors:[Polymer.IronMenuBehavior]})})();Polymer.IronFitBehavior={properties:{sizingTarget:{type:Object,value:function(){return this}},fitInto:{type:Object,value:window},noOverlap:{type:Boolean},positionTarget:{type:Element},horizontalAlign:{type:String},verticalAlign:{type:String},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},autoFitOnAttach:{type:Boolean,value:false},_fitInfo:{type:Object}},get _fitWidth(){var fitWidth;if(this.fitInto===window){fitWidth=this.fitInto.innerWidth}else{fitWidth=this.fitInto.getBoundingClientRect().width}return fitWidth},get _fitHeight(){var fitHeight;if(this.fitInto===window){fitHeight=this.fitInto.innerHeight}else{fitHeight=this.fitInto.getBoundingClientRect().height}return fitHeight},get _fitLeft(){var fitLeft;if(this.fitInto===window){fitLeft=0}else{fitLeft=this.fitInto.getBoundingClientRect().left}return fitLeft},get _fitTop(){var fitTop;if(this.fitInto===window){fitTop=0}else{fitTop=this.fitInto.getBoundingClientRect().top}return fitTop},get _defaultPositionTarget(){var parent=Polymer.dom(this).parentNode;if(parent&&parent.nodeType===Node.DOCUMENT_FRAGMENT_NODE){parent=parent.host}return parent},get _localeHorizontalAlign(){if(this._isRTL){if(this.horizontalAlign==="right"){return"left"}if(this.horizontalAlign==="left"){return"right"}}return this.horizontalAlign},attached:function(){this._isRTL=window.getComputedStyle(this).direction=="rtl";this.positionTarget=this.positionTarget||this._defaultPositionTarget;if(this.autoFitOnAttach){if(window.getComputedStyle(this).display==="none"){setTimeout(function(){this.fit()}.bind(this))}else{this.fit()}}},fit:function(){this.position();this.constrain();this.center()},_discoverInfo:function(){if(this._fitInfo){return}var target=window.getComputedStyle(this);var sizer=window.getComputedStyle(this.sizingTarget);this._fitInfo={inlineStyle:{top:this.style.top||"",left:this.style.left||"",position:this.style.position||""},sizerInlineStyle:{maxWidth:this.sizingTarget.style.maxWidth||"",maxHeight:this.sizingTarget.style.maxHeight||"",boxSizing:this.sizingTarget.style.boxSizing||""},positionedBy:{vertically:target.top!=="auto"?"top":target.bottom!=="auto"?"bottom":null,horizontally:target.left!=="auto"?"left":target.right!=="auto"?"right":null},sizedBy:{height:sizer.maxHeight!=="none",width:sizer.maxWidth!=="none",minWidth:parseInt(sizer.minWidth,10)||0,minHeight:parseInt(sizer.minHeight,10)||0},margin:{top:parseInt(target.marginTop,10)||0,right:parseInt(target.marginRight,10)||0,bottom:parseInt(target.marginBottom,10)||0,left:parseInt(target.marginLeft,10)||0}};if(this.verticalOffset){this._fitInfo.margin.top=this._fitInfo.margin.bottom=this.verticalOffset;this._fitInfo.inlineStyle.marginTop=this.style.marginTop||"";this._fitInfo.inlineStyle.marginBottom=this.style.marginBottom||"";this.style.marginTop=this.style.marginBottom=this.verticalOffset+"px"}if(this.horizontalOffset){this._fitInfo.margin.left=this._fitInfo.margin.right=this.horizontalOffset;this._fitInfo.inlineStyle.marginLeft=this.style.marginLeft||"";this._fitInfo.inlineStyle.marginRight=this.style.marginRight||"";this.style.marginLeft=this.style.marginRight=this.horizontalOffset+"px"}},resetFit:function(){var info=this._fitInfo||{};for(var property in info.sizerInlineStyle){this.sizingTarget.style[property]=info.sizerInlineStyle[property]}for(var property in info.inlineStyle){this.style[property]=info.inlineStyle[property]}this._fitInfo=null},refit:function(){var scrollLeft=this.sizingTarget.scrollLeft;var scrollTop=this.sizingTarget.scrollTop;this.resetFit();this.fit();this.sizingTarget.scrollLeft=scrollLeft;this.sizingTarget.scrollTop=scrollTop},position:function(){if(!this.horizontalAlign&&!this.verticalAlign){return}this._discoverInfo();this.style.position="fixed";this.sizingTarget.style.boxSizing="border-box";this.style.left="0px";this.style.top="0px";var rect=this.getBoundingClientRect();var positionRect=this.__getNormalizedRect(this.positionTarget);var fitRect=this.__getNormalizedRect(this.fitInto);var margin=this._fitInfo.margin;var size={width:rect.width+margin.left+margin.right,height:rect.height+margin.top+margin.bottom};var position=this.__getPosition(this._localeHorizontalAlign,this.verticalAlign,size,positionRect,fitRect);var left=position.left+margin.left;var top=position.top+margin.top;var right=Math.min(fitRect.right-margin.right,left+rect.width);var bottom=Math.min(fitRect.bottom-margin.bottom,top+rect.height);var minWidth=this._fitInfo.sizedBy.minWidth;var minHeight=this._fitInfo.sizedBy.minHeight;if(left<margin.left){left=margin.left;if(right-left<minWidth){left=right-minWidth}}if(top<margin.top){top=margin.top;if(bottom-top<minHeight){top=bottom-minHeight}}this.sizingTarget.style.maxWidth=right-left+"px";this.sizingTarget.style.maxHeight=bottom-top+"px";this.style.left=left-rect.left+"px";this.style.top=top-rect.top+"px"},constrain:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var info=this._fitInfo;if(!info.positionedBy.vertically){this.style.position="fixed";this.style.top="0px"}if(!info.positionedBy.horizontally){this.style.position="fixed";this.style.left="0px"}this.sizingTarget.style.boxSizing="border-box";var rect=this.getBoundingClientRect();if(!info.sizedBy.height){this.__sizeDimension(rect,info.positionedBy.vertically,"top","bottom","Height")}if(!info.sizedBy.width){this.__sizeDimension(rect,info.positionedBy.horizontally,"left","right","Width")}},_sizeDimension:function(rect,positionedBy,start,end,extent){this.__sizeDimension(rect,positionedBy,start,end,extent)},__sizeDimension:function(rect,positionedBy,start,end,extent){var info=this._fitInfo;var fitRect=this.__getNormalizedRect(this.fitInto);var max=extent==="Width"?fitRect.width:fitRect.height;var flip=positionedBy===end;var offset=flip?max-rect[end]:rect[start];var margin=info.margin[flip?start:end];var offsetExtent="offset"+extent;var sizingOffset=this[offsetExtent]-this.sizingTarget[offsetExtent];this.sizingTarget.style["max"+extent]=max-margin-offset-sizingOffset+"px"},center:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var positionedBy=this._fitInfo.positionedBy;if(positionedBy.vertically&&positionedBy.horizontally){return}this.style.position="fixed";if(!positionedBy.vertically){this.style.top="0px"}if(!positionedBy.horizontally){this.style.left="0px"}var rect=this.getBoundingClientRect();var fitRect=this.__getNormalizedRect(this.fitInto);if(!positionedBy.vertically){var top=fitRect.top-rect.top+(fitRect.height-rect.height)/2;this.style.top=top+"px"}if(!positionedBy.horizontally){var left=fitRect.left-rect.left+(fitRect.width-rect.width)/2;this.style.left=left+"px"}},__getNormalizedRect:function(target){if(target===document.documentElement||target===window){return{top:0,left:0,width:window.innerWidth,height:window.innerHeight,right:window.innerWidth,bottom:window.innerHeight}}return target.getBoundingClientRect()},__getCroppedArea:function(position,size,fitRect){var verticalCrop=Math.min(0,position.top)+Math.min(0,fitRect.bottom-(position.top+size.height));var horizontalCrop=Math.min(0,position.left)+Math.min(0,fitRect.right-(position.left+size.width));return Math.abs(verticalCrop)*size.width+Math.abs(horizontalCrop)*size.height},__getPosition:function(hAlign,vAlign,size,positionRect,fitRect){var positions=[{verticalAlign:"top",horizontalAlign:"left",top:positionRect.top,left:positionRect.left},{verticalAlign:"top",horizontalAlign:"right",top:positionRect.top,left:positionRect.right-size.width},{verticalAlign:"bottom",horizontalAlign:"left",top:positionRect.bottom-size.height,left:positionRect.left},{verticalAlign:"bottom",horizontalAlign:"right",top:positionRect.bottom-size.height,left:positionRect.right-size.width}];if(this.noOverlap){for(var i=0,l=positions.length;i<l;i++){var copy={};for(var key in positions[i]){copy[key]=positions[i][key]}positions.push(copy)}positions[0].top=positions[1].top+=positionRect.height;positions[2].top=positions[3].top-=positionRect.height;positions[4].left=positions[6].left+=positionRect.width;positions[5].left=positions[7].left-=positionRect.width}vAlign=vAlign==="auto"?null:vAlign;hAlign=hAlign==="auto"?null:hAlign;var position;for(var i=0;i<positions.length;i++){var pos=positions[i];if(!this.dynamicAlign&&!this.noOverlap&&pos.verticalAlign===vAlign&&pos.horizontalAlign===hAlign){position=pos;break}var alignOk=(!vAlign||pos.verticalAlign===vAlign)&&(!hAlign||pos.horizontalAlign===hAlign);if(!this.dynamicAlign&&!alignOk){continue}position=position||pos;pos.croppedArea=this.__getCroppedArea(pos,size,fitRect);var diff=pos.croppedArea-position.croppedArea;if(diff<0||diff===0&&alignOk){position=pos}if(position.croppedArea===0&&alignOk){break}}return position}};(function(){"use strict";Polymer({is:"iron-overlay-backdrop",properties:{opened:{reflectToAttribute:true,type:Boolean,value:false,observer:"_openedChanged"}},listeners:{transitionend:"_onTransitionend"},created:function(){this.__openedRaf=null},attached:function(){this.opened&&this._openedChanged(this.opened)},prepare:function(){if(this.opened&&!this.parentNode){Polymer.dom(document.body).appendChild(this)}},open:function(){this.opened=true},close:function(){this.opened=false},complete:function(){if(!this.opened&&this.parentNode===document.body){Polymer.dom(this.parentNode).removeChild(this)}},_onTransitionend:function(event){if(event&&event.target===this){this.complete()}},_openedChanged:function(opened){if(opened){this.prepare()}else{var cs=window.getComputedStyle(this);if(cs.transitionDuration==="0s"||cs.opacity==0){this.complete()}}if(!this.isAttached){return}if(this.__openedRaf){window.cancelAnimationFrame(this.__openedRaf);this.__openedRaf=null}this.scrollTop=this.scrollTop;this.__openedRaf=window.requestAnimationFrame(function(){this.__openedRaf=null;this.toggleClass("opened",this.opened)}.bind(this))}})})();Polymer.IronOverlayManagerClass=function(){this._overlays=[];this._minimumZ=101;this._backdropElement=null;Polymer.Gestures.add(document,"tap",this._onCaptureClick.bind(this));document.addEventListener("focus",this._onCaptureFocus.bind(this),true);document.addEventListener("keydown",this._onCaptureKeyDown.bind(this),true)};Polymer.IronOverlayManagerClass.prototype={constructor:Polymer.IronOverlayManagerClass,get backdropElement(){if(!this._backdropElement){this._backdropElement=document.createElement("iron-overlay-backdrop")}return this._backdropElement},get deepActiveElement(){var active=document.activeElement||document.body;while(active.root&&Polymer.dom(active.root).activeElement){active=Polymer.dom(active.root).activeElement}return active},_bringOverlayAtIndexToFront:function(i){var overlay=this._overlays[i];if(!overlay){return}var lastI=this._overlays.length-1;var currentOverlay=this._overlays[lastI];if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){lastI--}if(i>=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i<lastI){this._overlays[i]=this._overlays[i+1];i++}this._overlays[lastI]=overlay},addOrRemoveOverlay:function(overlay){if(overlay.opened){this.addOverlay(overlay)}else{this.removeOverlay(overlay)}},addOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i>=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){backdrops.push(this._overlays[i])}}return backdrops},backdropZ:function(){return this._getZ(this._overlayWithBackdrop())-1},_overlayWithBackdrop:function(){for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){return this._overlays[i]}}},_getZ:function(overlay){var z=this._minimumZ;if(overlay){var z1=Number(overlay.style.zIndex||window.getComputedStyle(overlay).zIndex);if(z1===z1){z=z1}}return z},_setZ:function(element,z){element.style.zIndex=z},_applyOverlayZ:function(overlay,aboveZ){this._setZ(overlay,aboveZ+2)},_overlayInPath:function(path){path=path||[];for(var i=0;i<path.length;i++){if(path[i]._manager===this){return path[i]}}},_onCaptureClick:function(event){var overlay=this.currentOverlay();if(overlay&&this._overlayInPath(Polymer.dom(event).path)!==overlay){overlay._onCaptureClick(event)}},_onCaptureFocus:function(event){var overlay=this.currentOverlay();if(overlay){overlay._onCaptureFocus(event)}},_onCaptureKeyDown:function(event){var overlay=this.currentOverlay();if(overlay){if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"esc")){overlay._onCaptureEsc(event)}else if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"tab")){overlay._onCaptureTab(event)}}},_shouldBeBehindOverlay:function(overlay1,overlay2){return!overlay1.alwaysOnTop&&overlay2.alwaysOnTop}};Polymer.IronOverlayManager=new Polymer.IronOverlayManagerClass;(function(){"use strict";var p=Element.prototype;var matches=p.matches||p.matchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector||p.webkitMatchesSelector;Polymer.IronFocusablesHelper={getTabbableNodes:function(node){var result=[];var needsSortByTabIndex=this._collectTabbableNodes(node,result);if(needsSortByTabIndex){return this._sortByTabIndex(result)}return result},isFocusable:function(element){if(matches.call(element,"input, select, textarea, button, object")){ +return matches.call(element,":not([disabled])")}return matches.call(element,"a[href], area[href], iframe, [tabindex], [contentEditable]")},isTabbable:function(element){return this.isFocusable(element)&&matches.call(element,':not([tabindex="-1"])')&&this._isVisible(element)},_normalizedTabIndex:function(element){if(this.isFocusable(element)){var tabIndex=element.getAttribute("tabindex")||0;return Number(tabIndex)}return-1},_collectTabbableNodes:function(node,result){if(node.nodeType!==Node.ELEMENT_NODE||!this._isVisible(node)){return false}var element=node;var tabIndex=this._normalizedTabIndex(element);var needsSortByTabIndex=tabIndex>0;if(tabIndex>=0){result.push(element)}var children;if(element.localName==="content"){children=Polymer.dom(element).getDistributedNodes()}else{children=Polymer.dom(element.root||element).children}for(var i=0;i<children.length;i++){var needsSort=this._collectTabbableNodes(children[i],result);needsSortByTabIndex=needsSortByTabIndex||needsSort}return needsSortByTabIndex},_isVisible:function(element){var style=element.style;if(style.visibility!=="hidden"&&style.display!=="none"){style=window.getComputedStyle(element);return style.visibility!=="hidden"&&style.display!=="none"}return false},_sortByTabIndex:function(tabbables){var len=tabbables.length;if(len<2){return tabbables}var pivot=Math.ceil(len/2);var left=this._sortByTabIndex(tabbables.slice(0,pivot));var right=this._sortByTabIndex(tabbables.slice(pivot));return this._mergeSortByTabIndex(left,right)},_mergeSortByTabIndex:function(left,right){var result=[];while(left.length>0&&right.length>0){if(this._hasLowerTabOrder(left[0],right[0])){result.push(right.shift())}else{result.push(left.shift())}}return result.concat(left,right)},_hasLowerTabOrder:function(a,b){var ati=Math.max(a.tabIndex,0);var bti=Math.max(b.tabIndex,0);return ati===0||bti===0?bti>ati:ati>bti}}})();(function(){"use strict";Polymer.IronOverlayBehaviorImpl={properties:{opened:{observer:"_openedChanged",type:Boolean,value:false,notify:true},canceled:{observer:"_canceledChanged",readOnly:true,type:Boolean,value:false},withBackdrop:{observer:"_withBackdropChanged",type:Boolean},noAutoFocus:{type:Boolean,value:false},noCancelOnEscKey:{type:Boolean,value:false},noCancelOnOutsideClick:{type:Boolean,value:false},closingReason:{type:Object},restoreFocusOnClose:{type:Boolean,value:false},alwaysOnTop:{type:Boolean},_manager:{type:Object,value:Polymer.IronOverlayManager},_focusedChild:{type:Object}},listeners:{"iron-resize":"_onIronResize"},get backdropElement(){return this._manager.backdropElement},get _focusNode(){return this._focusedChild||Polymer.dom(this).querySelector("[autofocus]")||this},get _focusableNodes(){return Polymer.IronFocusablesHelper.getTabbableNodes(this)},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},invalidateTabbables:function(){this.__firstFocusableNode=this.__lastFocusableNode=null},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}this.__ensureFirstLastFocusables();var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.invalidateTabbables();this.notifyResize()}},__ensureFirstLastFocusables:function(){if(!this.__firstFocusableNode||!this.__lastFocusableNode){var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1]}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i<activeEntries.length;i++){if(activeEntries[i].animation.playState!="finished"){finished=false;break}}return finished},_complete:function(activeEntries){for(var i=0;i<activeEntries.length;i++){activeEntries[i].neonAnimation.complete(activeEntries[i].config)}for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.cancel()}},playAnimation:function(type,cookie){var configs=this.getAnimationConfig(type);if(!configs){return}this._active=this._active||{};if(this._active[type]){this._complete(this._active[type]);delete this._active[type]}var activeEntries=this._configureAnimations(configs);if(activeEntries.length==0){this.fire("neon-animation-finish",cookie,{bubbles:false});return}this._active[type]=activeEntries;for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.onfinish=function(){if(this._shouldComplete(activeEntries)){this._complete(activeEntries);delete this._active[type];this.fire("neon-animation-finish",cookie,{bubbles:false})}}.bind(this)}},cancelAnimation:function(){for(var k in this._animations){this._animations[k].cancel()}this._animations={}}};Polymer.NeonAnimationRunnerBehavior=[Polymer.NeonAnimatableBehavior,Polymer.NeonAnimationRunnerBehaviorImpl];Polymer.NeonAnimationBehavior={properties:{animationTiming:{type:Object,value:function(){return{duration:500,easing:"cubic-bezier(0.4, 0, 0.2, 1)",fill:"both"}}}},isNeonAnimation:true,timingFromConfig:function(config){if(config.timing){for(var property in config.timing){this.animationTiming[property]=config.timing[property]}}return this.animationTiming},setPrefixedProperty:function(node,property,value){var map={transform:["webkitTransform"],transformOrigin:["mozTransformOrigin","webkitTransformOrigin"]};var prefixes=map[property];for(var prefix,index=0;prefix=prefixes[index];index++){node.style[prefix]=value}node.style[property]=value},complete:function(){}};Polymer({is:"opaque-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"1"}],this.timingFromConfig(config));node.style.opacity="0";return this._effect},complete:function(config){config.node.style.opacity=""}});(function(){"use strict";var LAST_TOUCH_POSITION={pageX:0,pageY:0};var ROOT_TARGET=null;var SCROLLABLE_NODES=[];Polymer.IronDropdownScrollManager={get currentLockingElement(){return this._lockingElements[this._lockingElements.length-1]},elementIsScrollLocked:function(element){var currentLockingElement=this.currentLockingElement;if(currentLockingElement===undefined)return false;var scrollLocked;if(this._hasCachedLockedElement(element)){return true}if(this._hasCachedUnlockedElement(element)){return false}scrollLocked=!!currentLockingElement&¤tLockingElement!==element&&!this._composedTreeContains(currentLockingElement,element);if(scrollLocked){this._lockedElementCache.push(element)}else{this._unlockedElementCache.push(element)}return scrollLocked},pushScrollLock:function(element){if(this._lockingElements.indexOf(element)>=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex<contentElements.length;++contentIndex){distributedNodes=Polymer.dom(contentElements[contentIndex]).getDistributedNodes();for(nodeIndex=0;nodeIndex<distributedNodes.length;++nodeIndex){if(this._composedTreeContains(distributedNodes[nodeIndex],child)){return true}}}return false},_scrollInteractionHandler:function(event){if(event.cancelable&&this._shouldPreventScrolling(event)){event.preventDefault()}if(event.targetTouches){var touch=event.targetTouches[0];LAST_TOUCH_POSITION.pageX=touch.pageX;LAST_TOUCH_POSITION.pageY=touch.pageY}},_lockScrollInteractions:function(){this._boundScrollHandler=this._boundScrollHandler||this._scrollInteractionHandler.bind(this);document.addEventListener("wheel",this._boundScrollHandler,true);document.addEventListener("mousewheel",this._boundScrollHandler,true);document.addEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.addEventListener("touchstart",this._boundScrollHandler,true);document.addEventListener("touchmove",this._boundScrollHandler,true)},_unlockScrollInteractions:function(){document.removeEventListener("wheel",this._boundScrollHandler,true);document.removeEventListener("mousewheel",this._boundScrollHandler,true);document.removeEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.removeEventListener("touchstart",this._boundScrollHandler,true);document.removeEventListener("touchmove",this._boundScrollHandler,true)},_shouldPreventScrolling:function(event){var target=Polymer.dom(event).rootTarget;if(event.type!=="touchmove"&&ROOT_TARGET!==target){ROOT_TARGET=target;SCROLLABLE_NODES=this._getScrollableNodes(Polymer.dom(event).path)}if(!SCROLLABLE_NODES.length){return true}if(event.type==="touchstart"){return false}var info=this._getScrollInfo(event);return!this._getScrollingNode(SCROLLABLE_NODES,info.deltaX,info.deltaY)},_getScrollableNodes:function(nodes){var scrollables=[];var lockingIndex=nodes.indexOf(this.currentLockingElement);for(var i=0;i<=lockingIndex;i++){var node=nodes[i];if(node.nodeType===11){continue}var style=node.style;if(style.overflow!=="scroll"&&style.overflow!=="auto"){style=window.getComputedStyle(node)}if(style.overflow==="scroll"||style.overflow==="auto"){scrollables.push(node)}}return scrollables},_getScrollingNode:function(nodes,deltaX,deltaY){if(!deltaX&&!deltaY){return}var verticalScroll=Math.abs(deltaY)>=Math.abs(deltaX);for(var i=0;i<nodes.length;i++){var node=nodes[i];var canScroll=false;if(verticalScroll){canScroll=deltaY<0?node.scrollTop>0:node.scrollTop<node.scrollHeight-node.clientHeight}else{canScroll=deltaX<0?node.scrollLeft>0:node.scrollLeft<node.scrollWidth-node.clientWidth}if(canScroll){return node}}},_getScrollInfo:function(event){var info={deltaX:event.deltaX,deltaY:event.deltaY};if("deltaX"in event){}else if("wheelDeltaX"in event){info.deltaX=-event.wheelDeltaX;info.deltaY=-event.wheelDeltaY}else if("axis"in event){info.deltaX=event.axis===1?event.detail:0;info.deltaY=event.axis===2?event.detail:0}else if(event.targetTouches){var touch=event.targetTouches[0];info.deltaX=LAST_TOUCH_POSITION.pageX-touch.pageX;info.deltaY=LAST_TOUCH_POSITION.pageY-touch.pageY}return info}}})();(function(){"use strict";Polymer({is:"iron-dropdown",behaviors:[Polymer.IronControlState,Polymer.IronA11yKeysBehavior,Polymer.IronOverlayBehavior,Polymer.NeonAnimationRunnerBehavior],properties:{horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},openAnimationConfig:{type:Object},closeAnimationConfig:{type:Object},focusTarget:{type:Object},noAnimations:{type:Boolean,value:false},allowOutsideScroll:{type:Boolean,value:false},_boundOnCaptureScroll:{type:Function,value:function(){return this._onCaptureScroll.bind(this)}}},listeners:{"neon-animation-finish":"_onNeonAnimationFinish"},observers:["_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)"],get containedElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},get _focusTarget(){return this.focusTarget||this.containedElement},ready:function(){this._scrollTop=0;this._scrollLeft=0;this._refitOnScrollRAF=null},attached:function(){if(!this.sizingTarget||this.sizingTarget===this){this.sizingTarget=this.containedElement}},detached:function(){this.cancelAnimation();document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)},_openedChanged:function(){if(this.opened&&this.disabled){this.cancel()}else{this.cancelAnimation();this._updateAnimationConfig();this._saveScrollPosition();if(this.opened){document.addEventListener("scroll",this._boundOnCaptureScroll);!this.allowOutsideScroll&&Polymer.IronDropdownScrollManager.pushScrollLock(this)}else{document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)}Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this,arguments)}},_renderOpened:function(){if(!this.noAnimations&&this.animationConfig.open){this.$.contentWrapper.classList.add("animating");this.playAnimation("open")}else{Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this,arguments)}},_renderClosed:function(){if(!this.noAnimations&&this.animationConfig.close){this.$.contentWrapper.classList.add("animating");this.playAnimation("close")}else{Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this,arguments)}},_onNeonAnimationFinish:function(){this.$.contentWrapper.classList.remove("animating");if(this.opened){this._finishRenderOpened()}else{this._finishRenderClosed()}},_onCaptureScroll:function(){if(!this.allowOutsideScroll){this._restoreScrollPosition()}else{this._refitOnScrollRAF&&window.cancelAnimationFrame(this._refitOnScrollRAF);this._refitOnScrollRAF=window.requestAnimationFrame(this.refit.bind(this))}},_saveScrollPosition:function(){if(document.scrollingElement){this._scrollTop=document.scrollingElement.scrollTop;this._scrollLeft=document.scrollingElement.scrollLeft}else{this._scrollTop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);this._scrollLeft=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft)}},_restoreScrollPosition:function(){if(document.scrollingElement){document.scrollingElement.scrollTop=this._scrollTop;document.scrollingElement.scrollLeft=this._scrollLeft}else{document.documentElement.scrollTop=this._scrollTop;document.documentElement.scrollLeft=this._scrollLeft;document.body.scrollTop=this._scrollTop;document.body.scrollLeft=this._scrollLeft}},_updateAnimationConfig:function(){var animations=(this.openAnimationConfig||[]).concat(this.closeAnimationConfig||[]);for(var i=0;i<animations.length;i++){animations[i].node=this.containedElement}this.animationConfig={open:this.openAnimationConfig,close:this.closeAnimationConfig}},_updateOverlayPosition:function(){if(this.isAttached){this.notifyResize()}},_applyFocus:function(){var focusTarget=this.focusTarget||this.containedElement;if(focusTarget&&this.opened&&!this.noAutoFocus){focusTarget.focus()}else{Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this,arguments)}}})})();Polymer({is:"fade-in-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"0"},{opacity:"1"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"fade-out-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"0"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-grow-height-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var height=rect.height;this._effect=new KeyframeEffect(node,[{height:height/2+"px"},{height:height+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-grow-width-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var width=rect.width;this._effect=new KeyframeEffect(node,[{width:width/2+"px"},{width:width+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-shrink-width-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var width=rect.width;this._effect=new KeyframeEffect(node,[{width:width+"px"},{width:width-width/20+"px"}],this.timingFromConfig(config));return this._effect}});Polymer({is:"paper-menu-shrink-height-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;var rect=node.getBoundingClientRect();var height=rect.height;var top=rect.top;this.setPrefixedProperty(node,"transformOrigin","0 0");this._effect=new KeyframeEffect(node,[{height:height+"px",transform:"translateY(0)"},{height:height/2+"px",transform:"translateY(-20px)"}],this.timingFromConfig(config));return this._effect}});(function(){"use strict";var config={ANIMATION_CUBIC_BEZIER:"cubic-bezier(.3,.95,.5,1)",MAX_ANIMATION_TIME_MS:400};var PaperMenuButton=Polymer({is:"paper-menu-button",behaviors:[Polymer.IronA11yKeysBehavior,Polymer.IronControlState],properties:{opened:{type:Boolean,value:false,notify:true,observer:"_openedChanged"},horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},noOverlap:{type:Boolean},noAnimations:{type:Boolean,value:false},ignoreSelect:{type:Boolean,value:false},closeOnActivate:{type:Boolean,value:false},openAnimationConfig:{type:Object,value:function(){return[{name:"fade-in-animation",timing:{delay:100,duration:200}},{name:"paper-menu-grow-width-animation",timing:{delay:100,duration:150,easing:config.ANIMATION_CUBIC_BEZIER}},{name:"paper-menu-grow-height-animation",timing:{delay:100,duration:275,easing:config.ANIMATION_CUBIC_BEZIER}}]}},closeAnimationConfig:{type:Object,value:function(){return[{name:"fade-out-animation",timing:{duration:150}},{name:"paper-menu-shrink-width-animation",timing:{delay:100,duration:50,easing:config.ANIMATION_CUBIC_BEZIER}},{name:"paper-menu-shrink-height-animation",timing:{duration:200,easing:"ease-in"}}]}},allowOutsideScroll:{type:Boolean,value:false},restoreFocusOnClose:{type:Boolean,value:true},_dropdownContent:{type:Object}},hostAttributes:{role:"group","aria-haspopup":"true"},listeners:{"iron-activate":"_onIronActivate","iron-select":"_onIronSelect"},get contentElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},toggle:function(){if(this.opened){this.close()}else{this.open()}},open:function(){if(this.disabled){return}this.$.dropdown.open()},close:function(){this.$.dropdown.close()},_onIronSelect:function(event){if(!this.ignoreSelect){this.close()}},_onIronActivate:function(event){if(this.closeOnActivate){this.close()}},_openedChanged:function(opened,oldOpened){if(opened){this._dropdownContent=this.contentElement;this.fire("paper-dropdown-open")}else if(oldOpened!=null){this.fire("paper-dropdown-close")}},_disabledChanged:function(disabled){Polymer.IronControlState._disabledChanged.apply(this,arguments);if(disabled&&this.opened){this.close()}},__onIronOverlayCanceled:function(event){var uiEvent=event.detail;var target=Polymer.dom(uiEvent).rootTarget;var trigger=this.$.trigger;var path=Polymer.dom(uiEvent).path;if(path.indexOf(trigger)>-1){event.preventDefault()}}});Object.keys(config).forEach(function(key){PaperMenuButton[key]=config[key]});Polymer.PaperMenuButton=PaperMenuButton})();Polymer.PaperInkyFocusBehaviorImpl={observers:["_focusedChanged(receivedFocusFromKeyboard)"],_focusedChanged:function(receivedFocusFromKeyboard){if(receivedFocusFromKeyboard){this.ensureRipple()}if(this.hasRipple()){this._ripple.holdDown=receivedFocusFromKeyboard}},_createRipple:function(){var ripple=Polymer.PaperRippleBehavior._createRipple();ripple.id="ink";ripple.setAttribute("center","");ripple.classList.add("circle");return ripple}};Polymer.PaperInkyFocusBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperRippleBehavior,Polymer.PaperInkyFocusBehaviorImpl];Polymer({is:"paper-icon-button",hostAttributes:{role:"button",tabindex:"0"},behaviors:[Polymer.PaperInkyFocusBehavior],properties:{src:{type:String},icon:{type:String},alt:{type:String,observer:"_altChanged"}},_altChanged:function(newValue,oldValue){var label=this.getAttribute("aria-label");if(!label||oldValue==label){this.setAttribute("aria-label",newValue)}}});Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});Polymer.PaperSpinnerBehavior={listeners:{animationend:"__reset",webkitAnimationEnd:"__reset"},properties:{active:{type:Boolean,value:false,reflectToAttribute:true,observer:"__activeChanged"},alt:{type:String,value:"loading",observer:"__altChanged"},__coolingDown:{type:Boolean,value:false}},__computeContainerClasses:function(active,coolingDown){return[active||coolingDown?"active":"",coolingDown?"cooldown":""].join(" ")},__activeChanged:function(active,old){this.__setAriaHidden(!active);this.__coolingDown=!active&&old},__altChanged:function(alt){if(alt===this.getPropertyInfo("alt").value){this.alt=this.getAttribute("aria-label")||alt}else{this.__setAriaHidden(alt==="");this.setAttribute("aria-label",alt)}},__setAriaHidden:function(hidden){var attr="aria-hidden";if(hidden){this.setAttribute(attr,"true")}else{this.removeAttribute(attr)}},__reset:function(){this.active=false;this.__coolingDown=false}};Polymer({is:"paper-spinner-lite",behaviors:[Polymer.PaperSpinnerBehavior]}); // Copyright 2016 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.
diff --git a/chrome/browser/resources/md_downloads/vulcanized.html b/chrome/browser/resources/md_downloads/vulcanized.html index 252b5b26..32d4182 100644 --- a/chrome/browser/resources/md_downloads/vulcanized.html +++ b/chrome/browser/resources/md_downloads/vulcanized.html
@@ -503,7 +503,6 @@ paper-ripple { opacity: 0.6; color: currentColor; - ; } </style> @@ -2903,6 +2902,7 @@ <defs> <g id="add"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path></g> + <g id="arrow-drop-up"><path d="M7 14l5-5 5 5z"></path></g> <g id="arrow-drop-down"><path d="M7 10l5 5 5-5z"></path></g> <g id="cancel"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"></path></g> <if expr="chromeos"> @@ -2917,6 +2917,7 @@ <g id="expand-more"><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"></path></g> <g id="extension"><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"></path></g> <g id="file-download"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path></g> + <g id="folder"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path></g> <g id="fullscreen"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></g> <g id="group"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"></path></g> <g id="menu"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path></g>
diff --git a/chrome/browser/resources/md_history/lazy_load.crisper.js b/chrome/browser/resources/md_history/lazy_load.crisper.js index 6e3aa91..7df8a39 100644 --- a/chrome/browser/resources/md_history/lazy_load.crisper.js +++ b/chrome/browser/resources/md_history/lazy_load.crisper.js
@@ -26,5 +26,6 @@ // Copyright 2016 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. -Polymer({is:"cr-drawer","extends":"dialog",properties:{open:{type:Boolean,notify:true},align:{type:String,value:"left",reflectToAttribute:true}},listeners:{cancel:"onDialogCancel_",tap:"onDialogTap_",transitionend:"onDialogTransitionEnd_"},toggle:function(){if(this.open)this.closeDrawer();else this.openDrawer()},openDrawer:function(){if(!this.open){this.showModal();this.classList.add("opening")}},closeDrawer:function(){if(this.open){this.classList.remove("opening");this.classList.add("closing")}},onContainerTap_:function(event){event.stopPropagation()},onDialogTap_:function(){this.closeDrawer()},onDialogCancel_:function(event){event.preventDefault();this.closeDrawer()},onDialogTransitionEnd_:function(){if(this.classList.contains("closing")){this.classList.remove("closing");this.close()}}});Polymer.IronFitBehavior={properties:{sizingTarget:{type:Object,value:function(){return this}},fitInto:{type:Object,value:window},noOverlap:{type:Boolean},positionTarget:{type:Element},horizontalAlign:{type:String},verticalAlign:{type:String},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},autoFitOnAttach:{type:Boolean,value:false},_fitInfo:{type:Object}},get _fitWidth(){var fitWidth;if(this.fitInto===window){fitWidth=this.fitInto.innerWidth}else{fitWidth=this.fitInto.getBoundingClientRect().width}return fitWidth},get _fitHeight(){var fitHeight;if(this.fitInto===window){fitHeight=this.fitInto.innerHeight}else{fitHeight=this.fitInto.getBoundingClientRect().height}return fitHeight},get _fitLeft(){var fitLeft;if(this.fitInto===window){fitLeft=0}else{fitLeft=this.fitInto.getBoundingClientRect().left}return fitLeft},get _fitTop(){var fitTop;if(this.fitInto===window){fitTop=0}else{fitTop=this.fitInto.getBoundingClientRect().top}return fitTop},get _defaultPositionTarget(){var parent=Polymer.dom(this).parentNode;if(parent&&parent.nodeType===Node.DOCUMENT_FRAGMENT_NODE){parent=parent.host}return parent},get _localeHorizontalAlign(){if(this._isRTL){if(this.horizontalAlign==="right"){return"left"}if(this.horizontalAlign==="left"){return"right"}}return this.horizontalAlign},attached:function(){this._isRTL=window.getComputedStyle(this).direction=="rtl";this.positionTarget=this.positionTarget||this._defaultPositionTarget;if(this.autoFitOnAttach){if(window.getComputedStyle(this).display==="none"){setTimeout(function(){this.fit()}.bind(this))}else{this.fit()}}},fit:function(){this.position();this.constrain();this.center()},_discoverInfo:function(){if(this._fitInfo){return}var target=window.getComputedStyle(this);var sizer=window.getComputedStyle(this.sizingTarget);this._fitInfo={inlineStyle:{top:this.style.top||"",left:this.style.left||"",position:this.style.position||""},sizerInlineStyle:{maxWidth:this.sizingTarget.style.maxWidth||"",maxHeight:this.sizingTarget.style.maxHeight||"",boxSizing:this.sizingTarget.style.boxSizing||""},positionedBy:{vertically:target.top!=="auto"?"top":target.bottom!=="auto"?"bottom":null,horizontally:target.left!=="auto"?"left":target.right!=="auto"?"right":null},sizedBy:{height:sizer.maxHeight!=="none",width:sizer.maxWidth!=="none",minWidth:parseInt(sizer.minWidth,10)||0,minHeight:parseInt(sizer.minHeight,10)||0},margin:{top:parseInt(target.marginTop,10)||0,right:parseInt(target.marginRight,10)||0,bottom:parseInt(target.marginBottom,10)||0,left:parseInt(target.marginLeft,10)||0}};if(this.verticalOffset){this._fitInfo.margin.top=this._fitInfo.margin.bottom=this.verticalOffset;this._fitInfo.inlineStyle.marginTop=this.style.marginTop||"";this._fitInfo.inlineStyle.marginBottom=this.style.marginBottom||"";this.style.marginTop=this.style.marginBottom=this.verticalOffset+"px"}if(this.horizontalOffset){this._fitInfo.margin.left=this._fitInfo.margin.right=this.horizontalOffset;this._fitInfo.inlineStyle.marginLeft=this.style.marginLeft||"";this._fitInfo.inlineStyle.marginRight=this.style.marginRight||"";this.style.marginLeft=this.style.marginRight=this.horizontalOffset+"px"}},resetFit:function(){var info=this._fitInfo||{};for(var property in info.sizerInlineStyle){this.sizingTarget.style[property]=info.sizerInlineStyle[property]}for(var property in info.inlineStyle){this.style[property]=info.inlineStyle[property]}this._fitInfo=null},refit:function(){var scrollLeft=this.sizingTarget.scrollLeft;var scrollTop=this.sizingTarget.scrollTop;this.resetFit();this.fit();this.sizingTarget.scrollLeft=scrollLeft;this.sizingTarget.scrollTop=scrollTop},position:function(){if(!this.horizontalAlign&&!this.verticalAlign){return}this._discoverInfo();this.style.position="fixed";this.sizingTarget.style.boxSizing="border-box";this.style.left="0px";this.style.top="0px";var rect=this.getBoundingClientRect();var positionRect=this.__getNormalizedRect(this.positionTarget);var fitRect=this.__getNormalizedRect(this.fitInto);var margin=this._fitInfo.margin;var size={width:rect.width+margin.left+margin.right,height:rect.height+margin.top+margin.bottom};var position=this.__getPosition(this._localeHorizontalAlign,this.verticalAlign,size,positionRect,fitRect);var left=position.left+margin.left;var top=position.top+margin.top;var right=Math.min(fitRect.right-margin.right,left+rect.width);var bottom=Math.min(fitRect.bottom-margin.bottom,top+rect.height);var minWidth=this._fitInfo.sizedBy.minWidth;var minHeight=this._fitInfo.sizedBy.minHeight;if(left<margin.left){left=margin.left;if(right-left<minWidth){left=right-minWidth}}if(top<margin.top){top=margin.top;if(bottom-top<minHeight){top=bottom-minHeight}}this.sizingTarget.style.maxWidth=right-left+"px";this.sizingTarget.style.maxHeight=bottom-top+"px";this.style.left=left-rect.left+"px";this.style.top=top-rect.top+"px"},constrain:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var info=this._fitInfo;if(!info.positionedBy.vertically){this.style.position="fixed";this.style.top="0px"}if(!info.positionedBy.horizontally){this.style.position="fixed";this.style.left="0px"}this.sizingTarget.style.boxSizing="border-box";var rect=this.getBoundingClientRect();if(!info.sizedBy.height){this.__sizeDimension(rect,info.positionedBy.vertically,"top","bottom","Height")}if(!info.sizedBy.width){this.__sizeDimension(rect,info.positionedBy.horizontally,"left","right","Width")}},_sizeDimension:function(rect,positionedBy,start,end,extent){this.__sizeDimension(rect,positionedBy,start,end,extent)},__sizeDimension:function(rect,positionedBy,start,end,extent){var info=this._fitInfo;var fitRect=this.__getNormalizedRect(this.fitInto);var max=extent==="Width"?fitRect.width:fitRect.height;var flip=positionedBy===end;var offset=flip?max-rect[end]:rect[start];var margin=info.margin[flip?start:end];var offsetExtent="offset"+extent;var sizingOffset=this[offsetExtent]-this.sizingTarget[offsetExtent];this.sizingTarget.style["max"+extent]=max-margin-offset-sizingOffset+"px"},center:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var positionedBy=this._fitInfo.positionedBy;if(positionedBy.vertically&&positionedBy.horizontally){return}this.style.position="fixed";if(!positionedBy.vertically){this.style.top="0px"}if(!positionedBy.horizontally){this.style.left="0px"}var rect=this.getBoundingClientRect();var fitRect=this.__getNormalizedRect(this.fitInto);if(!positionedBy.vertically){var top=fitRect.top-rect.top+(fitRect.height-rect.height)/2;this.style.top=top+"px"}if(!positionedBy.horizontally){var left=fitRect.left-rect.left+(fitRect.width-rect.width)/2;this.style.left=left+"px"}},__getNormalizedRect:function(target){if(target===document.documentElement||target===window){return{top:0,left:0,width:window.innerWidth,height:window.innerHeight,right:window.innerWidth,bottom:window.innerHeight}}return target.getBoundingClientRect()},__getCroppedArea:function(position,size,fitRect){var verticalCrop=Math.min(0,position.top)+Math.min(0,fitRect.bottom-(position.top+size.height));var horizontalCrop=Math.min(0,position.left)+Math.min(0,fitRect.right-(position.left+size.width));return Math.abs(verticalCrop)*size.width+Math.abs(horizontalCrop)*size.height},__getPosition:function(hAlign,vAlign,size,positionRect,fitRect){var positions=[{verticalAlign:"top",horizontalAlign:"left",top:positionRect.top,left:positionRect.left},{verticalAlign:"top",horizontalAlign:"right",top:positionRect.top,left:positionRect.right-size.width},{verticalAlign:"bottom",horizontalAlign:"left",top:positionRect.bottom-size.height,left:positionRect.left},{verticalAlign:"bottom",horizontalAlign:"right",top:positionRect.bottom-size.height,left:positionRect.right-size.width}];if(this.noOverlap){for(var i=0,l=positions.length;i<l;i++){var copy={};for(var key in positions[i]){copy[key]=positions[i][key]}positions.push(copy)}positions[0].top=positions[1].top+=positionRect.height;positions[2].top=positions[3].top-=positionRect.height;positions[4].left=positions[6].left+=positionRect.width;positions[5].left=positions[7].left-=positionRect.width}vAlign=vAlign==="auto"?null:vAlign;hAlign=hAlign==="auto"?null:hAlign;var position;for(var i=0;i<positions.length;i++){var pos=positions[i];if(!this.dynamicAlign&&!this.noOverlap&&pos.verticalAlign===vAlign&&pos.horizontalAlign===hAlign){position=pos;break}var alignOk=(!vAlign||pos.verticalAlign===vAlign)&&(!hAlign||pos.horizontalAlign===hAlign);if(!this.dynamicAlign&&!alignOk){continue}position=position||pos;pos.croppedArea=this.__getCroppedArea(pos,size,fitRect);var diff=pos.croppedArea-position.croppedArea;if(diff<0||diff===0&&alignOk){position=pos}if(position.croppedArea===0&&alignOk){break}}return position}};(function(){"use strict";Polymer({is:"iron-overlay-backdrop",properties:{opened:{reflectToAttribute:true,type:Boolean,value:false,observer:"_openedChanged"}},listeners:{transitionend:"_onTransitionend"},created:function(){this.__openedRaf=null},attached:function(){this.opened&&this._openedChanged(this.opened)},prepare:function(){if(this.opened&&!this.parentNode){Polymer.dom(document.body).appendChild(this)}},open:function(){this.opened=true},close:function(){this.opened=false},complete:function(){if(!this.opened&&this.parentNode===document.body){Polymer.dom(this.parentNode).removeChild(this)}},_onTransitionend:function(event){if(event&&event.target===this){this.complete()}},_openedChanged:function(opened){if(opened){this.prepare()}else{var cs=window.getComputedStyle(this);if(cs.transitionDuration==="0s"||cs.opacity==0){this.complete()}}if(!this.isAttached){return}if(this.__openedRaf){window.cancelAnimationFrame(this.__openedRaf);this.__openedRaf=null}this.scrollTop=this.scrollTop;this.__openedRaf=window.requestAnimationFrame(function(){this.__openedRaf=null;this.toggleClass("opened",this.opened)}.bind(this))}})})();Polymer.IronOverlayManagerClass=function(){this._overlays=[];this._minimumZ=101;this._backdropElement=null;Polymer.Gestures.add(document,"tap",this._onCaptureClick.bind(this));document.addEventListener("focus",this._onCaptureFocus.bind(this),true);document.addEventListener("keydown",this._onCaptureKeyDown.bind(this),true)};Polymer.IronOverlayManagerClass.prototype={constructor:Polymer.IronOverlayManagerClass,get backdropElement(){if(!this._backdropElement){this._backdropElement=document.createElement("iron-overlay-backdrop")}return this._backdropElement},get deepActiveElement(){var active=document.activeElement||document.body;while(active.root&&Polymer.dom(active.root).activeElement){active=Polymer.dom(active.root).activeElement}return active},_bringOverlayAtIndexToFront:function(i){var overlay=this._overlays[i];if(!overlay){return}var lastI=this._overlays.length-1;var currentOverlay=this._overlays[lastI];if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){lastI--}if(i>=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i<lastI){this._overlays[i]=this._overlays[i+1];i++}this._overlays[lastI]=overlay},addOrRemoveOverlay:function(overlay){if(overlay.opened){this.addOverlay(overlay)}else{this.removeOverlay(overlay)}},addOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i>=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){backdrops.push(this._overlays[i])}}return backdrops},backdropZ:function(){return this._getZ(this._overlayWithBackdrop())-1},_overlayWithBackdrop:function(){for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){return this._overlays[i]}}},_getZ:function(overlay){var z=this._minimumZ;if(overlay){var z1=Number(overlay.style.zIndex||window.getComputedStyle(overlay).zIndex);if(z1===z1){z=z1}}return z},_setZ:function(element,z){element.style.zIndex=z},_applyOverlayZ:function(overlay,aboveZ){this._setZ(overlay,aboveZ+2)},_overlayInPath:function(path){path=path||[];for(var i=0;i<path.length;i++){if(path[i]._manager===this){return path[i]}}},_onCaptureClick:function(event){var overlay=this.currentOverlay();if(overlay&&this._overlayInPath(Polymer.dom(event).path)!==overlay){overlay._onCaptureClick(event)}},_onCaptureFocus:function(event){var overlay=this.currentOverlay();if(overlay){overlay._onCaptureFocus(event)}},_onCaptureKeyDown:function(event){var overlay=this.currentOverlay();if(overlay){if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"esc")){overlay._onCaptureEsc(event)}else if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"tab")){overlay._onCaptureTab(event)}}},_shouldBeBehindOverlay:function(overlay1,overlay2){return!overlay1.alwaysOnTop&&overlay2.alwaysOnTop}};Polymer.IronOverlayManager=new Polymer.IronOverlayManagerClass;(function(){"use strict";Polymer.IronOverlayBehaviorImpl={properties:{opened:{observer:"_openedChanged",type:Boolean,value:false,notify:true},canceled:{observer:"_canceledChanged",readOnly:true,type:Boolean,value:false},withBackdrop:{observer:"_withBackdropChanged",type:Boolean},noAutoFocus:{type:Boolean,value:false},noCancelOnEscKey:{type:Boolean,value:false},noCancelOnOutsideClick:{type:Boolean,value:false},closingReason:{type:Object},restoreFocusOnClose:{type:Boolean,value:false},alwaysOnTop:{type:Boolean},_manager:{type:Object,value:Polymer.IronOverlayManager},_focusedChild:{type:Object}},listeners:{"iron-resize":"_onIronResize"},get backdropElement(){return this._manager.backdropElement},get _focusNode(){return this._focusedChild||Polymer.dom(this).querySelector("[autofocus]")||this},get _focusableNodes(){var FOCUSABLE_WITH_DISABLED=["a[href]","area[href]","iframe","[tabindex]","[contentEditable=true]"];var FOCUSABLE_WITHOUT_DISABLED=["input","select","textarea","button"];var selector=FOCUSABLE_WITH_DISABLED.join(':not([tabindex="-1"]),')+':not([tabindex="-1"]),'+FOCUSABLE_WITHOUT_DISABLED.join(':not([disabled]):not([tabindex="-1"]),')+':not([disabled]):not([tabindex="-1"])';var focusables=Polymer.dom(this).querySelectorAll(selector);if(this.tabIndex>=0){focusables.splice(0,0,this)}return focusables.sort(function(a,b){if(a.tabIndex===b.tabIndex){return 0}if(a.tabIndex===0||a.tabIndex>b.tabIndex){return 1}return-1})},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1];this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.notifyResize()}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i<activeEntries.length;i++){if(activeEntries[i].animation.playState!="finished"){finished=false;break}}return finished},_complete:function(activeEntries){for(var i=0;i<activeEntries.length;i++){activeEntries[i].neonAnimation.complete(activeEntries[i].config)}for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.cancel()}},playAnimation:function(type,cookie){var configs=this.getAnimationConfig(type);if(!configs){return}this._active=this._active||{};if(this._active[type]){this._complete(this._active[type]);delete this._active[type]}var activeEntries=this._configureAnimations(configs);if(activeEntries.length==0){this.fire("neon-animation-finish",cookie,{bubbles:false});return}this._active[type]=activeEntries;for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.onfinish=function(){if(this._shouldComplete(activeEntries)){this._complete(activeEntries);delete this._active[type];this.fire("neon-animation-finish",cookie,{bubbles:false})}}.bind(this)}},cancelAnimation:function(){for(var k in this._animations){this._animations[k].cancel()}this._animations={}}};Polymer.NeonAnimationRunnerBehavior=[Polymer.NeonAnimatableBehavior,Polymer.NeonAnimationRunnerBehaviorImpl];Polymer.NeonAnimationBehavior={properties:{animationTiming:{type:Object,value:function(){return{duration:500,easing:"cubic-bezier(0.4, 0, 0.2, 1)",fill:"both"}}}},isNeonAnimation:true,timingFromConfig:function(config){if(config.timing){for(var property in config.timing){this.animationTiming[property]=config.timing[property]}}return this.animationTiming},setPrefixedProperty:function(node,property,value){var map={transform:["webkitTransform"],transformOrigin:["mozTransformOrigin","webkitTransformOrigin"]};var prefixes=map[property];for(var prefix,index=0;prefix=prefixes[index];index++){node.style[prefix]=value}node.style[property]=value},complete:function(){}};Polymer({is:"opaque-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"1"}],this.timingFromConfig(config));node.style.opacity="0";return this._effect},complete:function(config){config.node.style.opacity=""}});(function(){"use strict";var LAST_TOUCH_POSITION={pageX:0,pageY:0};var ROOT_TARGET=null;var SCROLLABLE_NODES=[];Polymer.IronDropdownScrollManager={get currentLockingElement(){return this._lockingElements[this._lockingElements.length-1]},elementIsScrollLocked:function(element){var currentLockingElement=this.currentLockingElement;if(currentLockingElement===undefined)return false;var scrollLocked;if(this._hasCachedLockedElement(element)){return true}if(this._hasCachedUnlockedElement(element)){return false}scrollLocked=!!currentLockingElement&¤tLockingElement!==element&&!this._composedTreeContains(currentLockingElement,element);if(scrollLocked){this._lockedElementCache.push(element)}else{this._unlockedElementCache.push(element)}return scrollLocked},pushScrollLock:function(element){if(this._lockingElements.indexOf(element)>=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex<contentElements.length;++contentIndex){distributedNodes=Polymer.dom(contentElements[contentIndex]).getDistributedNodes();for(nodeIndex=0;nodeIndex<distributedNodes.length;++nodeIndex){if(this._composedTreeContains(distributedNodes[nodeIndex],child)){return true}}}return false},_scrollInteractionHandler:function(event){if(event.cancelable&&this._shouldPreventScrolling(event)){event.preventDefault()}if(event.targetTouches){var touch=event.targetTouches[0];LAST_TOUCH_POSITION.pageX=touch.pageX;LAST_TOUCH_POSITION.pageY=touch.pageY}},_lockScrollInteractions:function(){this._boundScrollHandler=this._boundScrollHandler||this._scrollInteractionHandler.bind(this);document.addEventListener("wheel",this._boundScrollHandler,true);document.addEventListener("mousewheel",this._boundScrollHandler,true);document.addEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.addEventListener("touchstart",this._boundScrollHandler,true);document.addEventListener("touchmove",this._boundScrollHandler,true)},_unlockScrollInteractions:function(){document.removeEventListener("wheel",this._boundScrollHandler,true);document.removeEventListener("mousewheel",this._boundScrollHandler,true);document.removeEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.removeEventListener("touchstart",this._boundScrollHandler,true);document.removeEventListener("touchmove",this._boundScrollHandler,true)},_shouldPreventScrolling:function(event){var target=Polymer.dom(event).rootTarget;if(event.type!=="touchmove"&&ROOT_TARGET!==target){ROOT_TARGET=target;SCROLLABLE_NODES=this._getScrollableNodes(Polymer.dom(event).path)}if(!SCROLLABLE_NODES.length){return true}if(event.type==="touchstart"){return false}var info=this._getScrollInfo(event);return!this._getScrollingNode(SCROLLABLE_NODES,info.deltaX,info.deltaY)},_getScrollableNodes:function(nodes){var scrollables=[];var lockingIndex=nodes.indexOf(this.currentLockingElement);for(var i=0;i<=lockingIndex;i++){var node=nodes[i];if(node.nodeType===11){continue}var style=node.style;if(style.overflow!=="scroll"&&style.overflow!=="auto"){style=window.getComputedStyle(node)}if(style.overflow==="scroll"||style.overflow==="auto"){scrollables.push(node)}}return scrollables},_getScrollingNode:function(nodes,deltaX,deltaY){if(!deltaX&&!deltaY){return}var verticalScroll=Math.abs(deltaY)>=Math.abs(deltaX);for(var i=0;i<nodes.length;i++){var node=nodes[i];var canScroll=false;if(verticalScroll){canScroll=deltaY<0?node.scrollTop>0:node.scrollTop<node.scrollHeight-node.clientHeight}else{canScroll=deltaX<0?node.scrollLeft>0:node.scrollLeft<node.scrollWidth-node.clientWidth}if(canScroll){return node}}},_getScrollInfo:function(event){var info={deltaX:event.deltaX,deltaY:event.deltaY};if("deltaX"in event){}else if("wheelDeltaX"in event){info.deltaX=-event.wheelDeltaX;info.deltaY=-event.wheelDeltaY}else if("axis"in event){info.deltaX=event.axis===1?event.detail:0;info.deltaY=event.axis===2?event.detail:0}else if(event.targetTouches){var touch=event.targetTouches[0];info.deltaX=LAST_TOUCH_POSITION.pageX-touch.pageX;info.deltaY=LAST_TOUCH_POSITION.pageY-touch.pageY}return info}}})();(function(){"use strict";Polymer({is:"iron-dropdown",behaviors:[Polymer.IronControlState,Polymer.IronA11yKeysBehavior,Polymer.IronOverlayBehavior,Polymer.NeonAnimationRunnerBehavior],properties:{horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},openAnimationConfig:{type:Object},closeAnimationConfig:{type:Object},focusTarget:{type:Object},noAnimations:{type:Boolean,value:false},allowOutsideScroll:{type:Boolean,value:false},_boundOnCaptureScroll:{type:Function,value:function(){return this._onCaptureScroll.bind(this)}}},listeners:{"neon-animation-finish":"_onNeonAnimationFinish"},observers:["_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)"],get containedElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},get _focusTarget(){return this.focusTarget||this.containedElement},ready:function(){this._scrollTop=0;this._scrollLeft=0;this._refitOnScrollRAF=null},attached:function(){ -if(!this.sizingTarget||this.sizingTarget===this){this.sizingTarget=this.containedElement}},detached:function(){this.cancelAnimation();document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)},_openedChanged:function(){if(this.opened&&this.disabled){this.cancel()}else{this.cancelAnimation();this._updateAnimationConfig();this._saveScrollPosition();if(this.opened){document.addEventListener("scroll",this._boundOnCaptureScroll);!this.allowOutsideScroll&&Polymer.IronDropdownScrollManager.pushScrollLock(this)}else{document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)}Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this,arguments)}},_renderOpened:function(){if(!this.noAnimations&&this.animationConfig.open){this.$.contentWrapper.classList.add("animating");this.playAnimation("open")}else{Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this,arguments)}},_renderClosed:function(){if(!this.noAnimations&&this.animationConfig.close){this.$.contentWrapper.classList.add("animating");this.playAnimation("close")}else{Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this,arguments)}},_onNeonAnimationFinish:function(){this.$.contentWrapper.classList.remove("animating");if(this.opened){this._finishRenderOpened()}else{this._finishRenderClosed()}},_onCaptureScroll:function(){if(!this.allowOutsideScroll){this._restoreScrollPosition()}else{this._refitOnScrollRAF&&window.cancelAnimationFrame(this._refitOnScrollRAF);this._refitOnScrollRAF=window.requestAnimationFrame(this.refit.bind(this))}},_saveScrollPosition:function(){if(document.scrollingElement){this._scrollTop=document.scrollingElement.scrollTop;this._scrollLeft=document.scrollingElement.scrollLeft}else{this._scrollTop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);this._scrollLeft=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft)}},_restoreScrollPosition:function(){if(document.scrollingElement){document.scrollingElement.scrollTop=this._scrollTop;document.scrollingElement.scrollLeft=this._scrollLeft}else{document.documentElement.scrollTop=this._scrollTop;document.documentElement.scrollLeft=this._scrollLeft;document.body.scrollTop=this._scrollTop;document.body.scrollLeft=this._scrollLeft}},_updateAnimationConfig:function(){var animations=(this.openAnimationConfig||[]).concat(this.closeAnimationConfig||[]);for(var i=0;i<animations.length;i++){animations[i].node=this.containedElement}this.animationConfig={open:this.openAnimationConfig,close:this.closeAnimationConfig}},_updateOverlayPosition:function(){if(this.isAttached){this.notifyResize()}},_applyFocus:function(){var focusTarget=this.focusTarget||this.containedElement;if(focusTarget&&this.opened&&!this.noAutoFocus){focusTarget.focus()}else{Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this,arguments)}}})})();Polymer({is:"paper-tab",behaviors:[Polymer.IronControlState,Polymer.IronButtonState,Polymer.PaperRippleBehavior],properties:{link:{type:Boolean,value:false,reflectToAttribute:true}},hostAttributes:{role:"tab"},listeners:{down:"_updateNoink",tap:"_onTap"},attached:function(){this._updateNoink()},get _parentNoink(){var parent=Polymer.dom(this).parentNode;return!!parent&&!!parent.noink},_updateNoink:function(){this.noink=!!this.noink||!!this._parentNoink},_onTap:function(event){if(this.link){var anchor=this.queryEffectiveChildren("a");if(!anchor){return}if(event.target===anchor){return}anchor.click()}}});Polymer.IronMenuBehaviorImpl={properties:{focusedItem:{observer:"_focusedItemChanged",readOnly:true,type:Object},attrForItemTitle:{type:String}},hostAttributes:{role:"menu",tabindex:"0"},observers:["_updateMultiselectable(multi)"],listeners:{focus:"_onFocus",keydown:"_onKeydown","iron-items-changed":"_onIronItemsChanged"},keyBindings:{up:"_onUpKey",down:"_onDownKey",esc:"_onEscKey","shift+tab:keydown":"_onShiftTabDown"},attached:function(){this._resetTabindices()},select:function(value){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}var item=this._valueToItem(value);if(item&&item.hasAttribute("disabled"))return;this._setFocusedItem(item);Polymer.IronMultiSelectableBehaviorImpl.select.apply(this,arguments)},_resetTabindices:function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this.items.forEach(function(item){item.setAttribute("tabindex",item===selectedItem?"0":"-1")},this)},_updateMultiselectable:function(multi){if(multi){this.setAttribute("aria-multiselectable","true")}else{this.removeAttribute("aria-multiselectable")}},_focusWithKeyboardEvent:function(event){for(var i=0,item;item=this.items[i];i++){var attr=this.attrForItemTitle||"textContent";var title=item[attr]||item.getAttribute(attr);if(!item.hasAttribute("disabled")&&title&&title.trim().charAt(0).toLowerCase()===String.fromCharCode(event.keyCode).toLowerCase()){this._setFocusedItem(item);break}}},_focusPrevious:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex-i+length)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_focusNext:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex+i)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_applySelection:function(item,isSelected){if(isSelected){item.setAttribute("aria-selected","true")}else{item.removeAttribute("aria-selected")}Polymer.IronSelectableBehavior._applySelection.apply(this,arguments)},_focusedItemChanged:function(focusedItem,old){old&&old.setAttribute("tabindex","-1");if(focusedItem){focusedItem.setAttribute("tabindex","0");focusedItem.focus()}},_onIronItemsChanged:function(event){if(event.detail.addedNodes.length){this._resetTabindices()}},_onShiftTabDown:function(event){var oldTabIndex=this.getAttribute("tabindex");Polymer.IronMenuBehaviorImpl._shiftTabPressed=true;this._setFocusedItem(null);this.setAttribute("tabindex","-1");this.async(function(){this.setAttribute("tabindex",oldTabIndex);Polymer.IronMenuBehaviorImpl._shiftTabPressed=false},1)},_onFocus:function(event){if(Polymer.IronMenuBehaviorImpl._shiftTabPressed){return}var rootTarget=Polymer.dom(event).rootTarget;if(rootTarget!==this&&typeof rootTarget.tabIndex!=="undefined"&&!this.isLightDescendant(rootTarget)){return}this._defaultFocusAsync=this.async(function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this._setFocusedItem(null);if(selectedItem){this._setFocusedItem(selectedItem)}else if(this.items[0]){this._focusNext()}})},_onUpKey:function(event){this._focusPrevious();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this._focusNext();event.detail.keyboardEvent.preventDefault()},_onEscKey:function(event){this.focusedItem.blur()},_onKeydown:function(event){if(!this.keyboardEventMatchesKeys(event,"up down esc")){this._focusWithKeyboardEvent(event)}event.stopPropagation()},_activateHandler:function(event){Polymer.IronSelectableBehavior._activateHandler.call(this,event);event.stopPropagation()}};Polymer.IronMenuBehaviorImpl._shiftTabPressed=false;Polymer.IronMenuBehavior=[Polymer.IronMultiSelectableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronMenuBehaviorImpl];Polymer.IronMenubarBehaviorImpl={hostAttributes:{role:"menubar"},keyBindings:{left:"_onLeftKey",right:"_onRightKey"},_onUpKey:function(event){this.focusedItem.click();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this.focusedItem.click();event.detail.keyboardEvent.preventDefault()},get _isRTL(){return window.getComputedStyle(this)["direction"]==="rtl"},_onLeftKey:function(event){if(this._isRTL){this._focusNext()}else{this._focusPrevious()}event.detail.keyboardEvent.preventDefault()},_onRightKey:function(event){if(this._isRTL){this._focusPrevious()}else{this._focusNext()}event.detail.keyboardEvent.preventDefault()},_onKeydown:function(event){if(this.keyboardEventMatchesKeys(event,"up down left right esc")){return}this._focusWithKeyboardEvent(event)}};Polymer.IronMenubarBehavior=[Polymer.IronMenuBehavior,Polymer.IronMenubarBehaviorImpl];Polymer({is:"paper-tabs",behaviors:[Polymer.IronResizableBehavior,Polymer.IronMenubarBehavior],properties:{noink:{type:Boolean,value:false,observer:"_noinkChanged"},noBar:{type:Boolean,value:false},noSlide:{type:Boolean,value:false},scrollable:{type:Boolean,value:false},fitContainer:{type:Boolean,value:false},disableDrag:{type:Boolean,value:false},hideScrollButtons:{type:Boolean,value:false},alignBottom:{type:Boolean,value:false},selectable:{type:String,value:"paper-tab"},autoselect:{type:Boolean,value:false},autoselectDelay:{type:Number,value:0},_step:{type:Number,value:10},_holdDelay:{type:Number,value:1},_leftHidden:{type:Boolean,value:false},_rightHidden:{type:Boolean,value:false},_previousTab:{type:Object}},hostAttributes:{role:"tablist"},listeners:{"iron-resize":"_onTabSizingChanged","iron-items-changed":"_onTabSizingChanged","iron-select":"_onIronSelect","iron-deselect":"_onIronDeselect"},keyBindings:{"left:keyup right:keyup":"_onArrowKeyup"},created:function(){this._holdJob=null;this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined;this._bindDelayedActivationHandler=this._delayedActivationHandler.bind(this);this.addEventListener("blur",this._onBlurCapture.bind(this),true)},ready:function(){this.setScrollDirection("y",this.$.tabsContainer)},detached:function(){this._cancelPendingActivation()},_noinkChanged:function(noink){var childTabs=Polymer.dom(this).querySelectorAll("paper-tab");childTabs.forEach(noink?this._setNoinkAttribute:this._removeNoinkAttribute)},_setNoinkAttribute:function(element){element.setAttribute("noink","")},_removeNoinkAttribute:function(element){element.removeAttribute("noink")},_computeScrollButtonClass:function(hideThisButton,scrollable,hideScrollButtons){if(!scrollable||hideScrollButtons){return"hidden"}if(hideThisButton){return"not-visible"}return""},_computeTabsContentClass:function(scrollable,fitContainer){return scrollable?"scrollable"+(fitContainer?" fit-container":""):" fit-container"},_computeSelectionBarClass:function(noBar,alignBottom){if(noBar){return"hidden"}else if(alignBottom){return"align-bottom"}return""},_onTabSizingChanged:function(){this.debounce("_onTabSizingChanged",function(){this._scroll();this._tabChanged(this.selectedItem)},10)},_onIronSelect:function(event){this._tabChanged(event.detail.item,this._previousTab);this._previousTab=event.detail.item;this.cancelDebouncer("tab-changed")},_onIronDeselect:function(event){this.debounce("tab-changed",function(){this._tabChanged(null,this._previousTab);this._previousTab=null},1)},_activateHandler:function(){this._cancelPendingActivation();Polymer.IronMenuBehaviorImpl._activateHandler.apply(this,arguments)},_scheduleActivation:function(item,delay){this._pendingActivationItem=item;this._pendingActivationTimeout=this.async(this._bindDelayedActivationHandler,delay)},_delayedActivationHandler:function(){var item=this._pendingActivationItem;this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined;item.fire(this.activateEvent,null,{bubbles:true,cancelable:true})},_cancelPendingActivation:function(){if(this._pendingActivationTimeout!==undefined){this.cancelAsync(this._pendingActivationTimeout);this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined}},_onArrowKeyup:function(event){if(this.autoselect){this._scheduleActivation(this.focusedItem,this.autoselectDelay)}},_onBlurCapture:function(event){if(event.target===this._pendingActivationItem){this._cancelPendingActivation()}},get _tabContainerScrollSize(){return Math.max(0,this.$.tabsContainer.scrollWidth-this.$.tabsContainer.offsetWidth)},_scroll:function(e,detail){if(!this.scrollable){return}var ddx=detail&&-detail.ddx||0;this._affectScroll(ddx)},_down:function(e){this.async(function(){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}},1)},_affectScroll:function(dx){this.$.tabsContainer.scrollLeft+=dx;var scrollLeft=this.$.tabsContainer.scrollLeft;this._leftHidden=scrollLeft===0;this._rightHidden=scrollLeft===this._tabContainerScrollSize},_onLeftScrollButtonDown:function(){this._scrollToLeft();this._holdJob=setInterval(this._scrollToLeft.bind(this),this._holdDelay)},_onRightScrollButtonDown:function(){this._scrollToRight();this._holdJob=setInterval(this._scrollToRight.bind(this),this._holdDelay)},_onScrollButtonUp:function(){clearInterval(this._holdJob);this._holdJob=null},_scrollToLeft:function(){this._affectScroll(-this._step)},_scrollToRight:function(){this._affectScroll(this._step)},_tabChanged:function(tab,old){if(!tab){this.$.selectionBar.classList.remove("expand");this.$.selectionBar.classList.remove("contract");this._positionBar(0,0);return}var r=this.$.tabsContent.getBoundingClientRect();var w=r.width;var tabRect=tab.getBoundingClientRect();var tabOffsetLeft=tabRect.left-r.left;this._pos={width:this._calcPercent(tabRect.width,w),left:this._calcPercent(tabOffsetLeft,w)};if(this.noSlide||old==null){this.$.selectionBar.classList.remove("expand");this.$.selectionBar.classList.remove("contract");this._positionBar(this._pos.width,this._pos.left);return}var oldRect=old.getBoundingClientRect();var oldIndex=this.items.indexOf(old);var index=this.items.indexOf(tab);var m=5;this.$.selectionBar.classList.add("expand");var moveRight=oldIndex<index;var isRTL=this._isRTL;if(isRTL){moveRight=!moveRight}if(moveRight){this._positionBar(this._calcPercent(tabRect.left+tabRect.width-oldRect.left,w)-m,this._left)}else{this._positionBar(this._calcPercent(oldRect.left+oldRect.width-tabRect.left,w)-m,this._calcPercent(tabOffsetLeft,w)+m)}if(this.scrollable){this._scrollToSelectedIfNeeded(tabRect.width,tabOffsetLeft)}},_scrollToSelectedIfNeeded:function(tabWidth,tabOffsetLeft){var l=tabOffsetLeft-this.$.tabsContainer.scrollLeft;if(l<0){this.$.tabsContainer.scrollLeft+=l}else{l+=tabWidth-this.$.tabsContainer.offsetWidth;if(l>0){this.$.tabsContainer.scrollLeft+=l}}},_calcPercent:function(w,w0){return 100*w/w0},_positionBar:function(width,left){width=width||0;left=left||0;this._width=width;this._left=left;this.transform("translateX("+left+"%) scaleX("+width/100+")",this.$.selectionBar)},_onBarTransitionEnd:function(e){var cl=this.$.selectionBar.classList;if(cl.contains("expand")){cl.remove("expand");cl.add("contract");this._positionBar(this._pos.width,this._pos.left)}else if(cl.contains("contract")){cl.remove("contract")}}}); \ No newline at end of file +Polymer({is:"cr-drawer","extends":"dialog",properties:{open:{type:Boolean,notify:true},align:{type:String,value:"left",reflectToAttribute:true}},listeners:{cancel:"onDialogCancel_",tap:"onDialogTap_",transitionend:"onDialogTransitionEnd_"},toggle:function(){if(this.open)this.closeDrawer();else this.openDrawer()},openDrawer:function(){if(!this.open){this.showModal();this.classList.add("opening")}},closeDrawer:function(){if(this.open){this.classList.remove("opening");this.classList.add("closing")}},onContainerTap_:function(event){event.stopPropagation()},onDialogTap_:function(){this.closeDrawer()},onDialogCancel_:function(event){event.preventDefault();this.closeDrawer()},onDialogTransitionEnd_:function(){if(this.classList.contains("closing")){this.classList.remove("closing");this.close()}}});Polymer.IronFitBehavior={properties:{sizingTarget:{type:Object,value:function(){return this}},fitInto:{type:Object,value:window},noOverlap:{type:Boolean},positionTarget:{type:Element},horizontalAlign:{type:String},verticalAlign:{type:String},dynamicAlign:{type:Boolean},horizontalOffset:{type:Number,value:0,notify:true},verticalOffset:{type:Number,value:0,notify:true},autoFitOnAttach:{type:Boolean,value:false},_fitInfo:{type:Object}},get _fitWidth(){var fitWidth;if(this.fitInto===window){fitWidth=this.fitInto.innerWidth}else{fitWidth=this.fitInto.getBoundingClientRect().width}return fitWidth},get _fitHeight(){var fitHeight;if(this.fitInto===window){fitHeight=this.fitInto.innerHeight}else{fitHeight=this.fitInto.getBoundingClientRect().height}return fitHeight},get _fitLeft(){var fitLeft;if(this.fitInto===window){fitLeft=0}else{fitLeft=this.fitInto.getBoundingClientRect().left}return fitLeft},get _fitTop(){var fitTop;if(this.fitInto===window){fitTop=0}else{fitTop=this.fitInto.getBoundingClientRect().top}return fitTop},get _defaultPositionTarget(){var parent=Polymer.dom(this).parentNode;if(parent&&parent.nodeType===Node.DOCUMENT_FRAGMENT_NODE){parent=parent.host}return parent},get _localeHorizontalAlign(){if(this._isRTL){if(this.horizontalAlign==="right"){return"left"}if(this.horizontalAlign==="left"){return"right"}}return this.horizontalAlign},attached:function(){this._isRTL=window.getComputedStyle(this).direction=="rtl";this.positionTarget=this.positionTarget||this._defaultPositionTarget;if(this.autoFitOnAttach){if(window.getComputedStyle(this).display==="none"){setTimeout(function(){this.fit()}.bind(this))}else{this.fit()}}},fit:function(){this.position();this.constrain();this.center()},_discoverInfo:function(){if(this._fitInfo){return}var target=window.getComputedStyle(this);var sizer=window.getComputedStyle(this.sizingTarget);this._fitInfo={inlineStyle:{top:this.style.top||"",left:this.style.left||"",position:this.style.position||""},sizerInlineStyle:{maxWidth:this.sizingTarget.style.maxWidth||"",maxHeight:this.sizingTarget.style.maxHeight||"",boxSizing:this.sizingTarget.style.boxSizing||""},positionedBy:{vertically:target.top!=="auto"?"top":target.bottom!=="auto"?"bottom":null,horizontally:target.left!=="auto"?"left":target.right!=="auto"?"right":null},sizedBy:{height:sizer.maxHeight!=="none",width:sizer.maxWidth!=="none",minWidth:parseInt(sizer.minWidth,10)||0,minHeight:parseInt(sizer.minHeight,10)||0},margin:{top:parseInt(target.marginTop,10)||0,right:parseInt(target.marginRight,10)||0,bottom:parseInt(target.marginBottom,10)||0,left:parseInt(target.marginLeft,10)||0}};if(this.verticalOffset){this._fitInfo.margin.top=this._fitInfo.margin.bottom=this.verticalOffset;this._fitInfo.inlineStyle.marginTop=this.style.marginTop||"";this._fitInfo.inlineStyle.marginBottom=this.style.marginBottom||"";this.style.marginTop=this.style.marginBottom=this.verticalOffset+"px"}if(this.horizontalOffset){this._fitInfo.margin.left=this._fitInfo.margin.right=this.horizontalOffset;this._fitInfo.inlineStyle.marginLeft=this.style.marginLeft||"";this._fitInfo.inlineStyle.marginRight=this.style.marginRight||"";this.style.marginLeft=this.style.marginRight=this.horizontalOffset+"px"}},resetFit:function(){var info=this._fitInfo||{};for(var property in info.sizerInlineStyle){this.sizingTarget.style[property]=info.sizerInlineStyle[property]}for(var property in info.inlineStyle){this.style[property]=info.inlineStyle[property]}this._fitInfo=null},refit:function(){var scrollLeft=this.sizingTarget.scrollLeft;var scrollTop=this.sizingTarget.scrollTop;this.resetFit();this.fit();this.sizingTarget.scrollLeft=scrollLeft;this.sizingTarget.scrollTop=scrollTop},position:function(){if(!this.horizontalAlign&&!this.verticalAlign){return}this._discoverInfo();this.style.position="fixed";this.sizingTarget.style.boxSizing="border-box";this.style.left="0px";this.style.top="0px";var rect=this.getBoundingClientRect();var positionRect=this.__getNormalizedRect(this.positionTarget);var fitRect=this.__getNormalizedRect(this.fitInto);var margin=this._fitInfo.margin;var size={width:rect.width+margin.left+margin.right,height:rect.height+margin.top+margin.bottom};var position=this.__getPosition(this._localeHorizontalAlign,this.verticalAlign,size,positionRect,fitRect);var left=position.left+margin.left;var top=position.top+margin.top;var right=Math.min(fitRect.right-margin.right,left+rect.width);var bottom=Math.min(fitRect.bottom-margin.bottom,top+rect.height);var minWidth=this._fitInfo.sizedBy.minWidth;var minHeight=this._fitInfo.sizedBy.minHeight;if(left<margin.left){left=margin.left;if(right-left<minWidth){left=right-minWidth}}if(top<margin.top){top=margin.top;if(bottom-top<minHeight){top=bottom-minHeight}}this.sizingTarget.style.maxWidth=right-left+"px";this.sizingTarget.style.maxHeight=bottom-top+"px";this.style.left=left-rect.left+"px";this.style.top=top-rect.top+"px"},constrain:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var info=this._fitInfo;if(!info.positionedBy.vertically){this.style.position="fixed";this.style.top="0px"}if(!info.positionedBy.horizontally){this.style.position="fixed";this.style.left="0px"}this.sizingTarget.style.boxSizing="border-box";var rect=this.getBoundingClientRect();if(!info.sizedBy.height){this.__sizeDimension(rect,info.positionedBy.vertically,"top","bottom","Height")}if(!info.sizedBy.width){this.__sizeDimension(rect,info.positionedBy.horizontally,"left","right","Width")}},_sizeDimension:function(rect,positionedBy,start,end,extent){this.__sizeDimension(rect,positionedBy,start,end,extent)},__sizeDimension:function(rect,positionedBy,start,end,extent){var info=this._fitInfo;var fitRect=this.__getNormalizedRect(this.fitInto);var max=extent==="Width"?fitRect.width:fitRect.height;var flip=positionedBy===end;var offset=flip?max-rect[end]:rect[start];var margin=info.margin[flip?start:end];var offsetExtent="offset"+extent;var sizingOffset=this[offsetExtent]-this.sizingTarget[offsetExtent];this.sizingTarget.style["max"+extent]=max-margin-offset-sizingOffset+"px"},center:function(){if(this.horizontalAlign||this.verticalAlign){return}this._discoverInfo();var positionedBy=this._fitInfo.positionedBy;if(positionedBy.vertically&&positionedBy.horizontally){return}this.style.position="fixed";if(!positionedBy.vertically){this.style.top="0px"}if(!positionedBy.horizontally){this.style.left="0px"}var rect=this.getBoundingClientRect();var fitRect=this.__getNormalizedRect(this.fitInto);if(!positionedBy.vertically){var top=fitRect.top-rect.top+(fitRect.height-rect.height)/2;this.style.top=top+"px"}if(!positionedBy.horizontally){var left=fitRect.left-rect.left+(fitRect.width-rect.width)/2;this.style.left=left+"px"}},__getNormalizedRect:function(target){if(target===document.documentElement||target===window){return{top:0,left:0,width:window.innerWidth,height:window.innerHeight,right:window.innerWidth,bottom:window.innerHeight}}return target.getBoundingClientRect()},__getCroppedArea:function(position,size,fitRect){var verticalCrop=Math.min(0,position.top)+Math.min(0,fitRect.bottom-(position.top+size.height));var horizontalCrop=Math.min(0,position.left)+Math.min(0,fitRect.right-(position.left+size.width));return Math.abs(verticalCrop)*size.width+Math.abs(horizontalCrop)*size.height},__getPosition:function(hAlign,vAlign,size,positionRect,fitRect){var positions=[{verticalAlign:"top",horizontalAlign:"left",top:positionRect.top,left:positionRect.left},{verticalAlign:"top",horizontalAlign:"right",top:positionRect.top,left:positionRect.right-size.width},{verticalAlign:"bottom",horizontalAlign:"left",top:positionRect.bottom-size.height,left:positionRect.left},{verticalAlign:"bottom",horizontalAlign:"right",top:positionRect.bottom-size.height,left:positionRect.right-size.width}];if(this.noOverlap){for(var i=0,l=positions.length;i<l;i++){var copy={};for(var key in positions[i]){copy[key]=positions[i][key]}positions.push(copy)}positions[0].top=positions[1].top+=positionRect.height;positions[2].top=positions[3].top-=positionRect.height;positions[4].left=positions[6].left+=positionRect.width;positions[5].left=positions[7].left-=positionRect.width}vAlign=vAlign==="auto"?null:vAlign;hAlign=hAlign==="auto"?null:hAlign;var position;for(var i=0;i<positions.length;i++){var pos=positions[i];if(!this.dynamicAlign&&!this.noOverlap&&pos.verticalAlign===vAlign&&pos.horizontalAlign===hAlign){position=pos;break}var alignOk=(!vAlign||pos.verticalAlign===vAlign)&&(!hAlign||pos.horizontalAlign===hAlign);if(!this.dynamicAlign&&!alignOk){continue}position=position||pos;pos.croppedArea=this.__getCroppedArea(pos,size,fitRect);var diff=pos.croppedArea-position.croppedArea;if(diff<0||diff===0&&alignOk){position=pos}if(position.croppedArea===0&&alignOk){break}}return position}};(function(){"use strict";Polymer({is:"iron-overlay-backdrop",properties:{opened:{reflectToAttribute:true,type:Boolean,value:false,observer:"_openedChanged"}},listeners:{transitionend:"_onTransitionend"},created:function(){this.__openedRaf=null},attached:function(){this.opened&&this._openedChanged(this.opened)},prepare:function(){if(this.opened&&!this.parentNode){Polymer.dom(document.body).appendChild(this)}},open:function(){this.opened=true},close:function(){this.opened=false},complete:function(){if(!this.opened&&this.parentNode===document.body){Polymer.dom(this.parentNode).removeChild(this)}},_onTransitionend:function(event){if(event&&event.target===this){this.complete()}},_openedChanged:function(opened){if(opened){this.prepare()}else{var cs=window.getComputedStyle(this);if(cs.transitionDuration==="0s"||cs.opacity==0){this.complete()}}if(!this.isAttached){return}if(this.__openedRaf){window.cancelAnimationFrame(this.__openedRaf);this.__openedRaf=null}this.scrollTop=this.scrollTop;this.__openedRaf=window.requestAnimationFrame(function(){this.__openedRaf=null;this.toggleClass("opened",this.opened)}.bind(this))}})})();Polymer.IronOverlayManagerClass=function(){this._overlays=[];this._minimumZ=101;this._backdropElement=null;Polymer.Gestures.add(document,"tap",this._onCaptureClick.bind(this));document.addEventListener("focus",this._onCaptureFocus.bind(this),true);document.addEventListener("keydown",this._onCaptureKeyDown.bind(this),true)};Polymer.IronOverlayManagerClass.prototype={constructor:Polymer.IronOverlayManagerClass,get backdropElement(){if(!this._backdropElement){this._backdropElement=document.createElement("iron-overlay-backdrop")}return this._backdropElement},get deepActiveElement(){var active=document.activeElement||document.body;while(active.root&&Polymer.dom(active.root).activeElement){active=Polymer.dom(active.root).activeElement}return active},_bringOverlayAtIndexToFront:function(i){var overlay=this._overlays[i];if(!overlay){return}var lastI=this._overlays.length-1;var currentOverlay=this._overlays[lastI];if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){lastI--}if(i>=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i<lastI){this._overlays[i]=this._overlays[i+1];i++}this._overlays[lastI]=overlay},addOrRemoveOverlay:function(overlay){if(overlay.opened){this.addOverlay(overlay)}else{this.removeOverlay(overlay)}},addOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i>=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){backdrops.push(this._overlays[i])}}return backdrops},backdropZ:function(){return this._getZ(this._overlayWithBackdrop())-1},_overlayWithBackdrop:function(){for(var i=0;i<this._overlays.length;i++){if(this._overlays[i].withBackdrop){return this._overlays[i]}}},_getZ:function(overlay){var z=this._minimumZ;if(overlay){var z1=Number(overlay.style.zIndex||window.getComputedStyle(overlay).zIndex);if(z1===z1){z=z1}}return z},_setZ:function(element,z){element.style.zIndex=z},_applyOverlayZ:function(overlay,aboveZ){this._setZ(overlay,aboveZ+2)},_overlayInPath:function(path){path=path||[];for(var i=0;i<path.length;i++){if(path[i]._manager===this){return path[i]}}},_onCaptureClick:function(event){var overlay=this.currentOverlay();if(overlay&&this._overlayInPath(Polymer.dom(event).path)!==overlay){overlay._onCaptureClick(event)}},_onCaptureFocus:function(event){var overlay=this.currentOverlay();if(overlay){overlay._onCaptureFocus(event)}},_onCaptureKeyDown:function(event){var overlay=this.currentOverlay();if(overlay){if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"esc")){overlay._onCaptureEsc(event)}else if(Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event,"tab")){overlay._onCaptureTab(event)}}},_shouldBeBehindOverlay:function(overlay1,overlay2){return!overlay1.alwaysOnTop&&overlay2.alwaysOnTop}};Polymer.IronOverlayManager=new Polymer.IronOverlayManagerClass;(function(){"use strict";var p=Element.prototype;var matches=p.matches||p.matchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector||p.webkitMatchesSelector;Polymer.IronFocusablesHelper={getTabbableNodes:function(node){var result=[];var needsSortByTabIndex=this._collectTabbableNodes(node,result);if(needsSortByTabIndex){return this._sortByTabIndex(result)}return result},isFocusable:function(element){if(matches.call(element,"input, select, textarea, button, object")){return matches.call(element,":not([disabled])")}return matches.call(element,"a[href], area[href], iframe, [tabindex], [contentEditable]")},isTabbable:function(element){return this.isFocusable(element)&&matches.call(element,':not([tabindex="-1"])')&&this._isVisible(element)},_normalizedTabIndex:function(element){if(this.isFocusable(element)){var tabIndex=element.getAttribute("tabindex")||0;return Number(tabIndex)}return-1},_collectTabbableNodes:function(node,result){if(node.nodeType!==Node.ELEMENT_NODE||!this._isVisible(node)){return false}var element=node;var tabIndex=this._normalizedTabIndex(element);var needsSortByTabIndex=tabIndex>0;if(tabIndex>=0){result.push(element)}var children;if(element.localName==="content"){children=Polymer.dom(element).getDistributedNodes()}else{children=Polymer.dom(element.root||element).children}for(var i=0;i<children.length;i++){var needsSort=this._collectTabbableNodes(children[i],result);needsSortByTabIndex=needsSortByTabIndex||needsSort}return needsSortByTabIndex},_isVisible:function(element){var style=element.style;if(style.visibility!=="hidden"&&style.display!=="none"){style=window.getComputedStyle(element);return style.visibility!=="hidden"&&style.display!=="none"}return false},_sortByTabIndex:function(tabbables){var len=tabbables.length;if(len<2){return tabbables}var pivot=Math.ceil(len/2);var left=this._sortByTabIndex(tabbables.slice(0,pivot));var right=this._sortByTabIndex(tabbables.slice(pivot));return this._mergeSortByTabIndex(left,right)},_mergeSortByTabIndex:function(left,right){var result=[];while(left.length>0&&right.length>0){if(this._hasLowerTabOrder(left[0],right[0])){result.push(right.shift())}else{result.push(left.shift())}}return result.concat(left,right)},_hasLowerTabOrder:function(a,b){var ati=Math.max(a.tabIndex,0);var bti=Math.max(b.tabIndex,0);return ati===0||bti===0?bti>ati:ati>bti}}})();(function(){"use strict";Polymer.IronOverlayBehaviorImpl={properties:{opened:{observer:"_openedChanged",type:Boolean,value:false,notify:true},canceled:{observer:"_canceledChanged",readOnly:true,type:Boolean,value:false},withBackdrop:{observer:"_withBackdropChanged",type:Boolean},noAutoFocus:{type:Boolean,value:false},noCancelOnEscKey:{type:Boolean,value:false},noCancelOnOutsideClick:{type:Boolean,value:false},closingReason:{type:Object},restoreFocusOnClose:{type:Boolean,value:false},alwaysOnTop:{type:Boolean},_manager:{type:Object,value:Polymer.IronOverlayManager},_focusedChild:{type:Object}},listeners:{"iron-resize":"_onIronResize"},get backdropElement(){return this._manager.backdropElement},get _focusNode(){return this._focusedChild||Polymer.dom(this).querySelector("[autofocus]")||this},get _focusableNodes(){return Polymer.IronFocusablesHelper.getTabbableNodes(this)},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},invalidateTabbables:function(){this.__firstFocusableNode=this.__lastFocusableNode=null},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}this.__ensureFirstLastFocusables();var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.invalidateTabbables();this.notifyResize()}},__ensureFirstLastFocusables:function(){if(!this.__firstFocusableNode||!this.__lastFocusableNode){var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1]}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i<activeEntries.length;i++){if(activeEntries[i].animation.playState!="finished"){finished=false;break}}return finished},_complete:function(activeEntries){for(var i=0;i<activeEntries.length;i++){activeEntries[i].neonAnimation.complete(activeEntries[i].config)}for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.cancel()}},playAnimation:function(type,cookie){var configs=this.getAnimationConfig(type);if(!configs){return}this._active=this._active||{};if(this._active[type]){this._complete(this._active[type]);delete this._active[type]}var activeEntries=this._configureAnimations(configs);if(activeEntries.length==0){this.fire("neon-animation-finish",cookie,{bubbles:false});return}this._active[type]=activeEntries;for(var i=0;i<activeEntries.length;i++){activeEntries[i].animation.onfinish=function(){if(this._shouldComplete(activeEntries)){this._complete(activeEntries);delete this._active[type];this.fire("neon-animation-finish",cookie,{bubbles:false})}}.bind(this)}},cancelAnimation:function(){for(var k in this._animations){this._animations[k].cancel()}this._animations={}}};Polymer.NeonAnimationRunnerBehavior=[Polymer.NeonAnimatableBehavior,Polymer.NeonAnimationRunnerBehaviorImpl];Polymer.NeonAnimationBehavior={properties:{animationTiming:{type:Object,value:function(){return{duration:500,easing:"cubic-bezier(0.4, 0, 0.2, 1)",fill:"both"}}}},isNeonAnimation:true,timingFromConfig:function(config){if(config.timing){for(var property in config.timing){this.animationTiming[property]=config.timing[property]}}return this.animationTiming},setPrefixedProperty:function(node,property,value){var map={transform:["webkitTransform"],transformOrigin:["mozTransformOrigin","webkitTransformOrigin"]};var prefixes=map[property];for(var prefix,index=0;prefix=prefixes[index];index++){node.style[prefix]=value}node.style[property]=value},complete:function(){}};Polymer({is:"opaque-animation",behaviors:[Polymer.NeonAnimationBehavior],configure:function(config){var node=config.node;this._effect=new KeyframeEffect(node,[{opacity:"1"},{opacity:"1"}],this.timingFromConfig(config));node.style.opacity="0";return this._effect},complete:function(config){config.node.style.opacity=""}});(function(){"use strict";var LAST_TOUCH_POSITION={pageX:0,pageY:0};var ROOT_TARGET=null;var SCROLLABLE_NODES=[];Polymer.IronDropdownScrollManager={get currentLockingElement(){return this._lockingElements[this._lockingElements.length-1]},elementIsScrollLocked:function(element){var currentLockingElement=this.currentLockingElement;if(currentLockingElement===undefined)return false;var scrollLocked;if(this._hasCachedLockedElement(element)){return true}if(this._hasCachedUnlockedElement(element)){return false}scrollLocked=!!currentLockingElement&¤tLockingElement!==element&&!this._composedTreeContains(currentLockingElement,element);if(scrollLocked){this._lockedElementCache.push(element)}else{this._unlockedElementCache.push(element)}return scrollLocked},pushScrollLock:function(element){if(this._lockingElements.indexOf(element)>=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex<contentElements.length;++contentIndex){distributedNodes=Polymer.dom(contentElements[contentIndex]).getDistributedNodes();for(nodeIndex=0;nodeIndex<distributedNodes.length;++nodeIndex){if(this._composedTreeContains(distributedNodes[nodeIndex],child)){return true}}}return false},_scrollInteractionHandler:function(event){if(event.cancelable&&this._shouldPreventScrolling(event)){event.preventDefault()}if(event.targetTouches){var touch=event.targetTouches[0];LAST_TOUCH_POSITION.pageX=touch.pageX;LAST_TOUCH_POSITION.pageY=touch.pageY}},_lockScrollInteractions:function(){this._boundScrollHandler=this._boundScrollHandler||this._scrollInteractionHandler.bind(this);document.addEventListener("wheel",this._boundScrollHandler,true);document.addEventListener("mousewheel",this._boundScrollHandler,true);document.addEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.addEventListener("touchstart",this._boundScrollHandler,true);document.addEventListener("touchmove",this._boundScrollHandler,true)},_unlockScrollInteractions:function(){document.removeEventListener("wheel",this._boundScrollHandler,true);document.removeEventListener("mousewheel",this._boundScrollHandler,true);document.removeEventListener("DOMMouseScroll",this._boundScrollHandler,true);document.removeEventListener("touchstart",this._boundScrollHandler,true);document.removeEventListener("touchmove",this._boundScrollHandler,true)},_shouldPreventScrolling:function(event){var target=Polymer.dom(event).rootTarget;if(event.type!=="touchmove"&&ROOT_TARGET!==target){ROOT_TARGET=target;SCROLLABLE_NODES=this._getScrollableNodes(Polymer.dom(event).path)}if(!SCROLLABLE_NODES.length){return true}if(event.type==="touchstart"){return false}var info=this._getScrollInfo(event);return!this._getScrollingNode(SCROLLABLE_NODES,info.deltaX,info.deltaY)},_getScrollableNodes:function(nodes){var scrollables=[];var lockingIndex=nodes.indexOf(this.currentLockingElement);for(var i=0;i<=lockingIndex;i++){var node=nodes[i];if(node.nodeType===11){continue}var style=node.style;if(style.overflow!=="scroll"&&style.overflow!=="auto"){style=window.getComputedStyle(node); + +}if(style.overflow==="scroll"||style.overflow==="auto"){scrollables.push(node)}}return scrollables},_getScrollingNode:function(nodes,deltaX,deltaY){if(!deltaX&&!deltaY){return}var verticalScroll=Math.abs(deltaY)>=Math.abs(deltaX);for(var i=0;i<nodes.length;i++){var node=nodes[i];var canScroll=false;if(verticalScroll){canScroll=deltaY<0?node.scrollTop>0:node.scrollTop<node.scrollHeight-node.clientHeight}else{canScroll=deltaX<0?node.scrollLeft>0:node.scrollLeft<node.scrollWidth-node.clientWidth}if(canScroll){return node}}},_getScrollInfo:function(event){var info={deltaX:event.deltaX,deltaY:event.deltaY};if("deltaX"in event){}else if("wheelDeltaX"in event){info.deltaX=-event.wheelDeltaX;info.deltaY=-event.wheelDeltaY}else if("axis"in event){info.deltaX=event.axis===1?event.detail:0;info.deltaY=event.axis===2?event.detail:0}else if(event.targetTouches){var touch=event.targetTouches[0];info.deltaX=LAST_TOUCH_POSITION.pageX-touch.pageX;info.deltaY=LAST_TOUCH_POSITION.pageY-touch.pageY}return info}}})();(function(){"use strict";Polymer({is:"iron-dropdown",behaviors:[Polymer.IronControlState,Polymer.IronA11yKeysBehavior,Polymer.IronOverlayBehavior,Polymer.NeonAnimationRunnerBehavior],properties:{horizontalAlign:{type:String,value:"left",reflectToAttribute:true},verticalAlign:{type:String,value:"top",reflectToAttribute:true},openAnimationConfig:{type:Object},closeAnimationConfig:{type:Object},focusTarget:{type:Object},noAnimations:{type:Boolean,value:false},allowOutsideScroll:{type:Boolean,value:false},_boundOnCaptureScroll:{type:Function,value:function(){return this._onCaptureScroll.bind(this)}}},listeners:{"neon-animation-finish":"_onNeonAnimationFinish"},observers:["_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)"],get containedElement(){return Polymer.dom(this.$.content).getDistributedNodes()[0]},get _focusTarget(){return this.focusTarget||this.containedElement},ready:function(){this._scrollTop=0;this._scrollLeft=0;this._refitOnScrollRAF=null},attached:function(){if(!this.sizingTarget||this.sizingTarget===this){this.sizingTarget=this.containedElement}},detached:function(){this.cancelAnimation();document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)},_openedChanged:function(){if(this.opened&&this.disabled){this.cancel()}else{this.cancelAnimation();this._updateAnimationConfig();this._saveScrollPosition();if(this.opened){document.addEventListener("scroll",this._boundOnCaptureScroll);!this.allowOutsideScroll&&Polymer.IronDropdownScrollManager.pushScrollLock(this)}else{document.removeEventListener("scroll",this._boundOnCaptureScroll);Polymer.IronDropdownScrollManager.removeScrollLock(this)}Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this,arguments)}},_renderOpened:function(){if(!this.noAnimations&&this.animationConfig.open){this.$.contentWrapper.classList.add("animating");this.playAnimation("open")}else{Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this,arguments)}},_renderClosed:function(){if(!this.noAnimations&&this.animationConfig.close){this.$.contentWrapper.classList.add("animating");this.playAnimation("close")}else{Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this,arguments)}},_onNeonAnimationFinish:function(){this.$.contentWrapper.classList.remove("animating");if(this.opened){this._finishRenderOpened()}else{this._finishRenderClosed()}},_onCaptureScroll:function(){if(!this.allowOutsideScroll){this._restoreScrollPosition()}else{this._refitOnScrollRAF&&window.cancelAnimationFrame(this._refitOnScrollRAF);this._refitOnScrollRAF=window.requestAnimationFrame(this.refit.bind(this))}},_saveScrollPosition:function(){if(document.scrollingElement){this._scrollTop=document.scrollingElement.scrollTop;this._scrollLeft=document.scrollingElement.scrollLeft}else{this._scrollTop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);this._scrollLeft=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft)}},_restoreScrollPosition:function(){if(document.scrollingElement){document.scrollingElement.scrollTop=this._scrollTop;document.scrollingElement.scrollLeft=this._scrollLeft}else{document.documentElement.scrollTop=this._scrollTop;document.documentElement.scrollLeft=this._scrollLeft;document.body.scrollTop=this._scrollTop;document.body.scrollLeft=this._scrollLeft}},_updateAnimationConfig:function(){var animations=(this.openAnimationConfig||[]).concat(this.closeAnimationConfig||[]);for(var i=0;i<animations.length;i++){animations[i].node=this.containedElement}this.animationConfig={open:this.openAnimationConfig,close:this.closeAnimationConfig}},_updateOverlayPosition:function(){if(this.isAttached){this.notifyResize()}},_applyFocus:function(){var focusTarget=this.focusTarget||this.containedElement;if(focusTarget&&this.opened&&!this.noAutoFocus){focusTarget.focus()}else{Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this,arguments)}}})})();Polymer({is:"paper-tab",behaviors:[Polymer.IronControlState,Polymer.IronButtonState,Polymer.PaperRippleBehavior],properties:{link:{type:Boolean,value:false,reflectToAttribute:true}},hostAttributes:{role:"tab"},listeners:{down:"_updateNoink",tap:"_onTap"},attached:function(){this._updateNoink()},get _parentNoink(){var parent=Polymer.dom(this).parentNode;return!!parent&&!!parent.noink},_updateNoink:function(){this.noink=!!this.noink||!!this._parentNoink},_onTap:function(event){if(this.link){var anchor=this.queryEffectiveChildren("a");if(!anchor){return}if(event.target===anchor){return}anchor.click()}}});Polymer.IronMenuBehaviorImpl={properties:{focusedItem:{observer:"_focusedItemChanged",readOnly:true,type:Object},attrForItemTitle:{type:String}},hostAttributes:{role:"menu",tabindex:"0"},observers:["_updateMultiselectable(multi)"],listeners:{focus:"_onFocus",keydown:"_onKeydown","iron-items-changed":"_onIronItemsChanged"},keyBindings:{up:"_onUpKey",down:"_onDownKey",esc:"_onEscKey","shift+tab:keydown":"_onShiftTabDown"},attached:function(){this._resetTabindices()},select:function(value){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}var item=this._valueToItem(value);if(item&&item.hasAttribute("disabled"))return;this._setFocusedItem(item);Polymer.IronMultiSelectableBehaviorImpl.select.apply(this,arguments)},_resetTabindices:function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this.items.forEach(function(item){item.setAttribute("tabindex",item===selectedItem?"0":"-1")},this)},_updateMultiselectable:function(multi){if(multi){this.setAttribute("aria-multiselectable","true")}else{this.removeAttribute("aria-multiselectable")}},_focusWithKeyboardEvent:function(event){for(var i=0,item;item=this.items[i];i++){var attr=this.attrForItemTitle||"textContent";var title=item[attr]||item.getAttribute(attr);if(!item.hasAttribute("disabled")&&title&&title.trim().charAt(0).toLowerCase()===String.fromCharCode(event.keyCode).toLowerCase()){this._setFocusedItem(item);break}}},_focusPrevious:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex-i+length)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_focusNext:function(){var length=this.items.length;var curFocusIndex=Number(this.indexOf(this.focusedItem));for(var i=1;i<length+1;i++){var item=this.items[(curFocusIndex+i)%length];if(!item.hasAttribute("disabled")){var owner=Polymer.dom(item).getOwnerRoot()||document;this._setFocusedItem(item);if(Polymer.dom(owner).activeElement==item){return}}}},_applySelection:function(item,isSelected){if(isSelected){item.setAttribute("aria-selected","true")}else{item.removeAttribute("aria-selected")}Polymer.IronSelectableBehavior._applySelection.apply(this,arguments)},_focusedItemChanged:function(focusedItem,old){old&&old.setAttribute("tabindex","-1");if(focusedItem){focusedItem.setAttribute("tabindex","0");focusedItem.focus()}},_onIronItemsChanged:function(event){if(event.detail.addedNodes.length){this._resetTabindices()}},_onShiftTabDown:function(event){var oldTabIndex=this.getAttribute("tabindex");Polymer.IronMenuBehaviorImpl._shiftTabPressed=true;this._setFocusedItem(null);this.setAttribute("tabindex","-1");this.async(function(){this.setAttribute("tabindex",oldTabIndex);Polymer.IronMenuBehaviorImpl._shiftTabPressed=false},1)},_onFocus:function(event){if(Polymer.IronMenuBehaviorImpl._shiftTabPressed){return}var rootTarget=Polymer.dom(event).rootTarget;if(rootTarget!==this&&typeof rootTarget.tabIndex!=="undefined"&&!this.isLightDescendant(rootTarget)){return}this._defaultFocusAsync=this.async(function(){var selectedItem=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this._setFocusedItem(null);if(selectedItem){this._setFocusedItem(selectedItem)}else if(this.items[0]){this._focusNext()}})},_onUpKey:function(event){this._focusPrevious();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this._focusNext();event.detail.keyboardEvent.preventDefault()},_onEscKey:function(event){this.focusedItem.blur()},_onKeydown:function(event){if(!this.keyboardEventMatchesKeys(event,"up down esc")){this._focusWithKeyboardEvent(event)}event.stopPropagation()},_activateHandler:function(event){Polymer.IronSelectableBehavior._activateHandler.call(this,event);event.stopPropagation()}};Polymer.IronMenuBehaviorImpl._shiftTabPressed=false;Polymer.IronMenuBehavior=[Polymer.IronMultiSelectableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronMenuBehaviorImpl];Polymer.IronMenubarBehaviorImpl={hostAttributes:{role:"menubar"},keyBindings:{left:"_onLeftKey",right:"_onRightKey"},_onUpKey:function(event){this.focusedItem.click();event.detail.keyboardEvent.preventDefault()},_onDownKey:function(event){this.focusedItem.click();event.detail.keyboardEvent.preventDefault()},get _isRTL(){return window.getComputedStyle(this)["direction"]==="rtl"},_onLeftKey:function(event){if(this._isRTL){this._focusNext()}else{this._focusPrevious()}event.detail.keyboardEvent.preventDefault()},_onRightKey:function(event){if(this._isRTL){this._focusPrevious()}else{this._focusNext()}event.detail.keyboardEvent.preventDefault()},_onKeydown:function(event){if(this.keyboardEventMatchesKeys(event,"up down left right esc")){return}this._focusWithKeyboardEvent(event)}};Polymer.IronMenubarBehavior=[Polymer.IronMenuBehavior,Polymer.IronMenubarBehaviorImpl];Polymer({is:"paper-tabs",behaviors:[Polymer.IronResizableBehavior,Polymer.IronMenubarBehavior],properties:{noink:{type:Boolean,value:false,observer:"_noinkChanged"},noBar:{type:Boolean,value:false},noSlide:{type:Boolean,value:false},scrollable:{type:Boolean,value:false},fitContainer:{type:Boolean,value:false},disableDrag:{type:Boolean,value:false},hideScrollButtons:{type:Boolean,value:false},alignBottom:{type:Boolean,value:false},selectable:{type:String,value:"paper-tab"},autoselect:{type:Boolean,value:false},autoselectDelay:{type:Number,value:0},_step:{type:Number,value:10},_holdDelay:{type:Number,value:1},_leftHidden:{type:Boolean,value:false},_rightHidden:{type:Boolean,value:false},_previousTab:{type:Object}},hostAttributes:{role:"tablist"},listeners:{"iron-resize":"_onTabSizingChanged","iron-items-changed":"_onTabSizingChanged","iron-select":"_onIronSelect","iron-deselect":"_onIronDeselect"},keyBindings:{"left:keyup right:keyup":"_onArrowKeyup"},created:function(){this._holdJob=null;this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined;this._bindDelayedActivationHandler=this._delayedActivationHandler.bind(this);this.addEventListener("blur",this._onBlurCapture.bind(this),true)},ready:function(){this.setScrollDirection("y",this.$.tabsContainer)},detached:function(){this._cancelPendingActivation()},_noinkChanged:function(noink){var childTabs=Polymer.dom(this).querySelectorAll("paper-tab");childTabs.forEach(noink?this._setNoinkAttribute:this._removeNoinkAttribute)},_setNoinkAttribute:function(element){element.setAttribute("noink","")},_removeNoinkAttribute:function(element){element.removeAttribute("noink")},_computeScrollButtonClass:function(hideThisButton,scrollable,hideScrollButtons){if(!scrollable||hideScrollButtons){return"hidden"}if(hideThisButton){return"not-visible"}return""},_computeTabsContentClass:function(scrollable,fitContainer){return scrollable?"scrollable"+(fitContainer?" fit-container":""):" fit-container"},_computeSelectionBarClass:function(noBar,alignBottom){if(noBar){return"hidden"}else if(alignBottom){return"align-bottom"}return""},_onTabSizingChanged:function(){this.debounce("_onTabSizingChanged",function(){this._scroll();this._tabChanged(this.selectedItem)},10)},_onIronSelect:function(event){this._tabChanged(event.detail.item,this._previousTab);this._previousTab=event.detail.item;this.cancelDebouncer("tab-changed")},_onIronDeselect:function(event){this.debounce("tab-changed",function(){this._tabChanged(null,this._previousTab);this._previousTab=null},1)},_activateHandler:function(){this._cancelPendingActivation();Polymer.IronMenuBehaviorImpl._activateHandler.apply(this,arguments)},_scheduleActivation:function(item,delay){this._pendingActivationItem=item;this._pendingActivationTimeout=this.async(this._bindDelayedActivationHandler,delay)},_delayedActivationHandler:function(){var item=this._pendingActivationItem;this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined;item.fire(this.activateEvent,null,{bubbles:true,cancelable:true})},_cancelPendingActivation:function(){if(this._pendingActivationTimeout!==undefined){this.cancelAsync(this._pendingActivationTimeout);this._pendingActivationItem=undefined;this._pendingActivationTimeout=undefined}},_onArrowKeyup:function(event){if(this.autoselect){this._scheduleActivation(this.focusedItem,this.autoselectDelay)}},_onBlurCapture:function(event){if(event.target===this._pendingActivationItem){this._cancelPendingActivation()}},get _tabContainerScrollSize(){return Math.max(0,this.$.tabsContainer.scrollWidth-this.$.tabsContainer.offsetWidth)},_scroll:function(e,detail){if(!this.scrollable){return}var ddx=detail&&-detail.ddx||0;this._affectScroll(ddx)},_down:function(e){this.async(function(){if(this._defaultFocusAsync){this.cancelAsync(this._defaultFocusAsync);this._defaultFocusAsync=null}},1)},_affectScroll:function(dx){this.$.tabsContainer.scrollLeft+=dx;var scrollLeft=this.$.tabsContainer.scrollLeft;this._leftHidden=scrollLeft===0;this._rightHidden=scrollLeft===this._tabContainerScrollSize},_onLeftScrollButtonDown:function(){this._scrollToLeft();this._holdJob=setInterval(this._scrollToLeft.bind(this),this._holdDelay)},_onRightScrollButtonDown:function(){this._scrollToRight();this._holdJob=setInterval(this._scrollToRight.bind(this),this._holdDelay)},_onScrollButtonUp:function(){clearInterval(this._holdJob);this._holdJob=null},_scrollToLeft:function(){this._affectScroll(-this._step)},_scrollToRight:function(){this._affectScroll(this._step)},_tabChanged:function(tab,old){if(!tab){this.$.selectionBar.classList.remove("expand");this.$.selectionBar.classList.remove("contract");this._positionBar(0,0);return}var r=this.$.tabsContent.getBoundingClientRect();var w=r.width;var tabRect=tab.getBoundingClientRect();var tabOffsetLeft=tabRect.left-r.left;this._pos={width:this._calcPercent(tabRect.width,w),left:this._calcPercent(tabOffsetLeft,w)};if(this.noSlide||old==null){this.$.selectionBar.classList.remove("expand");this.$.selectionBar.classList.remove("contract");this._positionBar(this._pos.width,this._pos.left);return}var oldRect=old.getBoundingClientRect();var oldIndex=this.items.indexOf(old);var index=this.items.indexOf(tab);var m=5;this.$.selectionBar.classList.add("expand");var moveRight=oldIndex<index;var isRTL=this._isRTL;if(isRTL){moveRight=!moveRight}if(moveRight){this._positionBar(this._calcPercent(tabRect.left+tabRect.width-oldRect.left,w)-m,this._left)}else{this._positionBar(this._calcPercent(oldRect.left+oldRect.width-tabRect.left,w)-m,this._calcPercent(tabOffsetLeft,w)+m)}if(this.scrollable){this._scrollToSelectedIfNeeded(tabRect.width,tabOffsetLeft)}},_scrollToSelectedIfNeeded:function(tabWidth,tabOffsetLeft){var l=tabOffsetLeft-this.$.tabsContainer.scrollLeft;if(l<0){this.$.tabsContainer.scrollLeft+=l}else{l+=tabWidth-this.$.tabsContainer.offsetWidth;if(l>0){this.$.tabsContainer.scrollLeft+=l}}},_calcPercent:function(w,w0){return 100*w/w0},_positionBar:function(width,left){width=width||0;left=left||0;this._width=width;this._left=left;this.transform("translateX("+left+"%) scaleX("+width/100+")",this.$.selectionBar)},_onBarTransitionEnd:function(e){var cl=this.$.selectionBar.classList;if(cl.contains("expand")){cl.remove("expand");cl.add("contract");this._positionBar(this._pos.width,this._pos.left)}else if(cl.contains("contract")){cl.remove("contract")}}}); \ No newline at end of file
diff --git a/chrome/browser/resources/md_history/lazy_load.vulcanized.html b/chrome/browser/resources/md_history/lazy_load.vulcanized.html index b04a2b4..409f6e1 100644 --- a/chrome/browser/resources/md_history/lazy_load.vulcanized.html +++ b/chrome/browser/resources/md_history/lazy_load.vulcanized.html
@@ -413,7 +413,6 @@ paper-ripple { opacity: 0.6; color: currentColor; - ; } </style>
diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc index 63d7d7c4..3539f71b 100644 --- a/chrome/browser/signin/chrome_signin_client.cc +++ b/chrome/browser/signin/chrome_signin_client.cc
@@ -75,7 +75,8 @@ signin_error_controller_(signin_error_controller), is_force_signin_enabled_(IsForceSigninEnabled()), request_context_pointer_(nullptr), - number_of_request_context_pointer_changes_(0) { + number_of_request_context_pointer_changes_(0), + weak_factory_(this) { signin_error_controller_->AddObserver(this); #if !defined(OS_CHROMEOS) net::NetworkChangeNotifier::AddNetworkChangeObserver(this); @@ -210,7 +211,7 @@ base::Bind(&net::URLRequestContextGetter::GetURLRequestContext, scoped_getter), base::Bind(&ChromeSigninClient::RequestContextPointerReply, - base::Unretained(this))); + weak_factory_.GetWeakPtr())); return getter; }
diff --git a/chrome/browser/signin/chrome_signin_client.h b/chrome/browser/signin/chrome_signin_client.h index 62c6c40..37caf42d 100644 --- a/chrome/browser/signin/chrome_signin_client.h +++ b/chrome/browser/signin/chrome_signin_client.h
@@ -7,6 +7,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "build/build_config.h" #include "components/signin/core/browser/signin_client.h" #include "components/signin/core/browser/signin_error_controller.h" @@ -132,6 +133,8 @@ void* request_context_pointer_; int number_of_request_context_pointer_changes_; + base::WeakPtrFactory<ChromeSigninClient> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(ChromeSigninClient); };
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index c6c0c1bf..c8e77bc4 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -9191.0.0 \ No newline at end of file +9194.0.0 \ No newline at end of file
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc index 0d10365..ce87c93 100644 --- a/content/browser/loader/mojo_async_resource_handler.cc +++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -5,6 +5,7 @@ #include "content/browser/loader/mojo_async_resource_handler.h" #include <utility> +#include <vector> #include "base/command_line.h" #include "base/containers/hash_tables.h" @@ -181,6 +182,14 @@ url_loader_client_->OnReceiveResponse(response->head, std::move(downloaded_file_ptr)); + + net::IOBufferWithSize* metadata = GetResponseMetadata(request()); + if (metadata) { + const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data()); + + url_loader_client_->OnReceiveCachedMetadata( + std::vector<uint8_t>(data, data + metadata->size())); + } return true; } @@ -323,6 +332,11 @@ return mojo::EndWriteDataRaw(shared_writer_->writer(), written); } +net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata( + net::URLRequest* request) { + return request->response_info().metadata.get(); +} + void MojoAsyncResourceHandler::OnResponseCompleted( const net::URLRequestStatus& status, bool* defer) {
diff --git a/content/browser/loader/mojo_async_resource_handler.h b/content/browser/loader/mojo_async_resource_handler.h index 894ff84..ebb38b2f 100644 --- a/content/browser/loader/mojo_async_resource_handler.h +++ b/content/browser/loader/mojo_async_resource_handler.h
@@ -23,6 +23,7 @@ #include "url/gurl.h" namespace net { +class IOBufferWithSize; class URLRequest; } @@ -74,6 +75,7 @@ // These functions can be overriden only for tests. virtual MojoResult BeginWrite(void** data, uint32_t* available); virtual MojoResult EndWrite(uint32_t written); + virtual net::IOBufferWithSize* GetResponseMetadata(net::URLRequest* request); private: class SharedWriter;
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc index d52679c3..fa69c8d3 100644 --- a/content/browser/loader/mojo_async_resource_handler_unittest.cc +++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
@@ -7,6 +7,7 @@ #include <string.h> #include <utility> +#include <vector> #include "base/bind.h" #include "base/callback.h" @@ -174,10 +175,10 @@ DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); }; -class MojoAsyncResourceHandlerWithCustomDataPipeOperations +class MojoAsyncResourceHandlerWithStubOperations : public MojoAsyncResourceHandler { public: - MojoAsyncResourceHandlerWithCustomDataPipeOperations( + MojoAsyncResourceHandlerWithStubOperations( net::URLRequest* request, ResourceDispatcherHostImpl* rdh, mojom::URLLoaderAssociatedRequest mojo_request, @@ -186,7 +187,7 @@ rdh, std::move(mojo_request), std::move(url_loader_client)) {} - ~MojoAsyncResourceHandlerWithCustomDataPipeOperations() override {} + ~MojoAsyncResourceHandlerWithStubOperations() override {} void ResetBeginWriteExpectation() { is_begin_write_expectation_set_ = false; } @@ -199,6 +200,9 @@ end_write_expectation_ = end_write_expectation; } bool has_received_bad_message() const { return has_received_bad_message_; } + void SetMetadata(scoped_refptr<net::IOBufferWithSize> metadata) { + metadata_ = std::move(metadata); + } private: MojoResult BeginWrite(void** data, uint32_t* available) override { @@ -211,6 +215,11 @@ return end_write_expectation_; return MojoAsyncResourceHandler::EndWrite(written); } + net::IOBufferWithSize* GetResponseMetadata( + net::URLRequest* request) override { + return metadata_.get(); + } + void ReportBadMessage(const std::string& error) override { has_received_bad_message_ = true; } @@ -220,9 +229,9 @@ bool has_received_bad_message_ = false; MojoResult begin_write_expectation_ = MOJO_RESULT_UNKNOWN; MojoResult end_write_expectation_ = MOJO_RESULT_UNKNOWN; + scoped_refptr<net::IOBufferWithSize> metadata_; - DISALLOW_COPY_AND_ASSIGN( - MojoAsyncResourceHandlerWithCustomDataPipeOperations); + DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerWithStubOperations); }; class TestURLLoaderFactory final : public mojom::URLLoaderFactory { @@ -308,7 +317,7 @@ mojom::URLLoaderClientAssociatedPtr client_ptr; client_ptr.Bind(factory_impl->PassClientPtrInfo()); - handler_.reset(new MojoAsyncResourceHandlerWithCustomDataPipeOperations( + handler_.reset(new MojoAsyncResourceHandlerWithStubOperations( request_.get(), &rdh_, factory_impl->PassLoaderRequest(), std::move(client_ptr))); mock_loader_.reset(new MockResourceLoader(handler_.get())); @@ -352,8 +361,7 @@ std::unique_ptr<TestBrowserContext> browser_context_; net::TestDelegate url_request_delegate_; std::unique_ptr<net::URLRequest> request_; - std::unique_ptr<MojoAsyncResourceHandlerWithCustomDataPipeOperations> - handler_; + std::unique_ptr<MojoAsyncResourceHandlerWithStubOperations> handler_; std::unique_ptr<MockResourceLoader> mock_loader_; DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerTestBase); @@ -386,6 +394,10 @@ TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { rdh_delegate_.set_num_on_response_started_calls_expectation(1); + scoped_refptr<net::IOBufferWithSize> metadata = new net::IOBufferWithSize(5); + memcpy(metadata->data(), "hello", 5); + handler_->SetMetadata(metadata); + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillStart(request_->url())); @@ -413,6 +425,9 @@ EXPECT_EQ(response->head.response_start, url_loader_client_.response_head().response_start); EXPECT_EQ(99, url_loader_client_.response_head().content_length); + + url_loader_client_.RunUntilCachedMetadataReceived(); + EXPECT_EQ("hello", url_loader_client_.cached_metadata()); } TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) {
diff --git a/content/browser/loader/test_url_loader_client.cc b/content/browser/loader/test_url_loader_client.cc index d87ee13..2ab8959 100644 --- a/content/browser/loader/test_url_loader_client.cc +++ b/content/browser/loader/test_url_loader_client.cc
@@ -45,6 +45,18 @@ quit_closure_for_on_data_downloaded_.Run(); } +void TestURLLoaderClient::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) { + EXPECT_FALSE(has_received_cached_metadata_); + EXPECT_TRUE(has_received_response_); + EXPECT_FALSE(has_received_completion_); + has_received_cached_metadata_ = true; + cached_metadata_ = + std::string(reinterpret_cast<const char*>(data.data()), data.size()); + if (quit_closure_for_on_receive_cached_metadata_) + quit_closure_for_on_receive_cached_metadata_.Run(); +} + void TestURLLoaderClient::OnTransferSizeUpdated(int32_t transfer_size_diff) { EXPECT_GT(transfer_size_diff, 0); body_transfer_size_ += transfer_size_diff; @@ -83,6 +95,8 @@ } void TestURLLoaderClient::RunUntilResponseReceived() { + if (has_received_response_) + return; base::RunLoop run_loop; quit_closure_for_on_receive_response_ = run_loop.QuitClosure(); run_loop.Run(); @@ -90,6 +104,8 @@ } void TestURLLoaderClient::RunUntilRedirectReceived() { + if (has_received_redirect_) + return; base::RunLoop run_loop; quit_closure_for_on_receive_redirect_ = run_loop.QuitClosure(); run_loop.Run(); @@ -97,12 +113,23 @@ } void TestURLLoaderClient::RunUntilDataDownloaded() { + if (has_data_downloaded_) + return; base::RunLoop run_loop; quit_closure_for_on_data_downloaded_ = run_loop.QuitClosure(); run_loop.Run(); quit_closure_for_on_data_downloaded_.Reset(); } +void TestURLLoaderClient::RunUntilCachedMetadataReceived() { + if (has_received_cached_metadata_) + return; + base::RunLoop run_loop; + quit_closure_for_on_receive_cached_metadata_ = run_loop.QuitClosure(); + run_loop.Run(); + quit_closure_for_on_receive_cached_metadata_.Reset(); +} + void TestURLLoaderClient::RunUntilResponseBodyArrived() { if (response_body_.is_valid()) return;
diff --git a/content/browser/loader/test_url_loader_client.h b/content/browser/loader/test_url_loader_client.h index 8776f44..b7d5ce4 100644 --- a/content/browser/loader/test_url_loader_client.h +++ b/content/browser/loader/test_url_loader_client.h
@@ -6,6 +6,7 @@ #define CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_ #include <stdint.h> +#include <vector> #include "base/callback.h" #include "base/macros.h" @@ -33,6 +34,7 @@ void OnReceiveRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseHead& response_head) override; void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override; + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; void OnTransferSizeUpdated(int32_t transfer_size_diff) override; void OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle body) override; @@ -41,9 +43,15 @@ bool has_received_response() const { return has_received_response_; } bool has_received_redirect() const { return has_received_redirect_; } bool has_data_downloaded() const { return has_data_downloaded_; } + bool has_received_cached_metadata() const { + return has_received_cached_metadata_; + } bool has_received_completion() const { return has_received_completion_; } const ResourceResponseHead& response_head() const { return response_head_; } const net::RedirectInfo& redirect_info() const { return redirect_info_; } + const std::string& cached_metadata() const { + return cached_metadata_; + } mojo::DataPipeConsumerHandle response_body() { return response_body_.get(); } const ResourceRequestCompletionStatus& completion_status() const { return completion_status_; @@ -66,6 +74,7 @@ void RunUntilResponseReceived(); void RunUntilRedirectReceived(); void RunUntilDataDownloaded(); + void RunUntilCachedMetadataReceived(); void RunUntilResponseBodyArrived(); void RunUntilComplete(); @@ -73,15 +82,18 @@ mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; ResourceResponseHead response_head_; net::RedirectInfo redirect_info_; + std::string cached_metadata_; mojo::ScopedDataPipeConsumerHandle response_body_; ResourceRequestCompletionStatus completion_status_; bool has_received_response_ = false; bool has_received_redirect_ = false; bool has_data_downloaded_ = false; + bool has_received_cached_metadata_ = false; bool has_received_completion_ = false; base::Closure quit_closure_for_on_receive_response_; base::Closure quit_closure_for_on_receive_redirect_; base::Closure quit_closure_for_on_data_downloaded_; + base::Closure quit_closure_for_on_receive_cached_metadata_; base::Closure quit_closure_for_on_start_loading_response_body_; base::Closure quit_closure_for_on_complete_; mojom::URLLoaderFactoryPtr url_loader_factory_;
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc index 6c712a3..7416f176 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -80,6 +80,9 @@ void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override { client_->OnDataDownloaded(data_length, encoded_length); } + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { + client_->OnReceiveCachedMetadata(data); + } void OnTransferSizeUpdated(int32_t transfer_size_diff) override { client_->OnTransferSizeUpdated(transfer_size_diff); }
diff --git a/content/child/test_request_peer.cc b/content/child/test_request_peer.cc index 47add960..17f27ad 100644 --- a/content/child/test_request_peer.cc +++ b/content/child/test_request_peer.cc
@@ -72,6 +72,14 @@ dispatcher_->SetDefersLoading(context_->request_id, true); } +void TestRequestPeer::OnReceivedCachedMetadata(const char* data, int len) { + EXPECT_TRUE(context_->received_response); + EXPECT_FALSE(context_->complete); + if (context_->cancelled) + return; + context_->cached_metadata = std::vector<char>(data, data + len); +} + void TestRequestPeer::OnCompletedRequest(int error_code, bool was_ignored_by_handler, bool stale_copy_in_cache,
diff --git a/content/child/test_request_peer.h b/content/child/test_request_peer.h index e076b0d..fa2d59d 100644 --- a/content/child/test_request_peer.h +++ b/content/child/test_request_peer.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include <memory> #include <string> +#include <vector> #include "base/time/time.h" #include "content/public/child/request_peer.h" @@ -36,6 +37,7 @@ void OnDownloadedData(int len, int encoded_data_length) override; void OnReceivedData(std::unique_ptr<ReceivedData> data) override; void OnTransferSizeUpdated(int transfer_size_diff) override; + void OnReceivedCachedMetadata(const char* data, int len) override; void OnCompletedRequest(int error_code, bool was_ignored_by_handler, bool stale_copy_in_cache, @@ -59,6 +61,7 @@ bool cancel_on_receive_data = false; bool received_response = false; + std::vector<char> cached_metadata; // Data received. If downloading to file, remains empty. std::string data;
diff --git a/content/child/url_loader_client_impl.cc b/content/child/url_loader_client_impl.cc index 04aee61..59d2962 100644 --- a/content/child/url_loader_client_impl.cc +++ b/content/child/url_loader_client_impl.cc
@@ -134,6 +134,13 @@ Dispatch(ResourceMsg_DataDownloaded(request_id_, data_len, encoded_data_len)); } +void URLLoaderClientImpl::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) { + const char* data_ptr = reinterpret_cast<const char*>(data.data()); + Dispatch(ResourceMsg_ReceivedCachedMetadata( + request_id_, std::vector<char>(data_ptr, data_ptr + data.size()))); +} + void URLLoaderClientImpl::OnTransferSizeUpdated(int32_t transfer_size_diff) { if (is_deferred_) { accumulated_transfer_size_diff_during_deferred_ += transfer_size_diff;
diff --git a/content/child/url_loader_client_impl.h b/content/child/url_loader_client_impl.h index ada64af..4366828 100644 --- a/content/child/url_loader_client_impl.h +++ b/content/child/url_loader_client_impl.h
@@ -60,6 +60,7 @@ void OnReceiveRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseHead& response_head) override; void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override; + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; void OnTransferSizeUpdated(int32_t transfer_size_diff) override; void OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle body) override;
diff --git a/content/child/url_loader_client_impl_unittest.cc b/content/child/url_loader_client_impl_unittest.cc index a26febf..8b5d6ae5 100644 --- a/content/child/url_loader_client_impl_unittest.cc +++ b/content/child/url_loader_client_impl_unittest.cc
@@ -4,6 +4,7 @@ #include "content/child/url_loader_client_impl.h" +#include <vector> #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" @@ -173,6 +174,22 @@ EXPECT_EQ(14, request_peer_context_.total_encoded_data_length); } +TEST_F(URLLoaderClientImplTest, OnReceiveCachedMetadata) { + ResourceResponseHead response_head; + std::vector<uint8_t> metadata; + metadata.push_back('a'); + + url_loader_client_->OnReceiveResponse(response_head, nullptr); + url_loader_client_->OnReceiveCachedMetadata(metadata); + + EXPECT_FALSE(request_peer_context_.received_response); + EXPECT_TRUE(request_peer_context_.cached_metadata.empty()); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(request_peer_context_.received_response); + ASSERT_EQ(1u, request_peer_context_.cached_metadata.size()); + EXPECT_EQ('a', request_peer_context_.cached_metadata[0]); +} + TEST_F(URLLoaderClientImplTest, OnTransferSizeUpdated) { ResourceResponseHead response_head;
diff --git a/content/common/url_loader.mojom b/content/common/url_loader.mojom index c0e63c87..b801e0f 100644 --- a/content/common/url_loader.mojom +++ b/content/common/url_loader.mojom
@@ -48,6 +48,9 @@ // instead. OnDataDownloaded(int64 data_length, int64 encoded_length); + // Called when cached metadata from a resource request is ready. + OnReceiveCachedMetadata(array<uint8> data); + // Called when the transfer size is updated. This is only called if // |report_raw_headers| is set and |download_to_file| is unset in the request. // The transfer size is the length of the response (including both headers
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index 0ec4bb1b..533230c9 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -308,6 +308,8 @@ NOTREACHED(); } + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} + void OnTransferSizeUpdated(int32_t transfer_size_diff) override { NOTREACHED(); }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/047-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/047-expected.txt deleted file mode 100644 index b2e1f87..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/047-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -Filler Text -This is a testharness.js-based test. -PASS document.write -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/048-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/048-expected.txt deleted file mode 100644 index b2e1f87..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/dynamic-markup-insertion/document-write/048-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -Filler Text -This is a testharness.js-based test. -PASS document.write -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/testharnessreport.js b/third_party/WebKit/LayoutTests/external/wpt/resources/testharnessreport.js index ef9f019..ec8af45 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/testharnessreport.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/testharnessreport.js
@@ -76,18 +76,6 @@ return text; } - // If the test has a meta tag named flags and the content contains "dom", - // then it's a CSSWG test. - function isCSSWGTest() { - var flags = document.querySelector('meta[name=flags]'), - content = flags ? flags.getAttribute('content') : null; - return content && content.match(/\bdom\b/); - } - - function isJSTest() { - return !!document.querySelector('script[src*="/resources/testharness"]'); - } - function isWPTManualTest() { var path = location.pathname; if (location.hostname == 'web-platform.test' && path.endsWith('-manual.html')) @@ -219,12 +207,10 @@ // test. testRunner.setDumpConsoleMessages(false); - if (isCSSWGTest() || isJSTest()) { - // Anything isn't material to the testrunner output, so - // should be hidden from the text dump. - if (output_document.body && output_document.body.tagName == 'BODY') - output_document.body.textContent = ''; - } + // Anything isn't material to the testrunner output, so should + // be hidden from the text dump. + if (output_document.body && output_document.body.tagName == 'BODY') + output_document.body.textContent = ''; } // Add results element to output_document.
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/resources/thorough-util.js b/third_party/WebKit/LayoutTests/http/tests/fetch/resources/thorough-util.js index 9430393..699fcf0 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/resources/thorough-util.js +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/resources/thorough-util.js
@@ -319,6 +319,12 @@ ['X-ServiceWorker-s', 'test1'], ['X-ServiceWorker-Test', 'test3'], ['X-ServiceWorker-U', 'test5']]; + } else if (params['headers'] === 'SAFE') { + init['headers'] = [['Accept', '*/*'], + ['Accept-Language', 'en-us,de'], + ['Content-Language', 'en-us'], + ['Content-Type', 'text/plain'], + ['Save-data', 'on']]; } else if (params['headers'] === '{}') { init['headers'] = {}; }
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/cors-preflight2.js b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/cors-preflight2.js index 675cd6b..3fdafc3 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/cors-preflight2.js +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/cors-preflight2.js
@@ -167,6 +167,15 @@ '&PACRHeaders=x-serviceworker-test&PreflightTest=200', [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors], [checkMethod, hasCustomHeader]], + + // Verify that Access-Control-Request-Headers: is not present in preflight + // if its value is the empty list - https://crbug.com/633729 + [OTHER_BASE_URL + 'mode=cors&credentials=same-origin&method=' + method + + '&headers=SAFE&ACAOrigin=*&PACAOrigin=*&PACAMethods=' + method + + '&PACRHeaders=missing&PACRMethod=' + method + '&PreflightTest=200', + [fetchResolved, noContentLength, noServerHeader, hasBody, typeCors], + [checkMethod]], + // Test Access-Control-Request-Headers is sorted https://crbug.com/452391 [OTHER_BASE_URL + 'mode=cors&credentials=same-origin&method=' + method + '&headers=CUSTOM2&ACAOrigin=*&PACAOrigin=*&PACAMethods=' + method +
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/fetch-access-control.php b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/fetch-access-control.php index 4ff7b75..758a2e6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/fetch-access-control.php +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/fetch-access-control.php
@@ -8,6 +8,8 @@ // - Use $_GET['PreflightTest'] as HTTP status code. // - Check Access-Control-Request-Method/Headers headers with // PACRMethod/Headers parameter, if set, in preflight. +// The special value 'missing' for PACRHeaders can be used to +// test for the absence of ACRHeaders on the preflight request. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS' && isset($_GET['PreflightTest'])) { $prefix = 'P'; @@ -17,11 +19,17 @@ header("HTTP/1.1 400"); exit; } - if (isset($_GET['PACRHeaders']) && - $_GET['PACRHeaders'] != - $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']) { - header("HTTP/1.1 400"); - exit; + if (isset($_GET['PACRHeaders'])) { + if ($_GET['PACRHeaders'] == 'missing') { + if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) { + header("HTTP/1.1 400"); + exit; + } + } else if ($_GET['PACRHeaders'] != + $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']) { + header("HTTP/1.1 400"); + exit; + } } // Preflight must not include Cookie headers. if (isset($_SERVER['HTTP_COOKIE'])) { @@ -109,4 +117,4 @@ 'cookie' => $cookie); $json = json_encode($arr); echo "report( $json );"; -?> \ No newline at end of file +?>
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/destroy-context-in-onloadstart.html b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/destroy-context-in-onloadstart.html new file mode 100644 index 0000000..54c7f32 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/destroy-context-in-onloadstart.html
@@ -0,0 +1,21 @@ +<!doctype html> +<html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<iframe id="iframe" src="resources/test.html"></iframe> +<script> +async_test(t => { + const iframe = document.querySelector('#iframe'); + iframe.onload = t.step_func(() => { + const contentWindow = iframe.contentWindow; + const xhr = new contentWindow.XMLHttpRequest(); + xhr.open('GET', 'resources/slow-failure.cgi'); + xhr.onloadstart = () => { + iframe.parentNode.remove(iframe); + }; + assert_throws('NetworkError', () => xhr.send()); + t.done(); + }); +}, 'Detach iframe in onloadstart callback.'); +</script> +</html>
diff --git a/third_party/WebKit/LayoutTests/resources/testharnessreport.js b/third_party/WebKit/LayoutTests/resources/testharnessreport.js index ef9f019..ec8af45 100644 --- a/third_party/WebKit/LayoutTests/resources/testharnessreport.js +++ b/third_party/WebKit/LayoutTests/resources/testharnessreport.js
@@ -76,18 +76,6 @@ return text; } - // If the test has a meta tag named flags and the content contains "dom", - // then it's a CSSWG test. - function isCSSWGTest() { - var flags = document.querySelector('meta[name=flags]'), - content = flags ? flags.getAttribute('content') : null; - return content && content.match(/\bdom\b/); - } - - function isJSTest() { - return !!document.querySelector('script[src*="/resources/testharness"]'); - } - function isWPTManualTest() { var path = location.pathname; if (location.hostname == 'web-platform.test' && path.endsWith('-manual.html')) @@ -219,12 +207,10 @@ // test. testRunner.setDumpConsoleMessages(false); - if (isCSSWGTest() || isJSTest()) { - // Anything isn't material to the testrunner output, so - // should be hidden from the text dump. - if (output_document.body && output_document.body.tagName == 'BODY') - output_document.body.textContent = ''; - } + // Anything isn't material to the testrunner output, so should + // be hidden from the text dump. + if (output_document.body && output_document.body.tagName == 'BODY') + output_document.body.textContent = ''; } // Add results element to output_document.
diff --git a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp index ae873c5..b8e0369 100644 --- a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
@@ -41,6 +41,7 @@ #include "bindings/core/v8/V8Initializer.h" #include "bindings/core/v8/V8PrivateProperty.h" #include "bindings/core/v8/V8Window.h" +#include "core/dom/Modulator.h" #include "core/frame/LocalFrame.h" #include "core/frame/csp/ContentSecurityPolicy.h" #include "core/html/DocumentNameCollection.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.cpp b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.cpp index 8b8b7f8c..2f2ff39 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.cpp
@@ -34,6 +34,7 @@ #include "bindings/core/v8/ScriptState.h" #include "bindings/core/v8/V8Binding.h" #include "bindings/core/v8/V8ObjectConstructor.h" +#include "core/dom/Modulator.h" #include "platform/InstanceCounters.h" #include "wtf/PtrUtil.h" #include "wtf/StringExtras.h" @@ -48,7 +49,7 @@ m_constructorMap(m_isolate), m_contextHolder(WTF::makeUnique<gin::ContextHolder>(m_isolate)), m_context(m_isolate, context), - m_activityLogger(0) { + m_activityLogger(nullptr) { m_contextHolder->SetContext(context); v8::Context::Scope contextScope(context); @@ -174,4 +175,14 @@ m_customElementBindings.push_back(std::move(binding)); } +void V8PerContextData::setModulator(Modulator* modulator) { + DCHECK(!m_modulator); + DCHECK(modulator); + m_modulator = modulator; +} + +void V8PerContextData::clearModulator() { + m_modulator = nullptr; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h index 86e43650..dd345df 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h
@@ -48,6 +48,7 @@ namespace blink { +class Modulator; class V8DOMActivityLogger; class V8PerContextData; @@ -93,6 +94,10 @@ m_activityLogger = activityLogger; } + Modulator* modulator() const { return m_modulator.get(); } + void setModulator(Modulator*); + void clearModulator(); + private: V8PerContextData(v8::Local<v8::Context>); @@ -122,6 +127,8 @@ // This is owned by a static hash map in V8DOMActivityLogger. V8DOMActivityLogger* m_activityLogger; + + Persistent<Modulator> m_modulator; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn index d0e6dd3..48183ef2 100644 --- a/third_party/WebKit/Source/core/dom/BUILD.gn +++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -179,6 +179,8 @@ "MessageChannel.cpp", "MessageChannel.h", "MessagePort.cpp", + "Modulator.cpp", + "Modulator.h", "MutationCallback.h", "MutationObserver.cpp", "MutationObserver.h",
diff --git a/third_party/WebKit/Source/core/dom/Modulator.cpp b/third_party/WebKit/Source/core/dom/Modulator.cpp new file mode 100644 index 0000000..c523d83 --- /dev/null +++ b/third_party/WebKit/Source/core/dom/Modulator.cpp
@@ -0,0 +1,19 @@ +// Copyright 2017 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. + +#include "core/dom/Modulator.h" + +#include "bindings/core/v8/ScriptState.h" + +namespace blink { + +Modulator* Modulator::from(LocalFrame* frame) { + ScriptState* scriptState = ScriptState::forMainWorld(frame); + if (!scriptState) + return nullptr; + // TODO(kouhei): setModulator in V8PerContextData when we land ModulatorImpl. + return scriptState->perContextData()->modulator(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Modulator.h b/third_party/WebKit/Source/core/dom/Modulator.h new file mode 100644 index 0000000..1abe03e --- /dev/null +++ b/third_party/WebKit/Source/core/dom/Modulator.h
@@ -0,0 +1,27 @@ +// Copyright 2017 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. + +#ifndef Modulator_h +#define Modulator_h + +#include "core/CoreExport.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class LocalFrame; + +// A Modulator is an interface for "environment settings object" concept for +// module scripts. +// https://html.spec.whatwg.org/#environment-settings-object +// +// A Modulator also serves as an entry point for various module spec algorithms. +class CORE_EXPORT Modulator : public GarbageCollectedMixin { + public: + static Modulator* from(LocalFrame*); +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn index f3906a5..b236f57 100644 --- a/third_party/WebKit/Source/core/editing/BUILD.gn +++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -136,6 +136,7 @@ "commands/TypingCommand.h", "commands/UndoStack.cpp", "commands/UndoStack.h", + "commands/UndoStep.cpp", "commands/UndoStep.h", "commands/UnlinkCommand.cpp", "commands/UnlinkCommand.h",
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp index 0974f556..d5cbfa2 100644 --- a/third_party/WebKit/Source/core/editing/Editor.cpp +++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -836,7 +836,7 @@ // Request spell checking before any further DOM change. spellChecker().markMisspellingsAfterApplyingCommand(*cmd); - EditCommandComposition* composition = cmd->composition(); + UndoStep* composition = cmd->composition(); DCHECK(composition); dispatchEditableContentChangedEvents( composition->startingRootEditableElement(), @@ -894,7 +894,7 @@ return correctedSelection; } -void Editor::unappliedEditing(EditCommandComposition* cmd) { +void Editor::unappliedEditing(UndoStep* cmd) { EventQueueScope scope; dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(), @@ -924,7 +924,7 @@ respondToChangedContents(newSelection); } -void Editor::reappliedEditing(EditCommandComposition* cmd) { +void Editor::reappliedEditing(UndoStep* cmd) { EventQueueScope scope; dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(),
diff --git a/third_party/WebKit/Source/core/editing/Editor.h b/third_party/WebKit/Source/core/editing/Editor.h index e34b28d..a8fd72f 100644 --- a/third_party/WebKit/Source/core/editing/Editor.h +++ b/third_party/WebKit/Source/core/editing/Editor.h
@@ -45,7 +45,6 @@ class CompositeEditCommand; class DragData; -class EditCommandComposition; class EditorClient; class EditorInternalCommand; class LocalFrame; @@ -56,6 +55,7 @@ class StylePropertySet; class TextEvent; class UndoStack; +class UndoStep; enum class EditCommandSource; enum class DeleteDirection; @@ -131,8 +131,8 @@ void applyParagraphStyleToSelection(StylePropertySet*, InputEvent::InputType); void appliedEditing(CompositeEditCommand*); - void unappliedEditing(EditCommandComposition*); - void reappliedEditing(EditCommandComposition*); + void unappliedEditing(UndoStep*); + void reappliedEditing(UndoStep*); void setShouldStyleWithCSS(bool flag) { m_shouldStyleWithCSS = flag; } bool shouldStyleWithCSS() const { return m_shouldStyleWithCSS; }
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp index 1774c34..ce3d8711 100644 --- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
@@ -79,107 +79,6 @@ using namespace HTMLNames; -EditCommandComposition* EditCommandComposition::create( - Document* document, - const VisibleSelection& startingSelection, - const VisibleSelection& endingSelection, - InputEvent::InputType inputType) { - return new EditCommandComposition(document, startingSelection, - endingSelection, inputType); -} - -EditCommandComposition::EditCommandComposition( - Document* document, - const VisibleSelection& startingSelection, - const VisibleSelection& endingSelection, - InputEvent::InputType inputType) - : m_document(document), - m_startingSelection(startingSelection), - m_endingSelection(endingSelection), - m_startingRootEditableElement(startingSelection.rootEditableElement()), - m_endingRootEditableElement(endingSelection.rootEditableElement()), - m_inputType(inputType) {} - -bool EditCommandComposition::belongsTo(const LocalFrame& frame) const { - DCHECK(m_document); - return m_document->frame() == &frame; -} - -void EditCommandComposition::unapply() { - DCHECK(m_document); - LocalFrame* frame = m_document->frame(); - DCHECK(frame); - - // Changes to the document may have been made since the last editing operation - // that require a layout, as in <rdar://problem/5658603>. Low level - // operations, like RemoveNodeCommand, don't require a layout because the high - // level operations that use them perform one if one is necessary (like for - // the creation of VisiblePositions). - m_document->updateStyleAndLayoutIgnorePendingStylesheets(); - - { - size_t size = m_commands.size(); - for (size_t i = size; i; --i) - m_commands[i - 1]->doUnapply(); - } - - frame->editor().unappliedEditing(this); -} - -void EditCommandComposition::reapply() { - DCHECK(m_document); - LocalFrame* frame = m_document->frame(); - DCHECK(frame); - - // Changes to the document may have been made since the last editing operation - // that require a layout, as in <rdar://problem/5658603>. Low level - // operations, like RemoveNodeCommand, don't require a layout because the high - // level operations that use them perform one if one is necessary (like for - // the creation of VisiblePositions). - m_document->updateStyleAndLayoutIgnorePendingStylesheets(); - - { - for (const auto& command : m_commands) - command->doReapply(); - } - - frame->editor().reappliedEditing(this); -} - -InputEvent::InputType EditCommandComposition::inputType() const { - return m_inputType; -} - -void EditCommandComposition::append(SimpleEditCommand* command) { - m_commands.push_back(command); -} - -void EditCommandComposition::append(EditCommandComposition* composition) { - m_commands.appendVector(composition->m_commands); -} - -void EditCommandComposition::setStartingSelection( - const VisibleSelection& selection) { - m_startingSelection = selection; - m_startingRootEditableElement = selection.rootEditableElement(); -} - -void EditCommandComposition::setEndingSelection( - const VisibleSelection& selection) { - m_endingSelection = selection; - m_endingRootEditableElement = selection.rootEditableElement(); -} - -DEFINE_TRACE(EditCommandComposition) { - visitor->trace(m_document); - visitor->trace(m_startingSelection); - visitor->trace(m_endingSelection); - visitor->trace(m_commands); - visitor->trace(m_startingRootEditableElement); - visitor->trace(m_endingRootEditableElement); - UndoStep::trace(visitor); -} - CompositeEditCommand::CompositeEditCommand(Document& document) : EditCommand(document) {} @@ -239,13 +138,14 @@ return !editingState.isAborted(); } -EditCommandComposition* CompositeEditCommand::ensureComposition() { +UndoStep* CompositeEditCommand::ensureComposition() { CompositeEditCommand* command = this; while (command && command->parent()) command = command->parent(); - if (!command->m_composition) - command->m_composition = EditCommandComposition::create( - &document(), startingSelection(), endingSelection(), inputType()); + if (!command->m_composition) { + command->m_composition = UndoStep::create(&document(), startingSelection(), + endingSelection(), inputType()); + } return command->m_composition.get(); }
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.h b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.h index 24d67a7..f9a287c7 100644 --- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.h +++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.h
@@ -44,50 +44,7 @@ enum class EditCommandSource { kMenuOrKeyBinding, kDOM }; -class EditCommandComposition final : public UndoStep { - public: - static EditCommandComposition* create(Document*, - const VisibleSelection&, - const VisibleSelection&, - InputEvent::InputType); - - bool belongsTo(const LocalFrame&) const override; - void unapply() override; - void reapply() override; - InputEvent::InputType inputType() const override; - void append(SimpleEditCommand*); - void append(EditCommandComposition*); - - const VisibleSelection& startingSelection() const { - return m_startingSelection; - } - const VisibleSelection& endingSelection() const { return m_endingSelection; } - void setStartingSelection(const VisibleSelection&); - void setEndingSelection(const VisibleSelection&); - Element* startingRootEditableElement() const { - return m_startingRootEditableElement.get(); - } - Element* endingRootEditableElement() const { - return m_endingRootEditableElement.get(); - } - - DECLARE_VIRTUAL_TRACE(); - - private: - EditCommandComposition(Document*, - const VisibleSelection& startingSelection, - const VisibleSelection& endingSelection, - InputEvent::InputType); - - Member<Document> m_document; - VisibleSelection m_startingSelection; - VisibleSelection m_endingSelection; - HeapVector<Member<SimpleEditCommand>> m_commands; - Member<Element> m_startingRootEditableElement; - Member<Element> m_endingRootEditableElement; - InputEvent::InputType m_inputType; -}; - +// TODO(xiaochengh): Cleanup the names with term "composition". class CORE_EXPORT CompositeEditCommand : public EditCommand { public: enum ShouldPreserveSelection { PreserveSelection, DoNotPreserveSelection }; @@ -100,8 +57,8 @@ bool isFirstCommand(EditCommand* command) { return !m_commands.isEmpty() && m_commands.front() == command; } - EditCommandComposition* composition() { return m_composition.get(); } - EditCommandComposition* ensureComposition(); + UndoStep* composition() { return m_composition.get(); } + UndoStep* ensureComposition(); // Append composition from an already applied command. void appendCommandToComposite(CompositeEditCommand*); @@ -267,7 +224,7 @@ private: bool isCompositeEditCommand() const final { return true; } - Member<EditCommandComposition> m_composition; + Member<UndoStep> m_composition; }; DEFINE_TYPE_CASTS(CompositeEditCommand,
diff --git a/third_party/WebKit/Source/core/editing/commands/EditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditCommand.cpp index b82246f..4835d1b 100644 --- a/third_party/WebKit/Source/core/editing/commands/EditCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/EditCommand.cpp
@@ -52,8 +52,7 @@ return nullAtom; } -static inline EditCommandComposition* compositionIfPossible( - EditCommand* command) { +static inline UndoStep* compositionIfPossible(EditCommand* command) { if (!command->isCompositeEditCommand()) return 0; return toCompositeEditCommand(command)->composition(); @@ -61,7 +60,7 @@ void EditCommand::setStartingSelection(const VisibleSelection& selection) { for (EditCommand* command = this;; command = command->m_parent) { - if (EditCommandComposition* composition = compositionIfPossible(command)) { + if (UndoStep* composition = compositionIfPossible(command)) { DCHECK(command->isTopLevelCommand()); composition->setStartingSelection(selection); } @@ -86,7 +85,7 @@ // |setEndingSelection()| as primary function instead of wrapper. void EditCommand::setEndingVisibleSelection(const VisibleSelection& selection) { for (EditCommand* command = this; command; command = command->m_parent) { - if (EditCommandComposition* composition = compositionIfPossible(command)) { + if (UndoStep* composition = compositionIfPossible(command)) { DCHECK(command->isTopLevelCommand()); composition->setEndingSelection(selection); }
diff --git a/third_party/WebKit/Source/core/editing/commands/UndoStep.cpp b/third_party/WebKit/Source/core/editing/commands/UndoStep.cpp new file mode 100644 index 0000000..d033b43 --- /dev/null +++ b/third_party/WebKit/Source/core/editing/commands/UndoStep.cpp
@@ -0,0 +1,102 @@ +// Copyright 2017 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. + +#include "core/editing/commands/UndoStep.h" + +#include "core/editing/Editor.h" +#include "core/editing/commands/EditCommand.h" + +namespace blink { + +UndoStep* UndoStep::create(Document* document, + const VisibleSelection& startingSelection, + const VisibleSelection& endingSelection, + InputEvent::InputType inputType) { + return new UndoStep(document, startingSelection, endingSelection, inputType); +} + +UndoStep::UndoStep(Document* document, + const VisibleSelection& startingSelection, + const VisibleSelection& endingSelection, + InputEvent::InputType inputType) + : m_document(document), + m_startingSelection(startingSelection), + m_endingSelection(endingSelection), + m_startingRootEditableElement(startingSelection.rootEditableElement()), + m_endingRootEditableElement(endingSelection.rootEditableElement()), + m_inputType(inputType) {} + +void UndoStep::unapply() { + DCHECK(m_document); + LocalFrame* frame = m_document->frame(); + DCHECK(frame); + + // Changes to the document may have been made since the last editing operation + // that require a layout, as in <rdar://problem/5658603>. Low level + // operations, like RemoveNodeCommand, don't require a layout because the high + // level operations that use them perform one if one is necessary (like for + // the creation of VisiblePositions). + m_document->updateStyleAndLayoutIgnorePendingStylesheets(); + + { + size_t size = m_commands.size(); + for (size_t i = size; i; --i) + m_commands[i - 1]->doUnapply(); + } + + frame->editor().unappliedEditing(this); +} + +void UndoStep::reapply() { + DCHECK(m_document); + LocalFrame* frame = m_document->frame(); + DCHECK(frame); + + // Changes to the document may have been made since the last editing operation + // that require a layout, as in <rdar://problem/5658603>. Low level + // operations, like RemoveNodeCommand, don't require a layout because the high + // level operations that use them perform one if one is necessary (like for + // the creation of VisiblePositions). + m_document->updateStyleAndLayoutIgnorePendingStylesheets(); + + { + for (const auto& command : m_commands) + command->doReapply(); + } + + frame->editor().reappliedEditing(this); +} + +InputEvent::InputType UndoStep::inputType() const { + return m_inputType; +} + +void UndoStep::append(SimpleEditCommand* command) { + m_commands.push_back(command); +} + +void UndoStep::append(UndoStep* composition) { + m_commands.appendVector(composition->m_commands); +} + +void UndoStep::setStartingSelection(const VisibleSelection& selection) { + m_startingSelection = selection; + m_startingRootEditableElement = selection.rootEditableElement(); +} + +void UndoStep::setEndingSelection(const VisibleSelection& selection) { + m_endingSelection = selection; + m_endingRootEditableElement = selection.rootEditableElement(); +} + +DEFINE_TRACE(UndoStep) { + visitor->trace(m_document); + visitor->trace(m_startingSelection); + visitor->trace(m_endingSelection); + visitor->trace(m_commands); + visitor->trace(m_startingRootEditableElement); + visitor->trace(m_endingRootEditableElement); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/commands/UndoStep.h b/third_party/WebKit/Source/core/editing/commands/UndoStep.h index 4aa7689..c0e1935 100644 --- a/third_party/WebKit/Source/core/editing/commands/UndoStep.h +++ b/third_party/WebKit/Source/core/editing/commands/UndoStep.h
@@ -31,22 +31,55 @@ #ifndef UndoStep_h #define UndoStep_h +#include "core/editing/VisibleSelection.h" #include "core/events/InputEvent.h" #include "platform/heap/Handle.h" namespace blink { -class LocalFrame; +class SimpleEditCommand; class UndoStep : public GarbageCollectedFinalized<UndoStep> { public: - virtual ~UndoStep() {} - DEFINE_INLINE_VIRTUAL_TRACE() {} + static UndoStep* create(Document*, + const VisibleSelection&, + const VisibleSelection&, + InputEvent::InputType); - virtual bool belongsTo(const LocalFrame&) const = 0; - virtual void unapply() = 0; - virtual void reapply() = 0; - virtual InputEvent::InputType inputType() const = 0; + void unapply(); + void reapply(); + InputEvent::InputType inputType() const; + void append(SimpleEditCommand*); + void append(UndoStep*); + + const VisibleSelection& startingSelection() const { + return m_startingSelection; + } + const VisibleSelection& endingSelection() const { return m_endingSelection; } + void setStartingSelection(const VisibleSelection&); + void setEndingSelection(const VisibleSelection&); + Element* startingRootEditableElement() const { + return m_startingRootEditableElement.get(); + } + Element* endingRootEditableElement() const { + return m_endingRootEditableElement.get(); + } + + DECLARE_TRACE(); + + private: + UndoStep(Document*, + const VisibleSelection& startingSelection, + const VisibleSelection& endingSelection, + InputEvent::InputType); + + Member<Document> m_document; + VisibleSelection m_startingSelection; + VisibleSelection m_endingSelection; + HeapVector<Member<SimpleEditCommand>> m_commands; + Member<Element> m_startingRootEditableElement; + Member<Element> m_endingRootEditableElement; + InputEvent::InputType m_inputType; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/CrossOriginAccessControl.cpp b/third_party/WebKit/Source/core/fetch/CrossOriginAccessControl.cpp index 2e8c98a..ff43d881 100644 --- a/third_party/WebKit/Source/core/fetch/CrossOriginAccessControl.cpp +++ b/third_party/WebKit/Source/core/fetch/CrossOriginAccessControl.cpp
@@ -70,6 +70,8 @@ } filteredHeaders.push_back(header.key.lower()); } + if (!filteredHeaders.size()) + return nullAtom; // Sort header names lexicographically. std::sort(filteredHeaders.begin(), filteredHeaders.end(), @@ -106,10 +108,11 @@ HTTPNames::Access_Control_Request_External, "true"); } - if (request.httpHeaderFields().size() > 0) { + AtomicString requestHeaders = + createAccessControlRequestHeadersHeader(request.httpHeaderFields()); + if (requestHeaders != nullAtom) { preflightRequest.setHTTPHeaderField( - HTTPNames::Access_Control_Request_Headers, - createAccessControlRequestHeadersHeader(request.httpHeaderFields())); + HTTPNames::Access_Control_Request_Headers, requestHeaders); } return preflightRequest;
diff --git a/third_party/WebKit/Source/core/fetch/CrossOriginAccessControlTest.cpp b/third_party/WebKit/Source/core/fetch/CrossOriginAccessControlTest.cpp index 744bd0f..9ce09006 100644 --- a/third_party/WebKit/Source/core/fetch/CrossOriginAccessControlTest.cpp +++ b/third_party/WebKit/Source/core/fetch/CrossOriginAccessControlTest.cpp
@@ -48,7 +48,11 @@ ResourceRequest preflight = createAccessControlPreflightRequest(request, m_securityOrigin.get()); - EXPECT_EQ("", preflight.httpHeaderField("Access-Control-Request-Headers")); + // Do not emit empty-valued headers; an empty list of non-"CORS safelisted" + // request headers should cause "Access-Control-Request-Headers:" to be + // left out in the preflight request. + EXPECT_EQ(nullAtom, + preflight.httpHeaderField("Access-Control-Request-Headers")); } TEST_F(CreateAccessControlPreflightRequestTest, @@ -59,7 +63,9 @@ ResourceRequest preflight = createAccessControlPreflightRequest(request, m_securityOrigin.get()); - EXPECT_EQ("", preflight.httpHeaderField("Access-Control-Request-Headers")); + // Empty list also; see comment in test above. + EXPECT_EQ(nullAtom, + preflight.httpHeaderField("Access-Control-Request-Headers")); } TEST_F(CreateAccessControlPreflightRequestTest, IncludeNonSimpleHeader) {
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp index 3ffe71d6..c23b5d93 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
@@ -741,7 +741,7 @@ } } -String nodePositionAsStringForTesting(Node* node) { +static String nodePosition(Node* node) { StringBuilder result; Element* body = node->document().body(); @@ -788,18 +788,16 @@ VisibleSelection selection = frame->selection().selection(); if (selection.isCaret()) { ts << "caret: position " << selection.start().computeEditingOffset() - << " of " - << nodePositionAsStringForTesting(selection.start().anchorNode()); + << " of " << nodePosition(selection.start().anchorNode()); if (selection.affinity() == TextAffinity::Upstream) ts << " (upstream affinity)"; ts << "\n"; } else if (selection.isRange()) { ts << "selection start: position " << selection.start().computeEditingOffset() << " of " - << nodePositionAsStringForTesting(selection.start().anchorNode()) << "\n" + << nodePosition(selection.start().anchorNode()) << "\n" << "selection end: position " << selection.end().computeEditingOffset() - << " of " << nodePositionAsStringForTesting(selection.end().anchorNode()) - << "\n"; + << " of " << nodePosition(selection.end().anchorNode()) << "\n"; } }
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.h b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.h index 828a5ba..2bdd45a1 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.h +++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.h
@@ -38,7 +38,6 @@ class Element; class LayoutRect; class LocalFrame; -class Node; class LayoutBlockFlow; class LayoutObject; class TextStream; @@ -106,8 +105,6 @@ CORE_EXPORT String markerTextForListItem(Element*); -CORE_EXPORT String nodePositionAsStringForTesting(Node*); - TextStream& operator<<(TextStream&, const Color&); } // namespace blink
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp index 438a1786..9793325f 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -949,6 +949,12 @@ if (!m_sendFlag || m_loader) return; } + if (!getExecutionContext()) { + handleNetworkError(); + throwForLoadFailureIfNeeded(exceptionState, + "Document is already detached."); + return; + } } m_sameOriginRequest = getSecurityOrigin()->canRequestNoSuborigin(m_url); @@ -1035,6 +1041,8 @@ m_exceptionCode = 0; m_error = false; + // TODO(yhirano): Remove this CHECK once https://crbug.com/667254 is fixed. + CHECK(getExecutionContext()); if (m_async) { UseCounter::count(&executionContext, UseCounter::XMLHttpRequestAsynchronous); @@ -1811,6 +1819,9 @@ } bool XMLHttpRequest::hasPendingActivity() const { + // TODO(yhirano): Remove this CHECK once https://crbug.com/667254 is fixed. + CHECK(getExecutionContext() || !m_loader); + // Neither this object nor the JavaScript wrapper should be deleted while // a request is in progress because we need to keep the listeners alive, // and they are referenced by the JavaScript wrapper.
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js index e5c0653b..22513ac 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js +++ b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js
@@ -586,7 +586,7 @@ * @param {?Array.<!SDK.RemoteObjectProperty>} internalProperties */ _prepareScopeVariables(callFrame, properties, internalProperties) { - if (!properties || !properties.length || properties.length > 500) { + if (!properties || !properties.length || properties.length > 500 || !this.isShowing()) { this._clearValueWidgets(); return; }
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp index 74c6922c..3a58fa71 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp
@@ -12,6 +12,7 @@ #include "cc/trees/transform_node.h" #include "platform/graphics/paint/ClipPaintPropertyNode.h" #include "platform/graphics/paint/EffectPaintPropertyNode.h" +#include "platform/graphics/paint/GeometryMapper.h" #include "platform/graphics/paint/ScrollPaintPropertyNode.h" #include "platform/graphics/paint/TransformPaintPropertyNode.h" @@ -293,47 +294,10 @@ scrollTree().set_needs_update(true); } -namespace { - -unsigned depth(const EffectPaintPropertyNode* node) { - unsigned result = 0; - for (; node; node = node->parent()) - result++; - return result; -} - -// TODO(chrishtr): templatize this to avoid duplication of -// GeometryMapper::leastCommonAncestor. -const EffectPaintPropertyNode* lowestCommonAncestor( - const EffectPaintPropertyNode* nodeA, - const EffectPaintPropertyNode* nodeB) { - // Optimized common case. - if (nodeA == nodeB) - return nodeA; - - unsigned depthA = depth(nodeA), depthB = depth(nodeB); - while (depthA > depthB) { - nodeA = nodeA->parent(); - depthA--; - } - while (depthB > depthA) { - nodeB = nodeB->parent(); - depthB--; - } - DCHECK_EQ(depthA, depthB); - while (nodeA != nodeB) { - nodeA = nodeA->parent(); - nodeB = nodeB->parent(); - } - return nodeA; -} - -} // namespace - int PropertyTreeManager::switchToEffectNode( const EffectPaintPropertyNode& nextEffect) { const EffectPaintPropertyNode* ancestor = - lowestCommonAncestor(currentEffectNode(), &nextEffect); + GeometryMapper::lowestCommonAncestor(currentEffectNode(), &nextEffect); DCHECK(ancestor) << "Malformed effect tree. All nodes must be descendant of " "EffectPaintPropertyNode::root()."; while (currentEffectNode() != ancestor)
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp index 433ddc6..cc78541 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
@@ -31,8 +31,8 @@ if (success) return result; - // Otherwise first map to the least common ancestor, then map to destination. - const TransformPaintPropertyNode* lcaTransform = leastCommonAncestor( + // Otherwise first map to the lowest common ancestor, then map to destination. + const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor( sourceState.transform(), destinationState.transform()); DCHECK(lcaTransform); @@ -63,7 +63,7 @@ // Otherwise first map to the least common ancestor, then map to destination. const TransformPaintPropertyNode* lcaTransform = - leastCommonAncestor(sourceTransformNode, destinationTransformNode); + lowestCommonAncestor(sourceTransformNode, destinationTransformNode); DCHECK(lcaTransform); FloatRect lcaRect = @@ -285,8 +285,8 @@ namespace { -unsigned transformPropertyTreeNodeDepth( - const TransformPaintPropertyNode* node) { +template <typename NodeType> +unsigned nodeDepth(const NodeType* node) { unsigned depth = 0; while (node) { depth++; @@ -294,14 +294,15 @@ } return depth; } -} -const TransformPaintPropertyNode* GeometryMapper::leastCommonAncestor( - const TransformPaintPropertyNode* a, - const TransformPaintPropertyNode* b) { +} // namespace + +template <typename NodeType> +const NodeType* GeometryMapper::lowestCommonAncestor(const NodeType* a, + const NodeType* b) { // Measure both depths. - unsigned depthA = transformPropertyTreeNodeDepth(a); - unsigned depthB = transformPropertyTreeNodeDepth(b); + unsigned depthA = nodeDepth(a); + unsigned depthB = nodeDepth(b); // Make it so depthA >= depthB. if (depthA < depthB) { @@ -323,4 +324,20 @@ return a; } +// Explicitly instantiate the template for all supported types. This allows +// placing the template implementation in this .cpp file. See +// http://stackoverflow.com/a/488989 for more. +template const EffectPaintPropertyNode* GeometryMapper::lowestCommonAncestor( + const EffectPaintPropertyNode*, + const EffectPaintPropertyNode*); +template const TransformPaintPropertyNode* GeometryMapper::lowestCommonAncestor( + const TransformPaintPropertyNode*, + const TransformPaintPropertyNode*); +template const ClipPaintPropertyNode* GeometryMapper::lowestCommonAncestor( + const ClipPaintPropertyNode*, + const ClipPaintPropertyNode*); +template const ScrollPaintPropertyNode* GeometryMapper::lowestCommonAncestor( + const ScrollPaintPropertyNode*, + const ScrollPaintPropertyNode*); + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h index d7a2fe23..ba935fc6 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h +++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
@@ -53,9 +53,9 @@ // If the clips and transforms of |sourceState| are equal to or descendants of // those of |destinationState|, returns the same value as // localToAncestorVisualRect. Otherwise, maps the input rect to the - // transform state which is the least common ancestor of + // transform state which is the lowest common ancestor of // |sourceState.transform| and |destinationState.transform|, then multiplies - // it by the the inverse transform mapping from the least common ancestor to + // it by the the inverse transform mapping from the lowest common ancestor to // |destinationState.transform|. // // DCHECK fails if the clip of |destinationState| is not an ancestor of the @@ -127,6 +127,11 @@ const PropertyTreeState& localTransformState, const PropertyTreeState& ancestorState); + // Returns the lowest common ancestor in the paint property tree. + template <typename NodeType> + static PLATFORM_EXPORT const NodeType* lowestCommonAncestor(const NodeType*, + const NodeType*); + private: // The internal methods do the same things as their public counterparts, but // take an extra |success| parameter which indicates if the function is @@ -166,11 +171,6 @@ PrecomputedDataForAncestor& getPrecomputedDataForAncestor( const TransformPaintPropertyNode*); - // Returns the least common ancestor in the transform tree. - static const TransformPaintPropertyNode* leastCommonAncestor( - const TransformPaintPropertyNode*, - const TransformPaintPropertyNode*); - friend class GeometryMapperTest; friend class PaintLayerClipperTest;
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp index fabe46c6..aa8aa34 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapperTest.cpp
@@ -36,10 +36,10 @@ propertyTreeState.transform()); } - const TransformPaintPropertyNode* leastCommonAncestor( + const TransformPaintPropertyNode* lowestCommonAncestor( const TransformPaintPropertyNode* a, const TransformPaintPropertyNode* b) { - return GeometryMapper::leastCommonAncestor(a, b); + return GeometryMapper::lowestCommonAncestor(a, b); } FloatRect sourceToDestinationVisualRectInternal( @@ -571,7 +571,7 @@ EXPECT_RECT_EQ(expectedUnclipped, result); } -TEST_F(GeometryMapperTest, LeastCommonAncestor) { +TEST_F(GeometryMapperTest, LowestCommonAncestor) { TransformationMatrix matrix; RefPtr<TransformPaintPropertyNode> child1 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), @@ -586,25 +586,25 @@ TransformPaintPropertyNode::create(child2, matrix, FloatPoint3D()); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild1.get(), childOfChild2.get())); + lowestCommonAncestor(childOfChild1.get(), childOfChild2.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild1.get(), child2.get())); + lowestCommonAncestor(childOfChild1.get(), child2.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild1.get(), - rootPropertyTreeState().transform())); - EXPECT_EQ(child1, leastCommonAncestor(childOfChild1.get(), child1.get())); + lowestCommonAncestor(childOfChild1.get(), + rootPropertyTreeState().transform())); + EXPECT_EQ(child1, lowestCommonAncestor(childOfChild1.get(), child1.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild2.get(), childOfChild1.get())); + lowestCommonAncestor(childOfChild2.get(), childOfChild1.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild2.get(), child1.get())); + lowestCommonAncestor(childOfChild2.get(), child1.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(childOfChild2.get(), - rootPropertyTreeState().transform())); - EXPECT_EQ(child2, leastCommonAncestor(childOfChild2.get(), child2.get())); + lowestCommonAncestor(childOfChild2.get(), + rootPropertyTreeState().transform())); + EXPECT_EQ(child2, lowestCommonAncestor(childOfChild2.get(), child2.get())); EXPECT_EQ(rootPropertyTreeState().transform(), - leastCommonAncestor(child1.get(), child2.get())); + lowestCommonAncestor(child1.get(), child2.get())); } } // namespace blink
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json index ab588f5..ccfd7135 100644 --- a/third_party/polymer/v1_0/bower.json +++ b/third_party/polymer/v1_0/bower.json
@@ -24,7 +24,7 @@ "iron-media-query": "PolymerElements/iron-media-query#1.0.8", "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1.1.10", "iron-meta": "PolymerElements/iron-meta#1.1.2", - "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1.8.6", + "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1.10.2", "iron-pages": "PolymerElements/iron-pages#1.0.8", "iron-range-behavior": "PolymerElements/iron-range-behavior#1.0.6", "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1.0.5",
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-box/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-box/compiled_resources2.gyp index b846327..29dc7864 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-box/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-box/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer-layout/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer-layout/compiled_resources2.gyp index a607ca2..95f099a 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer-layout/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer-layout/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer/compiled_resources2.gyp index 10b46ba..975c1fc 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-drawer/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-header-layout/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-header-layout/compiled_resources2.gyp index 211d335..900dd56 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-header-layout/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-header-layout/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-header/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-header/compiled_resources2.gyp index 69011cf..d4ea62c3 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-header/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-header/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/compiled_resources2.gyp index 2261750..fa8298f 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/effects/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/effects/compiled_resources2.gyp index 3c66f75..bd11d235 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/effects/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-scroll-effects/effects/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-scrollpos-control/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-scrollpos-control/compiled_resources2.gyp index b99a4ac..d05841fb 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-scrollpos-control/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-scrollpos-control/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/app-toolbar/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/app-toolbar/compiled_resources2.gyp index 1c187ed4..124c951 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/app-toolbar/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/app-toolbar/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/compiled_resources2.gyp index 1d70b5c1..d01bc49 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/helpers/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/app-layout/helpers/compiled_resources2.gyp index 7f576fc..2ae8780 100644 --- a/third_party/polymer/v1_0/components-chromium/app-layout/helpers/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/app-layout/helpers/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/font-roboto/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/font-roboto/compiled_resources2.gyp index f0e8ec53..efe2cd6 100644 --- a/third_party/polymer/v1_0/components-chromium/font-roboto/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/font-roboto/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/compiled_resources2.gyp index 6d60771..3c39e9df 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/compiled_resources2.gyp index 7fe1a00d..98cf0e3 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/compiled_resources2.gyp index 999b52d..ef599c5 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/compiled_resources2.gyp index d37871e2..8d5583e 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-behaviors/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-behaviors/compiled_resources2.gyp index deac62cb..3259eea 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-behaviors/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-behaviors/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/compiled_resources2.gyp index 96afde93..17bda54 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-collapse/compiled_resources2.gyp index 5f8148cb..2c0e8b4f 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-dropdown/compiled_resources2.gyp index 9308e939..779a0fdf 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/compiled_resources2.gyp index 22c218e..0a2bc9f 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-flex-layout/classes/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-flex-layout/classes/compiled_resources2.gyp index daa6f8a..b1f81fe 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-flex-layout/classes/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-flex-layout/classes/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-flex-layout/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-flex-layout/compiled_resources2.gyp index bbc8aa6..6013345 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-flex-layout/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-flex-layout/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/compiled_resources2.gyp index 354febd5..68053a6 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-form-element-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-icon/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-icon/compiled_resources2.gyp index 1d29b409..f24c1837 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-icon/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-icon/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-icons/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-icons/compiled_resources2.gyp index 18169f31..6c671df 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-icons/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-icons/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/compiled_resources2.gyp index 345b710..48a9f4c 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-iconset-svg/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-input/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-input/compiled_resources2.gyp index 2c574b5..05ee798 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-input/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-input/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-list/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-list/compiled_resources2.gyp index 1819c94b..3b006d0 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-list/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-list/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-location/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-location/compiled_resources2.gyp index dbb590a..f57c8eee 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-location/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-location/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-media-query/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-media-query/compiled_resources2.gyp index c227b5b..91688a3 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-media-query/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-media-query/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/compiled_resources2.gyp index 3379dbb..7350331b 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-meta/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-meta/compiled_resources2.gyp index 6a4f5e1..003d83f 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-meta/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-meta/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json index 0a14e1c..753afba 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json
@@ -1,6 +1,6 @@ { "name": "iron-overlay-behavior", - "version": "1.8.6", + "version": "1.10.2", "license": "http://polymer.github.io/LICENSE.txt", "description": "Provides a behavior for making an element an overlay", "private": true,
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/compiled_resources2.gyp index 3123242c..bac2241 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. # @@ -6,6 +6,10 @@ { 'targets': [ { + 'target_name': 'iron-focusables-helper-extracted', + 'includes': ['../../../../closure_compiler/compile_js2.gypi'], + }, + { 'target_name': 'iron-overlay-backdrop-extracted', 'includes': ['../../../../closure_compiler/compile_js2.gypi'], }, @@ -14,6 +18,7 @@ 'dependencies': [ '../iron-fit-behavior/compiled_resources2.gyp:iron-fit-behavior-extracted', '../iron-resizable-behavior/compiled_resources2.gyp:iron-resizable-behavior-extracted', + 'iron-focusables-helper-extracted', 'iron-overlay-manager-extracted', ], 'includes': ['../../../../closure_compiler/compile_js2.gypi'],
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper-extracted.js new file mode 100644 index 0000000..2c8ffbf1 --- /dev/null +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper-extracted.js
@@ -0,0 +1,206 @@ +(function() { + 'use strict'; + + var p = Element.prototype; + var matches = p.matches || p.matchesSelector || p.mozMatchesSelector || + p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector; + + Polymer.IronFocusablesHelper = { + + /** + * Returns a sorted array of tabbable nodes, including the root node. + * It searches the tabbable nodes in the light and shadow dom of the chidren, + * sorting the result by tabindex. + * @param {!Node} node + * @return {Array<HTMLElement>} + */ + getTabbableNodes: function(node) { + var result = []; + // If there is at least one element with tabindex > 0, we need to sort + // the final array by tabindex. + var needsSortByTabIndex = this._collectTabbableNodes(node, result); + if (needsSortByTabIndex) { + return this._sortByTabIndex(result); + } + return result; + }, + + /** + * Returns if a element is focusable. + * @param {!HTMLElement} element + * @return {boolean} + */ + isFocusable: function(element) { + // From http://stackoverflow.com/a/1600194/4228703: + // There isn't a definite list, it's up to the browser. The only + // standard we have is DOM Level 2 HTML https://www.w3.org/TR/DOM-Level-2-HTML/html.html, + // according to which the only elements that have a focus() method are + // HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement and + // HTMLAnchorElement. This notably omits HTMLButtonElement and + // HTMLAreaElement. + // Referring to these tests with tabbables in different browsers + // http://allyjs.io/data-tables/focusable.html + + // Elements that cannot be focused if they have [disabled] attribute. + if (matches.call(element, 'input, select, textarea, button, object')) { + return matches.call(element, ':not([disabled])'); + } + // Elements that can be focused even if they have [disabled] attribute. + return matches.call(element, + 'a[href], area[href], iframe, [tabindex], [contentEditable]'); + }, + + /** + * Returns if a element is tabbable. To be tabbable, a element must be + * focusable, visible, and with a tabindex !== -1. + * @param {!HTMLElement} element + * @return {boolean} + */ + isTabbable: function(element) { + return this.isFocusable(element) && + matches.call(element, ':not([tabindex="-1"])') && + this._isVisible(element); + }, + + /** + * Returns the normalized element tabindex. If not focusable, returns -1. + * It checks for the attribute "tabindex" instead of the element property + * `tabIndex` since browsers assign different values to it. + * e.g. in Firefox `<div contenteditable>` has `tabIndex = -1` + * @param {!HTMLElement} element + * @return {!number} + * @private + */ + _normalizedTabIndex: function(element) { + if (this.isFocusable(element)) { + var tabIndex = element.getAttribute('tabindex') || 0; + return Number(tabIndex); + } + return -1; + }, + + /** + * Searches for nodes that are tabbable and adds them to the `result` array. + * Returns if the `result` array needs to be sorted by tabindex. + * @param {!Node} node The starting point for the search; added to `result` + * if tabbable. + * @param {!Array<HTMLElement>} result + * @return {boolean} + * @private + */ + _collectTabbableNodes: function(node, result) { + // If not an element or not visible, no need to explore children. + if (node.nodeType !== Node.ELEMENT_NODE || !this._isVisible(node)) { + return false; + } + var element = /** @type {HTMLElement} */ (node); + var tabIndex = this._normalizedTabIndex(element); + var needsSortByTabIndex = tabIndex > 0; + if (tabIndex >= 0) { + result.push(element); + } + + // In ShadowDOM v1, tab order is affected by the order of distrubution. + // E.g. getTabbableNodes(#root) in ShadowDOM v1 should return [#A, #B]; + // in ShadowDOM v0 tab order is not affected by the distrubution order, + // in fact getTabbableNodes(#root) returns [#B, #A]. + // <div id="root"> + // <!-- shadow --> + // <slot name="a"> + // <slot name="b"> + // <!-- /shadow --> + // <input id="A" slot="a"> + // <input id="B" slot="b" tabindex="1"> + // </div> + // TODO(valdrin) support ShadowDOM v1 when upgrading to Polymer v2.0. + var children; + if (element.localName === 'content') { + children = Polymer.dom(element).getDistributedNodes(); + } else { + // Use shadow root if possible, will check for distributed nodes. + children = Polymer.dom(element.root || element).children; + } + for (var i = 0; i < children.length; i++) { + // Ensure method is always invoked to collect tabbable children. + var needsSort = this._collectTabbableNodes(children[i], result); + needsSortByTabIndex = needsSortByTabIndex || needsSort; + } + return needsSortByTabIndex; + }, + + /** + * Returns false if the element has `visibility: hidden` or `display: none` + * @param {!HTMLElement} element + * @return {boolean} + * @private + */ + _isVisible: function(element) { + // Check inline style first to save a re-flow. If looks good, check also + // computed style. + var style = element.style; + if (style.visibility !== 'hidden' && style.display !== 'none') { + style = window.getComputedStyle(element); + return (style.visibility !== 'hidden' && style.display !== 'none'); + } + return false; + }, + + /** + * Sorts an array of tabbable elements by tabindex. Returns a new array. + * @param {!Array<HTMLElement>} tabbables + * @return {Array<HTMLElement>} + * @private + */ + _sortByTabIndex: function(tabbables) { + // Implement a merge sort as Array.prototype.sort does a non-stable sort + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort + var len = tabbables.length; + if (len < 2) { + return tabbables; + } + var pivot = Math.ceil(len / 2); + var left = this._sortByTabIndex(tabbables.slice(0, pivot)); + var right = this._sortByTabIndex(tabbables.slice(pivot)); + return this._mergeSortByTabIndex(left, right); + }, + + /** + * Merge sort iterator, merges the two arrays into one, sorted by tab index. + * @param {!Array<HTMLElement>} left + * @param {!Array<HTMLElement>} right + * @return {Array<HTMLElement>} + * @private + */ + _mergeSortByTabIndex: function(left, right) { + var result = []; + while ((left.length > 0) && (right.length > 0)) { + if (this._hasLowerTabOrder(left[0], right[0])) { + result.push(right.shift()); + } else { + result.push(left.shift()); + } + } + + return result.concat(left, right); + }, + + /** + * Returns if element `a` has lower tab order compared to element `b` + * (both elements are assumed to be focusable and tabbable). + * Elements with tabindex = 0 have lower tab order compared to elements + * with tabindex > 0. + * If both have same tabindex, it returns false. + * @param {!HTMLElement} a + * @param {!HTMLElement} b + * @return {boolean} + * @private + */ + _hasLowerTabOrder: function(a, b) { + // Normalize tabIndexes + // e.g. in Firefox `<div contenteditable>` has `tabIndex = -1` + var ati = Math.max(a.tabIndex, 0); + var bti = Math.max(b.tabIndex, 0); + return (ati === 0 || bti === 0) ? bti > ati : ati > bti; + } + }; + })(); \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.html b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.html new file mode 100644 index 0000000..b8f1bb7 --- /dev/null +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html><!-- +@license +Copyright (c) 2016 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +--><html><head><link rel="import" href="../polymer/polymer.html"> + +</head><body><script src="iron-focusables-helper-extracted.js"></script></body></html> \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js index 2f63c920..620b1d05 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
@@ -1,49 +1,7 @@ (function() { -'use strict'; + 'use strict'; -/** -Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays -on top of other content. It includes an optional backdrop, and can be used to implement a variety -of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once. - -See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html) -for an example. - -### Closing and canceling - -An overlay may be hidden by closing or canceling. The difference between close and cancel is user -intent. Closing generally implies that the user acknowledged the content on the overlay. By default, -it will cancel whenever the user taps outside it or presses the escape key. This behavior is -configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties. -`close()` should be called explicitly by the implementer when the user interacts with a control -in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled' -event. Call `preventDefault` on this event to prevent the overlay from closing. - -### Positioning - -By default the element is sized and positioned to fit and centered inside the window. You can -position and size it manually using CSS. See `Polymer.IronFitBehavior`. - -### Backdrop - -Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is -appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling -options. - -In addition, `with-backdrop` will wrap the focus within the content in the light DOM. -Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) -to achieve a different behavior. - -### Limitations - -The element is styled to appear on top of other content by setting its `z-index` property. You -must ensure no element has a stacking context with a higher `z-index` than its parent stacking -context. You should place this element as a child of `<body>` whenever possible. - -@demo demo/index.html -@polymerBehavior Polymer.IronOverlayBehavior -*/ - + /** @polymerBehavior */ Polymer.IronOverlayBehaviorImpl = { properties: { @@ -179,45 +137,7 @@ * @protected */ get _focusableNodes() { - // Elements that can be focused even if they have [disabled] attribute. - var FOCUSABLE_WITH_DISABLED = [ - 'a[href]', - 'area[href]', - 'iframe', - '[tabindex]', - '[contentEditable=true]' - ]; - - // Elements that cannot be focused if they have [disabled] attribute. - var FOCUSABLE_WITHOUT_DISABLED = [ - 'input', - 'select', - 'textarea', - 'button' - ]; - - // Discard elements with tabindex=-1 (makes them not focusable). - var selector = FOCUSABLE_WITH_DISABLED.join(':not([tabindex="-1"]),') + - ':not([tabindex="-1"]),' + - FOCUSABLE_WITHOUT_DISABLED.join(':not([disabled]):not([tabindex="-1"]),') + - ':not([disabled]):not([tabindex="-1"])'; - - var focusables = Polymer.dom(this).querySelectorAll(selector); - if (this.tabIndex >= 0) { - // Insert at the beginning because we might have all elements with tabIndex = 0, - // and the overlay should be the first of the list. - focusables.splice(0, 0, this); - } - // Sort by tabindex. - return focusables.sort(function (a, b) { - if (a.tabIndex === b.tabIndex) { - return 0; - } - if (a.tabIndex === 0 || a.tabIndex > b.tabIndex) { - return 1; - } - return -1; - }); + return Polymer.IronFocusablesHelper.getTabbableNodes(this); }, ready: function() { @@ -291,6 +211,14 @@ this.opened = false; }, + /** + * Invalidates the cached tabbable nodes. To be called when any of the focusable + * content changes (e.g. a button is disabled). + */ + invalidateTabbables: function() { + this.__firstFocusableNode = this.__lastFocusableNode = null; + }, + _ensureSetup: function() { if (this._overlaySetup) { return; @@ -389,11 +317,6 @@ this.notifyResize(); this.__isAnimating = false; - // Store it so we don't query too much. - var focusableNodes = this._focusableNodes; - this.__firstFocusableNode = focusableNodes[0]; - this.__lastFocusableNode = focusableNodes[focusableNodes.length - 1]; - this.fire('iron-overlay-opened'); }, @@ -510,6 +433,7 @@ if (!this.withBackdrop) { return; } + this.__ensureFirstLastFocusables(); // TAB wraps from last to first focusable. // Shift + TAB wraps from first to last focusable. var shift = event.shiftKey; @@ -566,11 +490,25 @@ */ _onNodesChange: function() { if (this.opened && !this.__isAnimating) { + // It might have added focusable nodes, so invalidate cached values. + this.invalidateTabbables(); this.notifyResize(); } }, /** + * Will set first and last focusable nodes if any of them is not set. + * @private + */ + __ensureFirstLastFocusables: function() { + if (!this.__firstFocusableNode || !this.__lastFocusableNode) { + var focusableNodes = this._focusableNodes; + this.__firstFocusableNode = focusableNodes[0]; + this.__lastFocusableNode = focusableNodes[focusableNodes.length - 1]; + } + }, + + /** * Tasks executed when opened changes: prepare for the opening, move the * focus, update the manager, render opened/closed. * @private @@ -614,7 +552,48 @@ }; - /** @polymerBehavior */ + /** + Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays + on top of other content. It includes an optional backdrop, and can be used to implement a variety + of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once. + + See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html) + for an example. + + ### Closing and canceling + + An overlay may be hidden by closing or canceling. The difference between close and cancel is user + intent. Closing generally implies that the user acknowledged the content on the overlay. By default, + it will cancel whenever the user taps outside it or presses the escape key. This behavior is + configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties. + `close()` should be called explicitly by the implementer when the user interacts with a control + in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled' + event. Call `preventDefault` on this event to prevent the overlay from closing. + + ### Positioning + + By default the element is sized and positioned to fit and centered inside the window. You can + position and size it manually using CSS. See `Polymer.IronFitBehavior`. + + ### Backdrop + + Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is + appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling + options. + + In addition, `with-backdrop` will wrap the focus within the content in the light DOM. + Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) + to achieve a different behavior. + + ### Limitations + + The element is styled to appear on top of other content by setting its `z-index` property. You + must ensure no element has a stacking context with a higher `z-index` than its parent stacking + context. You should place this element as a child of `<body>` whenever possible. + + @demo demo/index.html + @polymerBehavior + */ Polymer.IronOverlayBehavior = [Polymer.IronFitBehavior, Polymer.IronResizableBehavior, Polymer.IronOverlayBehaviorImpl]; /**
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.html b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.html index 79f6b11..d149d7e 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.html +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.html
@@ -10,5 +10,6 @@ <link rel="import" href="../iron-fit-behavior/iron-fit-behavior.html"> <link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html"> <link rel="import" href="iron-overlay-manager.html"> +<link rel="import" href="iron-focusables-helper.html"> </head><body><script src="iron-overlay-behavior-extracted.js"></script></body></html> \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/iron-pages/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-pages/compiled_resources2.gyp index 79c91f1..278544a 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-pages/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-pages/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/compiled_resources2.gyp index bdada988..177663e8 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp index a6b0a423..78ed6dd 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/compiled_resources2.gyp index f513eb7..d1b98cfb3 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/compiled_resources2.gyp index 11dd475..589db77 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-selector/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-selector/compiled_resources2.gyp index 88a5e99..3454fd7 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-selector/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-selector/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-test-helpers/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-test-helpers/compiled_resources2.gyp index 908da76..d71f8dc 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-test-helpers/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-test-helpers/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/compiled_resources2.gyp index b5aa49a..8d8e17b 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/iron-validatable-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp index 8595a951..32ede82 100644 --- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp index c500df6..b820a06 100644 --- a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp index a98fe6a..6720a68 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-button/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-button/compiled_resources2.gyp index 19a91fc..2ce61c6d 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-button/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-button/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-checkbox/compiled_resources2.gyp index 4e3a374..549d06fa 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/compiled_resources2.gyp index b6563fb6..d3baf78 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-dialog/compiled_resources2.gyp index 38949cb..f7d3cd7 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-dialog/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-dialog/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-drawer-panel/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-drawer-panel/compiled_resources2.gyp index 1d26968..40856f89 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-drawer-panel/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-drawer-panel/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/compiled_resources2.gyp index 5f31fb5..b8f0f38 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-fab/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-fab/compiled_resources2.gyp index 3a94990a..048e06d 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-fab/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-fab/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-header-panel/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-header-panel/compiled_resources2.gyp index 7390007..17720d1 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-header-panel/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-header-panel/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-icon-button/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-icon-button/compiled_resources2.gyp index 80b75909..d1064403 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-icon-button/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-icon-button/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light.html b/third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light.html index 551e502..2eaa665 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light.html +++ b/third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light.html
@@ -45,7 +45,6 @@ paper-ripple { opacity: 0.6; color: currentColor; - @apply(--paper-icon-button-light-ripple); } </style> <content></content>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-input/compiled_resources2.gyp index 3f40f83d..8bd3ae6 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-input/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-item/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-item/compiled_resources2.gyp index 1d0eefc..a424cb8 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-item/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-item/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-listbox/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-listbox/compiled_resources2.gyp index 8e0fc6f..71f8e4a 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-listbox/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-listbox/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-material/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-material/compiled_resources2.gyp index 8a45bef..8f07067 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-material/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-material/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-menu-button/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-menu-button/compiled_resources2.gyp index f34f559..6c44ac7c 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-menu-button/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-menu-button/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-menu/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-menu/compiled_resources2.gyp index e2ca7eb..2ba914f 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-menu/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-menu/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-progress/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-progress/compiled_resources2.gyp index d91ad0c..c19cd714 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-progress/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-progress/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-radio-button/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-radio-button/compiled_resources2.gyp index cd72897e..b578aad 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-radio-button/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-radio-button/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-radio-group/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-radio-group/compiled_resources2.gyp index 4b5ab72..b443926 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-radio-group/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-radio-group/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-ripple/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-ripple/compiled_resources2.gyp index 28384825..7a0dab8 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-ripple/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-ripple/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-slider/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-slider/compiled_resources2.gyp index 8639f45a..3f8d212 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-slider/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-slider/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-spinner/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-spinner/compiled_resources2.gyp index 281d664..5ad83d6 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-spinner/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-spinner/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-styles/classes/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-styles/classes/compiled_resources2.gyp index f7827d7..7af5206 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-styles/classes/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-styles/classes/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-styles/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-styles/compiled_resources2.gyp index af038b8..9c8b22c 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-styles/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-styles/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-tabs/compiled_resources2.gyp index fe704fe..e5756380 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tabs/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-tabs/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-toggle-button/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-toggle-button/compiled_resources2.gyp index 9e0785b..b143902e 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-toggle-button/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-toggle-button/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-toolbar/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-toolbar/compiled_resources2.gyp index 40c6a23..8f4d512 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-toolbar/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-toolbar/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tooltip/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/paper-tooltip/compiled_resources2.gyp index 7a9d239..ba04f9e2 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tooltip/compiled_resources2.gyp +++ b/third_party/polymer/v1_0/components-chromium/paper-tooltip/compiled_resources2.gyp
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2017 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. #
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt index f3433cbf..6fbf8b1 100644 --- a/third_party/polymer/v1_0/components_summary.txt +++ b/third_party/polymer/v1_0/components_summary.txt
@@ -132,9 +132,9 @@ Name: iron-overlay-behavior Repository: https://github.com/PolymerElements/iron-overlay-behavior.git -Tree: v1.8.6 -Revision: 4b579d7e47a19b3c1e5a65ee631bd432230b3610 -Tree link: https://github.com/PolymerElements/iron-overlay-behavior/tree/v1.8.6 +Tree: v1.10.2 +Revision: 27558b9ceeba7c670999818fc50eebe7e044ed5c +Tree link: https://github.com/PolymerElements/iron-overlay-behavior/tree/v1.10.2 Name: iron-pages Repository: https://github.com/PolymerElements/iron-pages.git
diff --git a/ui/file_manager/externs/compiled_resources2.gyp b/ui/file_manager/externs/compiled_resources2.gyp index 5db4c53..4054db0 100644 --- a/ui/file_manager/externs/compiled_resources2.gyp +++ b/ui/file_manager/externs/compiled_resources2.gyp
@@ -120,6 +120,14 @@ 'includes': ['../../../third_party/closure_compiler/include_js.gypi'], }, { + 'target_name': 'volume_info_list', + 'includes': ['../../../third_party/closure_compiler/include_js.gypi'], + }, + { + 'target_name': 'volume_manager', + 'includes': ['../../../third_party/closure_compiler/include_js.gypi'], + }, + { 'target_name': 'webview_tag', 'includes': ['../../../third_party/closure_compiler/include_js.gypi'], },
diff --git a/ui/file_manager/file_manager/background/js/compiled_resources2.gyp b/ui/file_manager/file_manager/background/js/compiled_resources2.gyp index 809df59..10dea42 100644 --- a/ui/file_manager/file_manager/background/js/compiled_resources2.gyp +++ b/ui/file_manager/file_manager/background/js/compiled_resources2.gyp
@@ -27,6 +27,14 @@ # 'target_name': 'duplicate_finder', # 'includes': ['../../../compile_js2.gypi'], # }, + { + 'target_name': 'entry_location_impl', + 'dependencies': [ + '../../../externs/compiled_resources2.gyp:entry_location', + '../../common/js/compiled_resources2.gyp:volume_manager_common', + ], + 'includes': ['../../../compile_js2.gypi'], + }, # { # 'target_name': 'file_operation_handler', # 'includes': ['../../../compile_js2.gypi'], @@ -99,9 +107,57 @@ # 'target_name': 'test_util_base', # 'includes': ['../../../compile_js2.gypi'], # }, -# { -# 'target_name': 'volume_manager', -# 'includes': ['../../../compile_js2.gypi'], -# }, + { + 'target_name': 'volume_info_impl', + 'dependencies': [ + '../../../externs/compiled_resources2.gyp:platform', + '../../../externs/compiled_resources2.gyp:volume_info', + '../../common/js/compiled_resources2.gyp:volume_manager_common', + ], + 'includes': ['../../../compile_js2.gypi'], + }, + { + 'target_name': 'volume_info_list_impl', + 'dependencies': [ + '../../../externs/compiled_resources2.gyp:volume_info', + '../../../externs/compiled_resources2.gyp:volume_info_list', + '../../common/js/compiled_resources2.gyp:util', + './compiled_resources2.gyp:volume_info_impl', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + '<(DEPTH)/ui/webui/resources/js/cr/compiled_resources2.gyp:ui', + '<(DEPTH)/ui/webui/resources/js/cr/ui/compiled_resources2.gyp:array_data_model', + ], + 'includes': ['../../../compile_js2.gypi'], + }, + { + 'target_name': 'volume_manager_impl', + 'dependencies': [ + '../../../externs/compiled_resources2.gyp:volume_manager', + '../../common/js/compiled_resources2.gyp:async_util', + 'volume_info_list_impl', + 'volume_manager_util', + 'entry_location_impl', + ], + 'includes': ['../../../compile_js2.gypi'], + }, + { + 'target_name': 'volume_manager_factory', + 'dependencies': [ + '../../../externs/compiled_resources2.gyp:volume_manager', + 'volume_manager_impl', + ], + 'includes': ['../../../compile_js2.gypi'], + }, + { + 'target_name': 'volume_manager_util', + 'dependencies': [ + '../../common/js/compiled_resources2.gyp:metrics', + '../../common/js/compiled_resources2.gyp:metrics_events', + '../../common/js/compiled_resources2.gyp:util', + '../../common/js/compiled_resources2.gyp:volume_manager_common', + 'volume_info_impl', + ], + 'includes': ['../../../compile_js2.gypi'], + }, ], }
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js index cb390ca..35ecd10 100644 --- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js +++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -673,7 +673,7 @@ var imagePromise = this.thumbnailModel_.get([entry]).then(function(metadata) { return new Promise(function(fulfill, reject) { var loader = new ThumbnailLoader( - entry, ThumbnailLoader.LoaderType.CANVAS, metadata[0]); + entry, ThumbnailLoader.LoaderType.IMAGE, metadata[0]); loader.loadDetachedImage(function(result) { if (result) fulfill(loader.getImage());
diff --git a/ui/webui/resources/js/cr/ui/compiled_resources2.gyp b/ui/webui/resources/js/cr/ui/compiled_resources2.gyp index afb4b27..130b899 100644 --- a/ui/webui/resources/js/cr/ui/compiled_resources2.gyp +++ b/ui/webui/resources/js/cr/ui/compiled_resources2.gyp
@@ -12,6 +12,14 @@ 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], }, { + 'target_name': 'array_data_model', + 'dependencies': [ + '../../compiled_resources2.gyp:cr', + '../compiled_resources2.gyp:event_target', + ], + 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { 'target_name': 'command', 'dependencies': [ '../../compiled_resources2.gyp:cr',
diff --git a/ui/webui/resources/polymer_resources.grdp b/ui/webui/resources/polymer_resources.grdp index fe687d1..9bb74052 100644 --- a/ui/webui/resources/polymer_resources.grdp +++ b/ui/webui/resources/polymer_resources.grdp
@@ -206,6 +206,12 @@ <structure name="IDR_POLYMER_1_0_IRON_META_IRON_META_HTML" file="../../../third_party/polymer/v1_0/components-chromium/iron-meta/iron-meta.html" type="chrome_html" /> + <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_FOCUSABLES_HELPER_EXTRACTED_JS" + file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper-extracted.js" + type="chrome_html" /> + <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_FOCUSABLES_HELPER_HTML" + file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.html" + type="chrome_html" /> <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BACKDROP_EXTRACTED_JS" file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-backdrop-extracted.js" type="chrome_html" /> @@ -515,15 +521,15 @@ <structure name="IDR_POLYMER_1_0_PAPER_ICON_BUTTON_PAPER_ICON_BUTTON_EXTRACTED_JS" file="../../../third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-extracted.js" type="chrome_html" /> - <structure name="IDR_POLYMER_1_0_PAPER_ICON_BUTTON_PAPER_ICON_BUTTON_HTML" - file="../../../third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button.html" - type="chrome_html" /> <structure name="IDR_POLYMER_1_0_PAPER_ICON_BUTTON_PAPER_ICON_BUTTON_LIGHT_EXTRACTED_JS" file="../../../third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light-extracted.js" type="chrome_html" /> <structure name="IDR_POLYMER_1_0_PAPER_ICON_BUTTON_PAPER_ICON_BUTTON_LIGHT_HTML" file="../../../third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button-light.html" type="chrome_html" /> + <structure name="IDR_POLYMER_1_0_PAPER_ICON_BUTTON_PAPER_ICON_BUTTON_HTML" + file="../../../third_party/polymer/v1_0/components-chromium/paper-icon-button/paper-icon-button.html" + type="chrome_html" /> <structure name="IDR_POLYMER_1_0_PAPER_INPUT_PAPER_INPUT_ADDON_BEHAVIOR_EXTRACTED_JS" file="../../../third_party/polymer/v1_0/components-chromium/paper-input/paper-input-addon-behavior-extracted.js" type="chrome_html" />