Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Unified Diff: ios/chrome/browser/ui/toolbar/web_toolbar_controller_unittest.mm

Issue 2588733002: Upstream Chrome on iOS source code [9/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/toolbar/web_toolbar_controller_unittest.mm
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller_unittest.mm b/ios/chrome/browser/ui/toolbar/web_toolbar_controller_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..cd917a7f5647f082565afec61ecbeb3bbbce83a1
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller_unittest.mm
@@ -0,0 +1,221 @@
+// Copyright 2012 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.
+
+#import "ios/chrome/browser/ui/toolbar/web_toolbar_controller.h"
+
+#import <Foundation/Foundation.h>
+
+#include <memory>
+
+#include "base/ios/ios_util.h"
+#include "base/mac/scoped_nsobject.h"
+#include "base/message_loop/message_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/ui/toolbar/test_toolbar_model_ios.h"
+#import "ios/chrome/browser/ui/toolbar/web_toolbar_controller_private.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+#include "ios/chrome/test/block_cleanup_test.h"
+#include "ios/web/public/test/test_web_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+
+@interface UIView (SubViewTesting)
+- (NSMutableArray*)allSubviews;
+@end
+
+@implementation UIView (SubViewTesting)
+- (NSMutableArray*)allSubviews {
+ NSMutableArray* views = [NSMutableArray array];
+ [views addObject:self];
+ for (UIView* subview in [self subviews]) {
+ [views addObjectsFromArray:[subview allSubviews]];
+ }
+ return views;
+}
+@end
+
+@interface WebToolbarController (TestingAdditions)
+- (void)layoutOmnibox;
+@end
+
+#pragma mark -
+
+namespace {
+
+class WebToolbarControllerTest : public BlockCleanupTest {
+ protected:
+ void SetUp() override {
+ BlockCleanupTest::SetUp();
+
+ TestChromeBrowserState::Builder test_cbs_builder;
+ chrome_browser_state_ = test_cbs_builder.Build();
+ // Set some text in the ToolbarModel so that OmniboxView uses the
+ // ToolbarModel's icon instead of the OmniboxEditModel's icon.
+ toolbar_model_ios_.reset(new TestToolbarModelIOS());
+ toolbar_model_ = (TestToolbarModel*)toolbar_model_ios_->GetToolbarModel();
+ toolbar_model_->set_text(base::UTF8ToUTF16("foo"));
+
+ // The OCMOCK_VALUE macro doesn't like std::unique_ptr, but it works just
+ // fine if a temporary variable is used.
+ ToolbarModelIOS* model_for_mock = toolbar_model_ios_.get();
+ id delegate =
+ [OCMockObject niceMockForProtocol:@protocol(WebToolbarDelegate)];
+ [[[delegate stub] andReturnValue:OCMOCK_VALUE(model_for_mock)]
+ toolbarModelIOS];
+
+ id urlLoader = [OCMockObject niceMockForProtocol:@protocol(UrlLoader)];
+
+ // Create the WebToolbarController using the test objects.
+ web_toolbar_controller_.reset([[WebToolbarController alloc]
+ initWithDelegate:delegate
+ urlLoader:urlLoader
+ browserState:chrome_browser_state_.get()
+ preloadProvider:nil]);
+ [web_toolbar_controller_ setUnitTesting:YES];
+ }
+ void TearDown() override {
+ web_toolbar_controller_.reset();
+ BlockCleanupTest::TearDown();
+ }
+
+ web::TestWebThreadBundle thread_bundle_;
+ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+ TestToolbarModel* toolbar_model_; // weak. Owned by toolbar_model_ios_.
+ std::unique_ptr<TestToolbarModelIOS> toolbar_model_ios_;
+ base::scoped_nsobject<WebToolbarController> web_toolbar_controller_;
+};
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_NavigationButtonsEnabled) {
+ EXPECT_FALSE([web_toolbar_controller_ isForwardButtonEnabled]);
+ EXPECT_FALSE([web_toolbar_controller_ isBackButtonEnabled]);
+ toolbar_model_ios_->set_can_go_back(true);
+ toolbar_model_ios_->set_can_go_forward(true);
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_TRUE([web_toolbar_controller_ isForwardButtonEnabled]);
+ EXPECT_TRUE([web_toolbar_controller_ isBackButtonEnabled]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_NavigationButtonsDisabled) {
+ EXPECT_FALSE([web_toolbar_controller_ isForwardButtonEnabled]);
+ EXPECT_FALSE([web_toolbar_controller_ isBackButtonEnabled]);
+ toolbar_model_ios_->set_can_go_back(false);
+ toolbar_model_ios_->set_can_go_forward(false);
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_FALSE([web_toolbar_controller_ isForwardButtonEnabled]);
+ EXPECT_FALSE([web_toolbar_controller_ isBackButtonEnabled]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_StarButton) {
+ // Test tablet only, as star button doesn't get used on phone.
+ if (!IsIPadIdiom())
+ return;
+ EXPECT_FALSE([web_toolbar_controller_ isStarButtonSelected]);
+ // Set the curent tab to |kWebUrl| and create a bookmark for |kWebUrl|, then
+ // verify that updateToolbar selected the star button.
+ toolbar_model_ios_->set_is_current_tab_bookmarked(true);
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_TRUE([web_toolbar_controller_ isStarButtonSelected]);
+
+ // Remove the bookmark and verify updateToolbar unselects the star button.
+ toolbar_model_ios_->set_is_current_tab_bookmarked(false);
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_FALSE([web_toolbar_controller_ isStarButtonSelected]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_ProgressBarLoading) {
+ // Test phone only, as iPad does not have a progress bar.
+ if (IsIPadIdiom())
+ return;
+ EXPECT_FALSE([web_toolbar_controller_ isLoading]);
+ toolbar_model_ios_->set_is_loading(true);
+ [web_toolbar_controller_ updateToolbarState];
+ // Spin the run loop to allow animation to occur.
+ [[NSRunLoop currentRunLoop]
+ runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
+ EXPECT_TRUE([web_toolbar_controller_ isLoading]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_ProgressBarNotLoading) {
+ // Test phone only, as iPad does not have a progress bar.
+ if (IsIPadIdiom())
+ return;
+ EXPECT_FALSE([web_toolbar_controller_ isLoading]);
+ toolbar_model_ios_->set_is_loading(false);
+ [web_toolbar_controller_ updateToolbarState];
+ // Spin the run loop to allow animation to occur.
+ [[NSRunLoop currentRunLoop]
+ runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
+ EXPECT_FALSE([web_toolbar_controller_ isLoading]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_LoadProgressFraction) {
+ // Test phone only, as iPad does not have a progress bar.
+ if (IsIPadIdiom())
+ return;
+ CGFloat expectedProgress = 0.5;
+ toolbar_model_ios_->set_is_loading(true);
+ toolbar_model_ios_->set_load_progress_fraction(expectedProgress);
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_EQ(expectedProgress, [web_toolbar_controller_ loadProgressFraction]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_PrerenderingAnimation) {
+ // Test phone only, as iPad does not have a progress bar.
+ if (IsIPadIdiom())
+ return;
+
+ EXPECT_FALSE([web_toolbar_controller_ isLoading]);
+ EXPECT_FALSE([web_toolbar_controller_ isPrerenderAnimationRunning]);
+ [web_toolbar_controller_ showPrerenderingAnimation];
+ EXPECT_TRUE([web_toolbar_controller_ isPrerenderAnimationRunning]);
+ // |-updateToolbarState| does not cancel the animation.
+ [web_toolbar_controller_ updateToolbarState];
+ EXPECT_TRUE([web_toolbar_controller_ isPrerenderAnimationRunning]);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_WebUrlText) {
+ const char* kExpectedUrlText = "expected URL text";
+ toolbar_model_->set_text(base::UTF8ToUTF16(kExpectedUrlText));
+ [web_toolbar_controller_ updateToolbarState];
+ std::string actualUrlText = [web_toolbar_controller_ getLocationText];
+ EXPECT_EQ(kExpectedUrlText, actualUrlText);
+}
+
+TEST_F(WebToolbarControllerTest, TestUpdateToolbar_TestLayoutOmnibox) {
+ // Test that the initial setup of the toolbar matches the layout produced by
+ // calling layoutOmnibox. If the initial frames do not match those set during
+ // layoutOmnibox, there will be minor animations during startup.
+ typedef base::hash_map<unsigned long, CGRect> FrameHash;
+ typedef base::hash_map<unsigned long, CGRect>::iterator FrameHashIter;
+ FrameHash initialFrames;
+ FrameHash postLayoutFrames;
+
+ for (UIView* view in [[web_toolbar_controller_ view] allSubviews]) {
+ initialFrames.insert(std::make_pair<unsigned long, CGRect>(
+ (unsigned long)view, [view frame]));
+ }
+
+ [web_toolbar_controller_ layoutOmnibox];
+
+ for (UIView* view in [[web_toolbar_controller_ view] allSubviews]) {
+ postLayoutFrames.insert(std::make_pair<unsigned long, CGRect>(
+ (unsigned long)view, [view frame]));
+ }
+
+ FrameHashIter initialIt = initialFrames.begin();
+ while (initialIt != initialFrames.end()) {
+ FrameHashIter postLayoutIt = postLayoutFrames.find(initialIt->first);
+ EXPECT_TRUE(postLayoutIt != postLayoutFrames.end());
+ CGRect initialRect = initialIt->second;
+ CGRect layoutRect = postLayoutIt->second;
+ EXPECT_EQ(initialRect.origin.x, layoutRect.origin.x);
+ EXPECT_EQ(initialRect.origin.y, layoutRect.origin.y);
+ EXPECT_EQ(initialRect.size.width, layoutRect.size.width);
+ EXPECT_EQ(initialRect.size.height, layoutRect.size.height);
+ initialIt++;
+ }
+}
+} // namespace
« no previous file with comments | « ios/chrome/browser/ui/toolbar/web_toolbar_controller_private.h ('k') | ios/chrome/browser/ui/tools/README.md » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698