diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/automation/automation_provider.cc | 35 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider.h | 18 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider_observers.cc | 40 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider_observers.h | 27 | ||||
-rw-r--r-- | chrome/browser/browser.cc | 5 | ||||
-rw-r--r-- | chrome/browser/browser_encoding_uitest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/download/download_uitest.cc | 25 | ||||
-rw-r--r-- | chrome/browser/download/save_page_uitest.cc | 2 | ||||
-rw-r--r-- | chrome/browser/history/multipart_uitest.cc | 10 |
9 files changed, 129 insertions, 37 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index 93ad3d5..bd341a6 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -213,11 +213,6 @@ NotificationObserver* AutomationProvider::AddNavigationStatusListener( return observer; } -void AutomationProvider::RemoveNavigationStatusListener( - NotificationObserver* obs) { - notification_observer_list_.RemoveObserver(obs); -} - NotificationObserver* AutomationProvider::AddTabStripObserver( Browser* parent, IPC::Message* reply_message) { @@ -228,7 +223,7 @@ NotificationObserver* AutomationProvider::AddTabStripObserver( return observer; } -void AutomationProvider::RemoveTabStripObserver(NotificationObserver* obs) { +void AutomationProvider::RemoveObserver(NotificationObserver* obs) { notification_observer_list_.RemoveObserver(obs); } @@ -496,6 +491,9 @@ void AutomationProvider::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(AutomationMsg_SetEnableExtensionAutomation, SetEnableExtensionAutomation) #endif + IPC_MESSAGE_HANDLER_DELAY_REPLY( + AutomationMsg_WaitForDownloadShelfVisibilityChange, + WaitForDownloadShelfVisibilityChange) IPC_MESSAGE_HANDLER(AutomationMsg_SetShelfVisibility, SetShelfVisibility) IPC_MESSAGE_HANDLER(AutomationMsg_BlockedPopupCount, GetBlockedPopupCount) IPC_MESSAGE_HANDLER(AutomationMsg_SelectAll, SelectAll) @@ -599,7 +597,7 @@ void AutomationProvider::AppendTab(int handle, const GURL& url, if (append_tab_response < 0) { // The append tab failed. Remove the TabStripObserver if (observer) { - RemoveTabStripObserver(observer); + RemoveObserver(observer); delete observer; } @@ -1591,6 +1589,29 @@ void AutomationProvider::RemoveBookmark(int handle, *success = false; } +void AutomationProvider::WaitForDownloadShelfVisibilityChange( + int browser_handle, + bool visibility, + IPC::Message* reply_message) { + bool success = false; + if (browser_tracker_->ContainsHandle(browser_handle)) { + Browser* browser = browser_tracker_->GetResource(browser_handle); + if (browser->window()->IsDownloadShelfVisible() == visibility) { + success = true; + } else { + notification_observer_list_.AddObserver( + new DownloadShelfVisibilityObserver(this, + browser, + visibility, + reply_message)); + return; + } + } + AutomationMsg_WaitForDownloadShelfVisibilityChange::WriteReplyParams( + reply_message, success); + Send(reply_message); +} + // Sample json input: { "command": "GetHistoryInfo", // "search_text": "some text" } // Refer chrome/test/pyautolib/history_info.py for sample json output. diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 5662835..bf53b36 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -79,22 +79,21 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, // complete, the completed_response object is sent; if the server requires // authentication, we instead send the auth_needed_response object. A pointer // to the added navigation observer is returned. This object should NOT be - // deleted and should be released by calling the corresponding - // RemoveNavigationStatusListener method. + // deleted and should be released by calling the RemoveObserver method. NotificationObserver* AddNavigationStatusListener( NavigationController* tab, IPC::Message* reply_message, int number_of_navigations, bool include_current_navigation); - void RemoveNavigationStatusListener(NotificationObserver* obs); - // Add an observer for the TabStrip. Currently only Tab append is observed. A // navigation listener is created on successful notification of tab append. A // pointer to the added navigation observer is returned. This object should - // NOT be deleted and should be released by calling the corresponding - // RemoveTabStripObserver method. + // NOT be deleted and should be released by calling the RemoveObserver method. NotificationObserver* AddTabStripObserver(Browser* parent, IPC::Message* reply_message); - void RemoveTabStripObserver(NotificationObserver* obs); + + // Remove an observer. The |NotificationObserver| still needs to be deleted + // afterwards. + void RemoveObserver(NotificationObserver* obs); // Get the index of a particular NavigationController object // in the given parent window. This method uses @@ -334,6 +333,11 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, int64 id, bool* success); + // Wait for the download shelf to appear or disappear. + void WaitForDownloadShelfVisibilityChange(int browser_handle, + bool visibility, + IPC::Message* reply_message); + // Get info about downloads. This includes only ones that have been // registered by the history system. // Uses the JSON interface for input/output. diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index 3ca82e6..c6343c0 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -10,6 +10,7 @@ #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/automation/automation_provider.h" #include "chrome/browser/bookmarks/bookmark_model.h" +#include "chrome/browser/browser_window.h" #include "chrome/browser/dom_operation_notification_details.h" #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/extensions/extension_process_manager.h" @@ -159,7 +160,7 @@ NavigationNotificationObserver::~NavigationNotificationObserver() { reply_message_ = NULL; } - automation_->RemoveNavigationStatusListener(this); + automation_->RemoveObserver(this); } void NavigationNotificationObserver::Observe( @@ -234,7 +235,7 @@ void TabStripNotificationObserver::Observe(NotificationType type, ObserveTab(Source<NavigationController>(source).ptr()); // If verified, no need to observe anymore - automation_->RemoveTabStripObserver(this); + automation_->RemoveObserver(this); delete this; } else { NOTREACHED(); @@ -821,7 +822,7 @@ DocumentPrintedNotificationObserver::~DocumentPrintedNotificationObserver() { DCHECK(reply_message_ != NULL); AutomationMsg_PrintNow::WriteReplyParams(reply_message_, success_); automation_->Send(reply_message_); - automation_->RemoveNavigationStatusListener(this); + automation_->RemoveObserver(this); } void DocumentPrintedNotificationObserver::Observe( @@ -907,6 +908,39 @@ void LoginManagerObserver::Observe(NotificationType type, } #endif +DownloadShelfVisibilityObserver::DownloadShelfVisibilityObserver( + AutomationProvider* automation, + Browser* browser, + bool visibility, + IPC::Message* reply_message) + : automation_(automation), + visibility_(visibility), + reply_message_(reply_message) { + registrar_.Add(this, NotificationType::DOWNLOAD_SHELF_VISIBILITY_CHANGED, + Source<Browser>(browser)); +} + +DownloadShelfVisibilityObserver::~DownloadShelfVisibilityObserver() { +} + +void DownloadShelfVisibilityObserver::Observe( + NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + if (type == NotificationType::DOWNLOAD_SHELF_VISIBILITY_CHANGED) { + Browser* browser = Source<Browser>(source).ptr(); + if (browser->window()->IsDownloadShelfVisible() == visibility_) { + AutomationMsg_WaitForDownloadShelfVisibilityChange::WriteReplyParams( + reply_message_, true); + automation_->Send(reply_message_); + automation_->RemoveObserver(this); + delete this; + } + } else { + NOTREACHED(); + } +} + AutomationProviderBookmarkModelObserver::AutomationProviderBookmarkModelObserver( AutomationProvider* provider, IPC::Message* reply_message, diff --git a/chrome/browser/automation/automation_provider_observers.h b/chrome/browser/automation/automation_provider_observers.h index efb01e0..e6e434e 100644 --- a/chrome/browser/automation/automation_provider_observers.h +++ b/chrome/browser/automation/automation_provider_observers.h @@ -488,6 +488,29 @@ class LoginManagerObserver : public NotificationObserver { }; #endif +// Waits for the download shelf to appear or disappear +// (depending on |visibility|). +class DownloadShelfVisibilityObserver : public NotificationObserver { + public: + DownloadShelfVisibilityObserver(AutomationProvider* automation, + Browser* browser, + bool visiblity, + IPC::Message* reply_message); + ~DownloadShelfVisibilityObserver(); + + // NotificationObserver interface. + virtual void Observe(NotificationType type, const NotificationSource& source, + const NotificationDetails& details); + + private: + NotificationRegistrar registrar_; + AutomationProvider* automation_; + bool visibility_; + IPC::Message* reply_message_; + + DISALLOW_COPY_AND_ASSIGN(DownloadShelfVisibilityObserver); +}; + // Waits for the bookmark model to load. class AutomationProviderBookmarkModelObserver : BookmarkModelObserver { public: @@ -536,8 +559,8 @@ class AutomationProviderBookmarkModelObserver : BookmarkModelObserver { // When asked for pending downloads, the DownloadManager places // results in a DownloadManager::Observer. -class AutomationProviderDownloadManagerObserver : - public DownloadManager::Observer { +class AutomationProviderDownloadManagerObserver + : public DownloadManager::Observer { public: AutomationProviderDownloadManagerObserver() : DownloadManager::Observer() {} virtual ~AutomationProviderDownloadManagerObserver() {} diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 60217ad..4770c59 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -2626,6 +2626,11 @@ void Browser::UpdateTargetURL(TabContents* source, const GURL& url) { void Browser::UpdateDownloadShelfVisibility(bool visible) { if (GetStatusBubble()) GetStatusBubble()->UpdateDownloadShelfVisibility(visible); + + NotificationService::current()->Notify( + NotificationType::DOWNLOAD_SHELF_VISIBILITY_CHANGED, + Source<Browser>(this), + NotificationService::NoDetails()); } void Browser::ContentsZoomChange(bool zoom_in) { diff --git a/chrome/browser/browser_encoding_uitest.cc b/chrome/browser/browser_encoding_uitest.cc index 3c0531b..df856c7 100644 --- a/chrome/browser/browser_encoding_uitest.cc +++ b/chrome/browser/browser_encoding_uitest.cc @@ -148,7 +148,7 @@ TEST_F(BrowserEncodingTest, TestOverrideEncoding) { SavePackage::SAVE_AS_COMPLETE_HTML)); scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); ASSERT_TRUE(browser.get()); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); FilePath expected_file_name = FilePath().AppendASCII(kOverrideTestDir); expected_file_name = expected_file_name.AppendASCII(kExpectedFileName); CheckFile(full_file_name, expected_file_name, true); @@ -284,7 +284,7 @@ TEST_F(BrowserEncodingTest, TestEncodingAutoDetect) { kTestDatas[i].expected_result); EXPECT_TRUE(tab->SavePage(full_saved_file_name, temp_sub_resource_dir_, SavePackage::SAVE_AS_COMPLETE_HTML)); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); CheckFile(full_saved_file_name, expected_result_file_name, true); } } diff --git a/chrome/browser/download/download_uitest.cc b/chrome/browser/download/download_uitest.cc index b8171fa..011a54c 100644 --- a/chrome/browser/download/download_uitest.cc +++ b/chrome/browser/download/download_uitest.cc @@ -112,7 +112,7 @@ class DownloadTest : public UITest { // TODO(tc): check download status text // Make sure the download shelf is showing. - EXPECT_TRUE(WaitForDownloadShelfVisible(window.get())); + EXPECT_TRUE(window->WaitForDownloadShelfVisibilityChange(true)); } FilePath filename; @@ -187,7 +187,7 @@ TEST_F(DownloadTest, FLAKY_DownloadMimeType) { scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); ASSERT_TRUE(browser.get()); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); } // Access a file with a viewable mime-type, verify that a download @@ -213,7 +213,7 @@ TEST_F(DownloadTest, FLAKY_NoDownload) { scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); ASSERT_TRUE(browser.get()); - EXPECT_FALSE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_FALSE(browser->WaitForDownloadShelfVisibilityChange(true)); } // Download a 0-size file with a content-disposition header, verify that the @@ -233,7 +233,7 @@ TEST_F(DownloadTest, FLAKY_ContentDisposition) { // Ensure the download shelf is visible on the window. scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); ASSERT_TRUE(browser.get()); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); } // Test that the download shelf is per-window by starting a download in one @@ -254,7 +254,7 @@ TEST_F(DownloadTest, FLAKY_PerWindowShelf) { // Ensure the download shelf is visible on the window. scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); ASSERT_TRUE(browser.get()); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); // Open a second tab ASSERT_TRUE(browser->AppendTab(GURL())); @@ -262,7 +262,7 @@ TEST_F(DownloadTest, FLAKY_PerWindowShelf) { // Hide shelf EXPECT_TRUE(browser->SetShelfVisible(false)); - EXPECT_TRUE(WaitForDownloadShelfInvisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(false)); // Go to first tab EXPECT_TRUE(browser->ActivateTab(0)); @@ -336,7 +336,7 @@ TEST_F(DownloadTest, FLAKY_IncognitoDownload) { ASSERT_TRUE(tab->NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(file))); // Verify that the download shelf is showing for the Incognito window. - EXPECT_TRUE(WaitForDownloadShelfVisible(incognito.get())); + EXPECT_TRUE(incognito->WaitForDownloadShelfVisibilityChange(true)); // Close the Incognito window and don't crash. ASSERT_TRUE(incognito->RunCommand(IDC_CLOSE_WINDOW)); @@ -385,8 +385,9 @@ TEST_F(DownloadTest, FLAKY_CloseNewTab1) { ASSERT_TRUE(tab_proxy->NavigateToURLAsyncWithDisposition( URLRequestMockHTTPJob::GetMockUrl(file), NEW_BACKGROUND_TAB)); + // When the download starts, we should still have one tab. - ASSERT_TRUE(WaitForDownloadShelfVisible(browser)); + ASSERT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); EXPECT_EQ(1, GetTabCount()); CheckDownload(file); @@ -410,7 +411,7 @@ TEST_F(DownloadTest, FLAKY_DontCloseNewTab2) { FilePath file(FILE_PATH_LITERAL("download-test1.lib")); ASSERT_TRUE(tab_proxy->NavigateToURLAsync(GURL("javascript:openNew()"))); - ASSERT_TRUE(WaitForDownloadShelfVisible(browser)); + ASSERT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); EXPECT_EQ(2, GetTabCount()); CheckDownload(file); @@ -437,7 +438,7 @@ TEST_F(DownloadTest, FLAKY_DontCloseNewTab3) { ASSERT_TRUE(tab_proxy->NavigateToURLAsync( URLRequestMockHTTPJob::GetMockUrl(file))); - ASSERT_TRUE(WaitForDownloadShelfVisible(browser)); + ASSERT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); EXPECT_EQ(2, GetTabCount()); CheckDownload(file); @@ -461,7 +462,7 @@ TEST_F(DownloadTest, FLAKY_CloseNewTab2) { FilePath file(FILE_PATH_LITERAL("download-test1.lib")); ASSERT_TRUE(tab_proxy->NavigateToURLAsync(GURL("javascript:openNew()"))); - ASSERT_TRUE(WaitForDownloadShelfVisible(browser)); + ASSERT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); EXPECT_EQ(1, GetTabCount()); CheckDownload(file); @@ -486,7 +487,7 @@ TEST_F(DownloadTest, FLAKY_CloseNewTab3) { ASSERT_TRUE(tab_proxy->NavigateToURLAsync( GURL("javascript:document.getElementById('form').submit()"))); - ASSERT_TRUE(WaitForDownloadShelfVisible(browser)); + ASSERT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); EXPECT_EQ(1, GetTabCount()); CheckDownload(file); diff --git a/chrome/browser/download/save_page_uitest.cc b/chrome/browser/download/save_page_uitest.cc index 07fd78c..c9de08b 100644 --- a/chrome/browser/download/save_page_uitest.cc +++ b/chrome/browser/download/save_page_uitest.cc @@ -84,7 +84,7 @@ TEST_F(SavePageTest, CleanFilenameFromPageTitle) { ASSERT_TRUE(browser.get()); automation()->SavePackageShouldPromptUser(false); EXPECT_TRUE(browser->RunCommandAsync(IDC_SAVE_PAGE)); - EXPECT_TRUE(WaitForDownloadShelfVisible(browser.get())); + EXPECT_TRUE(browser->WaitForDownloadShelfVisibilityChange(true)); automation()->SavePackageShouldPromptUser(true); CheckFile(full_file_name, file_name); diff --git a/chrome/browser/history/multipart_uitest.cc b/chrome/browser/history/multipart_uitest.cc index 7f8688f..9a50fe3c 100644 --- a/chrome/browser/history/multipart_uitest.cc +++ b/chrome/browser/history/multipart_uitest.cc @@ -15,11 +15,16 @@ namespace { class MultipartResponseUITest : public UITest { }; -#if defined(NDEBUG) // http://code.google.com/p/chromium/issues/detail?id=37746 // Running this test only for release builds as it fails in debug test // runs -TEST_F(MultipartResponseUITest, SingleVisit) { +#if defined(NDEBUG) +#define MAYBE_SingleVisit SingleVisit +#else +#define MAYBE_SingleVisit DISABLED_SingleVisit +#endif + +TEST_F(MultipartResponseUITest, MAYBE_SingleVisit) { // Make sure that visiting a multipart/x-mixed-replace site only // creates one entry in the visits table. const wchar_t kDocRoot[] = L"chrome/test/data"; @@ -56,6 +61,5 @@ TEST_F(MultipartResponseUITest, SingleVisit) { } db.Close(); } -#endif } // namespace |