| Index: components/web_view/frame_apptest.cc | 
| diff --git a/components/web_view/frame_apptest.cc b/components/web_view/frame_apptest.cc | 
| deleted file mode 100644 | 
| index cd79680ee0ba2dc293ba741789f178bd6dcab746..0000000000000000000000000000000000000000 | 
| --- a/components/web_view/frame_apptest.cc | 
| +++ /dev/null | 
| @@ -1,579 +0,0 @@ | 
| -// 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. | 
| - | 
| -#include "components/web_view/frame.h" | 
| - | 
| -#include <stdint.h> | 
| -#include <utility> | 
| - | 
| -#include "base/bind.h" | 
| -#include "base/location.h" | 
| -#include "base/logging.h" | 
| -#include "base/macros.h" | 
| -#include "base/message_loop/message_loop.h" | 
| -#include "base/run_loop.h" | 
| -#include "base/test/test_timeouts.h" | 
| -#include "base/time/time.h" | 
| -#include "build/build_config.h" | 
| -#include "components/mus/public/cpp/window_observer.h" | 
| -#include "components/mus/public/cpp/window_tree_connection.h" | 
| -#include "components/mus/public/cpp/window_tree_delegate.h" | 
| -#include "components/mus/public/cpp/window_tree_host_factory.h" | 
| -#include "components/mus/public/interfaces/window_tree_host.mojom.h" | 
| -#include "components/web_view/frame_connection.h" | 
| -#include "components/web_view/frame_tree.h" | 
| -#include "components/web_view/frame_tree_delegate.h" | 
| -#include "components/web_view/frame_user_data.h" | 
| -#include "components/web_view/test_frame_tree_delegate.h" | 
| -#include "mojo/shell/public/cpp/application_test_base.h" | 
| - | 
| -using mus::Window; | 
| -using mus::WindowTreeConnection; | 
| - | 
| -namespace web_view { | 
| - | 
| -namespace { | 
| - | 
| -base::RunLoop* current_run_loop = nullptr; | 
| - | 
| -void TimeoutRunLoop(const base::Closure& timeout_task, bool* timeout) { | 
| -  CHECK(current_run_loop); | 
| -  *timeout = true; | 
| -  timeout_task.Run(); | 
| -} | 
| - | 
| -bool DoRunLoopWithTimeout() { | 
| -  if (current_run_loop != nullptr) | 
| -    return false; | 
| - | 
| -  bool timeout = false; | 
| -  base::RunLoop run_loop; | 
| -  base::MessageLoop::current()->PostDelayedTask( | 
| -      FROM_HERE, base::Bind(&TimeoutRunLoop, run_loop.QuitClosure(), &timeout), | 
| -      TestTimeouts::action_timeout()); | 
| - | 
| -  current_run_loop = &run_loop; | 
| -  current_run_loop->Run(); | 
| -  current_run_loop = nullptr; | 
| -  return !timeout; | 
| -} | 
| - | 
| -void QuitRunLoop() { | 
| -  current_run_loop->Quit(); | 
| -  current_run_loop = nullptr; | 
| -} | 
| - | 
| -}  // namespace | 
| - | 
| -void OnGotIdCallback(base::RunLoop* run_loop) { | 
| -  run_loop->Quit(); | 
| -} | 
| - | 
| -// Creates a new FrameConnection. This runs a nested message loop until the | 
| -// content handler id is obtained. | 
| -scoped_ptr<FrameConnection> CreateFrameConnection(mojo::Shell* shell, | 
| -                                                  const std::string& url) { | 
| -  scoped_ptr<FrameConnection> frame_connection(new FrameConnection); | 
| -  mojo::URLRequestPtr request(mojo::URLRequest::New()); | 
| -  request->url = mojo::String::From(url); | 
| -  base::RunLoop run_loop; | 
| -  frame_connection->Init(shell, std::move(request), | 
| -                         base::Bind(&OnGotIdCallback, &run_loop)); | 
| -  run_loop.Run(); | 
| -  return frame_connection; | 
| -} | 
| - | 
| -class TestFrameClient : public mojom::FrameClient { | 
| - public: | 
| -  TestFrameClient() | 
| -      : connect_count_(0), last_dispatch_load_event_frame_id_(0) {} | 
| -  ~TestFrameClient() override {} | 
| - | 
| -  int connect_count() const { return connect_count_; } | 
| - | 
| -  mojo::Array<mojom::FrameDataPtr> connect_frames() { | 
| -    return std::move(connect_frames_); | 
| -  } | 
| - | 
| -  mojo::Array<mojom::FrameDataPtr> adds() { return std::move(adds_); } | 
| - | 
| -  // Sets a callback to run once OnConnect() is received. | 
| -  void set_on_connect_callback(const base::Closure& closure) { | 
| -    on_connect_callback_ = closure; | 
| -  } | 
| - | 
| -  void set_on_loading_state_changed_callback(const base::Closure& closure) { | 
| -    on_loading_state_changed_callback_ = closure; | 
| -  } | 
| - | 
| -  void set_on_dispatch_load_event_callback(const base::Closure& closure) { | 
| -    on_dispatch_load_event_callback_ = closure; | 
| -  } | 
| - | 
| -  mojom::Frame* server_frame() { return server_frame_.get(); } | 
| - | 
| -  mojo::InterfaceRequest<mojom::Frame> GetServerFrameRequest() { | 
| -    return GetProxy(&server_frame_); | 
| -  } | 
| - | 
| -  void last_loading_state_changed_notification(uint32_t* frame_id, | 
| -                                               bool* loading) const { | 
| -    *frame_id = last_loading_state_changed_notification_.frame_id; | 
| -    *loading = last_loading_state_changed_notification_.loading; | 
| -  } | 
| - | 
| -  uint32_t last_dispatch_load_event_frame_id() const { | 
| -    return last_dispatch_load_event_frame_id_; | 
| -  } | 
| - | 
| -  base::TimeTicks last_navigation_start_time() const { | 
| -    return last_navigation_start_time_; | 
| -  } | 
| - | 
| -  // mojom::FrameClient: | 
| -  void OnConnect(mojom::FramePtr frame, | 
| -                 uint32_t change_id, | 
| -                 uint32_t window_id, | 
| -                 mojom::WindowConnectType window_connect_type, | 
| -                 mojo::Array<mojom::FrameDataPtr> frames, | 
| -                 int64_t navigation_start_time_ticks, | 
| -                 const OnConnectCallback& callback) override { | 
| -    connect_count_++; | 
| -    connect_frames_ = std::move(frames); | 
| -    if (frame) | 
| -      server_frame_ = std::move(frame); | 
| -    callback.Run(); | 
| -    if (!on_connect_callback_.is_null()) | 
| -      on_connect_callback_.Run(); | 
| - | 
| -    last_navigation_start_time_ = | 
| -        base::TimeTicks::FromInternalValue(navigation_start_time_ticks); | 
| -  } | 
| -  void OnFrameAdded(uint32_t change_id, mojom::FrameDataPtr frame) override { | 
| -    adds_.push_back(std::move(frame)); | 
| -  } | 
| -  void OnFrameRemoved(uint32_t change_id, uint32_t frame_id) override {} | 
| -  void OnFrameClientPropertyChanged(uint32_t frame_id, | 
| -                                    const mojo::String& name, | 
| -                                    mojo::Array<uint8_t> new_data) override {} | 
| -  void OnPostMessageEvent(uint32_t source_frame_id, | 
| -                          uint32_t target_frame_id, | 
| -                          mojom::HTMLMessageEventPtr event) override {} | 
| -  void OnWillNavigate(const mojo::String& origin, | 
| -                      const OnWillNavigateCallback& callback) override { | 
| -    callback.Run(); | 
| -  } | 
| -  void OnFrameLoadingStateChanged(uint32_t frame_id, bool loading) override { | 
| -    last_loading_state_changed_notification_.frame_id = frame_id; | 
| -    last_loading_state_changed_notification_.loading = loading; | 
| - | 
| -    if (!on_loading_state_changed_callback_.is_null()) | 
| -      on_loading_state_changed_callback_.Run(); | 
| -  } | 
| -  void OnDispatchFrameLoadEvent(uint32_t frame_id) override { | 
| -    last_dispatch_load_event_frame_id_ = frame_id; | 
| - | 
| -    if (!on_dispatch_load_event_callback_.is_null()) | 
| -      on_dispatch_load_event_callback_.Run(); | 
| -  } | 
| -  void Find(int32_t request_id, | 
| -            const mojo::String& search_text, | 
| -            mojom::FindOptionsPtr options, | 
| -            bool wrap_within_frame, | 
| -            const FindCallback& callback) override {} | 
| -  void StopFinding(bool clear_selection) override {} | 
| -  void HighlightFindResults(int32_t request_id, | 
| -                            const mojo::String& search_test, | 
| -                            mojom::FindOptionsPtr options, | 
| -                            bool reset) override {} | 
| -  void StopHighlightingFindResults() override {} | 
| - | 
| - private: | 
| -  struct LoadingStateChangedNotification { | 
| -    LoadingStateChangedNotification() : frame_id(0), loading(false) {} | 
| -    ~LoadingStateChangedNotification() {} | 
| - | 
| -    uint32_t frame_id; | 
| -    bool loading; | 
| -  }; | 
| - | 
| -  int connect_count_; | 
| -  mojo::Array<mojom::FrameDataPtr> connect_frames_; | 
| -  mojom::FramePtr server_frame_; | 
| -  mojo::Array<mojom::FrameDataPtr> adds_; | 
| -  base::Closure on_connect_callback_; | 
| -  base::Closure on_loading_state_changed_callback_; | 
| -  base::Closure on_dispatch_load_event_callback_; | 
| -  LoadingStateChangedNotification last_loading_state_changed_notification_; | 
| -  uint32_t last_dispatch_load_event_frame_id_; | 
| -  base::TimeTicks last_navigation_start_time_; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(TestFrameClient); | 
| -}; | 
| - | 
| -class FrameTest; | 
| - | 
| -// WindowAndFrame maintains the Window and TestFrameClient associated with | 
| -// a single FrameClient. In other words this maintains the data structures | 
| -// needed to represent a client side frame. To obtain one use | 
| -// FrameTest::WaitForViewAndFrame(). | 
| -class WindowAndFrame : public mus::WindowTreeDelegate { | 
| - public: | 
| -  ~WindowAndFrame() override { | 
| -    if (window_) | 
| -      delete window_->connection(); | 
| -  } | 
| - | 
| -  // The Window associated with the frame. | 
| -  mus::Window* window() { return window_; } | 
| -  TestFrameClient* test_frame_client() { return &test_frame_tree_client_; } | 
| -  mojom::Frame* server_frame() { | 
| -    return test_frame_tree_client_.server_frame(); | 
| -  } | 
| - | 
| - private: | 
| -  friend class FrameTest; | 
| - | 
| -  WindowAndFrame() | 
| -      : window_(nullptr), frame_client_binding_(&test_frame_tree_client_) {} | 
| - | 
| -  void set_window(Window* window) { window_ = window; } | 
| - | 
| -  // Runs a message loop until the window and frame data have been received. | 
| -  void WaitForViewAndFrame() { run_loop_.Run(); } | 
| - | 
| -  mojo::InterfaceRequest<mojom::Frame> GetServerFrameRequest() { | 
| -    return test_frame_tree_client_.GetServerFrameRequest(); | 
| -  } | 
| - | 
| -  mojom::FrameClientPtr GetFrameClientPtr() { | 
| -    return frame_client_binding_.CreateInterfacePtrAndBind(); | 
| -  } | 
| - | 
| -  void Bind(mojo::InterfaceRequest<mojom::FrameClient> request) { | 
| -    ASSERT_FALSE(frame_client_binding_.is_bound()); | 
| -    test_frame_tree_client_.set_on_connect_callback( | 
| -        base::Bind(&WindowAndFrame::OnGotConnect, base::Unretained(this))); | 
| -    frame_client_binding_.Bind(std::move(request)); | 
| -  } | 
| - | 
| -  void OnGotConnect() { QuitRunLoopIfNecessary(); } | 
| - | 
| -  void QuitRunLoopIfNecessary() { | 
| -    if (window_ && test_frame_tree_client_.connect_count()) | 
| -      run_loop_.Quit(); | 
| -  } | 
| - | 
| -  // Overridden from WindowTreeDelegate: | 
| -  void OnEmbed(Window* root) override { | 
| -    window_ = root; | 
| -    QuitRunLoopIfNecessary(); | 
| -  } | 
| -  void OnConnectionLost(WindowTreeConnection* connection) override { | 
| -    window_ = nullptr; | 
| -  } | 
| - | 
| -  mus::Window* window_; | 
| -  base::RunLoop run_loop_; | 
| -  TestFrameClient test_frame_tree_client_; | 
| -  mojo::Binding<mojom::FrameClient> frame_client_binding_; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(WindowAndFrame); | 
| -}; | 
| - | 
| -class FrameTest : public mojo::test::ApplicationTestBase, | 
| -                  public mojo::ShellClient, | 
| -                  public mus::WindowTreeDelegate, | 
| -                  public mojo::InterfaceFactory<mus::mojom::WindowTreeClient>, | 
| -                  public mojo::InterfaceFactory<mojom::FrameClient> { | 
| - public: | 
| -  FrameTest() : most_recent_connection_(nullptr), window_manager_(nullptr) {} | 
| - | 
| -  WindowTreeConnection* most_recent_connection() { | 
| -    return most_recent_connection_; | 
| -  } | 
| - | 
| - protected: | 
| -  WindowTreeConnection* window_manager() { return window_manager_; } | 
| -  TestFrameTreeDelegate* frame_tree_delegate() { | 
| -    return frame_tree_delegate_.get(); | 
| -  } | 
| -  FrameTree* frame_tree() { return frame_tree_.get(); } | 
| -  WindowAndFrame* root_window_and_frame() { | 
| -    return root_window_and_frame_.get(); | 
| -  } | 
| - | 
| -  scoped_ptr<WindowAndFrame> NavigateFrameWithStartTime( | 
| -      WindowAndFrame* window_and_frame, | 
| -      base::TimeTicks navigation_start_time) { | 
| -    mojo::URLRequestPtr request(mojo::URLRequest::New()); | 
| -    request->url = mojo::String::From(shell_url()); | 
| -    request->originating_time_ticks = navigation_start_time.ToInternalValue(); | 
| -    window_and_frame->server_frame()->RequestNavigate( | 
| -        mojom::NavigationTargetType::EXISTING_FRAME, | 
| -        window_and_frame->window()->id(), std::move(request)); | 
| -    return WaitForViewAndFrame(); | 
| -  } | 
| - | 
| -  scoped_ptr<WindowAndFrame> NavigateFrame(WindowAndFrame* window_and_frame) { | 
| -    return NavigateFrameWithStartTime(window_and_frame, base::TimeTicks()); | 
| -  } | 
| - | 
| -  // Creates a new shared frame as a child of |parent|. | 
| -  scoped_ptr<WindowAndFrame> CreateChildWindowAndFrame(WindowAndFrame* parent) { | 
| -    mus::Window* child_frame_window = | 
| -        parent->window()->connection()->NewWindow(); | 
| -    parent->window()->AddChild(child_frame_window); | 
| - | 
| -    scoped_ptr<WindowAndFrame> window_and_frame(new WindowAndFrame); | 
| -    window_and_frame->set_window(child_frame_window); | 
| - | 
| -    mojo::Map<mojo::String, mojo::Array<uint8_t>> client_properties; | 
| -    client_properties.mark_non_null(); | 
| -    parent->server_frame()->OnCreatedFrame( | 
| -        window_and_frame->GetServerFrameRequest(), | 
| -        window_and_frame->GetFrameClientPtr(), child_frame_window->id(), | 
| -        std::move(client_properties)); | 
| -    frame_tree_delegate()->WaitForCreateFrame(); | 
| -    return HasFatalFailure() ? nullptr : std::move(window_and_frame); | 
| -  } | 
| - | 
| -  // Runs a message loop until the data necessary to represent to a client side | 
| -  // frame has been obtained. | 
| -  scoped_ptr<WindowAndFrame> WaitForViewAndFrame() { | 
| -    DCHECK(!window_and_frame_); | 
| -    window_and_frame_.reset(new WindowAndFrame); | 
| -    window_and_frame_->WaitForViewAndFrame(); | 
| -    return std::move(window_and_frame_); | 
| -  } | 
| - | 
| - private: | 
| -  // ApplicationTestBase: | 
| -  mojo::ShellClient* GetShellClient() override { return this; } | 
| - | 
| -  // mojo::ShellClient implementation. | 
| -  bool AcceptConnection(mojo::Connection* connection) override { | 
| -    connection->AddService<mus::mojom::WindowTreeClient>(this); | 
| -    connection->AddService<mojom::FrameClient>(this); | 
| -    return true; | 
| -  } | 
| - | 
| -  // Overridden from WindowTreeDelegate: | 
| -  void OnEmbed(Window* root) override { | 
| -    most_recent_connection_ = root->connection(); | 
| -    QuitRunLoop(); | 
| -  } | 
| -  void OnConnectionLost(WindowTreeConnection* connection) override {} | 
| - | 
| -  // Overridden from testing::Test: | 
| -  void SetUp() override { | 
| -    ApplicationTestBase::SetUp(); | 
| - | 
| -    mus::CreateWindowTreeHost(shell(), this, &host_, nullptr); | 
| - | 
| -    ASSERT_TRUE(DoRunLoopWithTimeout()); | 
| -    std::swap(window_manager_, most_recent_connection_); | 
| - | 
| -    // Creates a FrameTree, which creates a single frame. Wait for the | 
| -    // FrameClient to be connected to. | 
| -    frame_tree_delegate_.reset(new TestFrameTreeDelegate(shell())); | 
| -    scoped_ptr<FrameConnection> frame_connection = | 
| -        CreateFrameConnection(shell(), shell_url()); | 
| -    mojom::FrameClient* frame_client = frame_connection->frame_client(); | 
| -    mus::mojom::WindowTreeClientPtr window_tree_client = | 
| -        frame_connection->GetWindowTreeClient(); | 
| -    mus::Window* frame_root_view = window_manager()->NewWindow(); | 
| -    (*window_manager()->GetRoots().begin())->AddChild(frame_root_view); | 
| -    frame_tree_.reset(new FrameTree( | 
| -        0u, frame_root_view, std::move(window_tree_client), | 
| -        frame_tree_delegate_.get(), frame_client, std::move(frame_connection), | 
| -        Frame::ClientPropertyMap(), base::TimeTicks::Now())); | 
| -    root_window_and_frame_ = WaitForViewAndFrame(); | 
| -  } | 
| - | 
| -  // Overridden from testing::Test: | 
| -  void TearDown() override { | 
| -    root_window_and_frame_.reset(); | 
| -    frame_tree_.reset(); | 
| -    frame_tree_delegate_.reset(); | 
| -    ApplicationTestBase::TearDown(); | 
| -  } | 
| - | 
| -  // Overridden from mojo::InterfaceFactory<mus::mojom::WindowTreeClient>: | 
| -  void Create( | 
| -      mojo::Connection* connection, | 
| -      mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request) override { | 
| -    if (window_and_frame_) { | 
| -      mus::WindowTreeConnection::Create( | 
| -          window_and_frame_.get(), std::move(request), | 
| -          mus::WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED); | 
| -    } else { | 
| -      mus::WindowTreeConnection::Create( | 
| -          this, std::move(request), | 
| -          mus::WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED); | 
| -    } | 
| -  } | 
| - | 
| -  // Overridden from mojo::InterfaceFactory<mojom::FrameClient>: | 
| -  void Create(mojo::Connection* connection, | 
| -              mojo::InterfaceRequest<mojom::FrameClient> request) override { | 
| -    ASSERT_TRUE(window_and_frame_); | 
| -    window_and_frame_->Bind(std::move(request)); | 
| -  } | 
| - | 
| -  scoped_ptr<TestFrameTreeDelegate> frame_tree_delegate_; | 
| -  scoped_ptr<FrameTree> frame_tree_; | 
| -  scoped_ptr<WindowAndFrame> root_window_and_frame_; | 
| - | 
| -  mus::mojom::WindowTreeHostPtr host_; | 
| - | 
| -  // Used to receive the most recent window manager loaded by an embed action. | 
| -  WindowTreeConnection* most_recent_connection_; | 
| -  // The Window Manager connection held by the window manager (app running at | 
| -  // the | 
| -  // root window). | 
| -  WindowTreeConnection* window_manager_; | 
| - | 
| -  scoped_ptr<WindowAndFrame> window_and_frame_; | 
| - | 
| -  MOJO_DISALLOW_COPY_AND_ASSIGN(FrameTest); | 
| -}; | 
| - | 
| -// Verifies the FrameData supplied to the root FrameClient::OnConnect(). | 
| -TEST_F(FrameTest, RootFrameClientConnectData) { | 
| -  mojo::Array<mojom::FrameDataPtr> frames = | 
| -      root_window_and_frame()->test_frame_client()->connect_frames(); | 
| -  ASSERT_EQ(1u, frames.size()); | 
| -  EXPECT_EQ(root_window_and_frame()->window()->id(), frames[0]->frame_id); | 
| -  EXPECT_EQ(0u, frames[0]->parent_id); | 
| -} | 
| - | 
| -// Verifies the FrameData supplied to a child FrameClient::OnConnect(). | 
| -// Crashes on linux_chromium_rel_ng only. http://crbug.com/567337 | 
| -#if defined(OS_LINUX) | 
| -#define MAYBE_ChildFrameClientConnectData DISABLED_ChildFrameClientConnectData | 
| -#else | 
| -#define MAYBE_ChildFrameClientConnectData ChildFrameClientConnectData | 
| -#endif | 
| -TEST_F(FrameTest, MAYBE_ChildFrameClientConnectData) { | 
| -  scoped_ptr<WindowAndFrame> child_view_and_frame( | 
| -      CreateChildWindowAndFrame(root_window_and_frame())); | 
| -  ASSERT_TRUE(child_view_and_frame); | 
| -  // Initially created child frames don't get OnConnect(). | 
| -  EXPECT_EQ(0, child_view_and_frame->test_frame_client()->connect_count()); | 
| - | 
| -  scoped_ptr<WindowAndFrame> navigated_child_view_and_frame = | 
| -      NavigateFrame(child_view_and_frame.get()); | 
| - | 
| -  mojo::Array<mojom::FrameDataPtr> frames_in_child = | 
| -      navigated_child_view_and_frame->test_frame_client()->connect_frames(); | 
| -  EXPECT_EQ(child_view_and_frame->window()->id(), | 
| -            navigated_child_view_and_frame->window()->id()); | 
| -  // We expect 2 frames. One for the root, one for the child. | 
| -  ASSERT_EQ(2u, frames_in_child.size()); | 
| -  EXPECT_EQ(frame_tree()->root()->id(), frames_in_child[0]->frame_id); | 
| -  EXPECT_EQ(0u, frames_in_child[0]->parent_id); | 
| -  EXPECT_EQ(navigated_child_view_and_frame->window()->id(), | 
| -            frames_in_child[1]->frame_id); | 
| -  EXPECT_EQ(frame_tree()->root()->id(), frames_in_child[1]->parent_id); | 
| -} | 
| - | 
| -TEST_F(FrameTest, OnViewEmbeddedInFrameDisconnected) { | 
| -  scoped_ptr<WindowAndFrame> child_view_and_frame( | 
| -      CreateChildWindowAndFrame(root_window_and_frame())); | 
| -  ASSERT_TRUE(child_view_and_frame); | 
| - | 
| -  scoped_ptr<WindowAndFrame> navigated_child_view_and_frame = | 
| -      NavigateFrame(child_view_and_frame.get()); | 
| - | 
| -  // Delete the WindowTreeConnection for the child, which should trigger | 
| -  // notification. | 
| -  delete navigated_child_view_and_frame->window()->connection(); | 
| -  ASSERT_EQ(1u, frame_tree()->root()->children().size()); | 
| -  ASSERT_NO_FATAL_FAILURE(frame_tree_delegate()->WaitForFrameDisconnected( | 
| -      frame_tree()->root()->children()[0])); | 
| -  ASSERT_EQ(1u, frame_tree()->root()->children().size()); | 
| -} | 
| - | 
| -TEST_F(FrameTest, NotifyRemoteParentWithLoadingState) { | 
| -  scoped_ptr<WindowAndFrame> child_view_and_frame( | 
| -      CreateChildWindowAndFrame(root_window_and_frame())); | 
| -  uint32_t child_frame_id = child_view_and_frame->window()->id(); | 
| - | 
| -  { | 
| -    base::RunLoop run_loop; | 
| -    root_window_and_frame() | 
| -        ->test_frame_client() | 
| -        ->set_on_loading_state_changed_callback(run_loop.QuitClosure()); | 
| - | 
| -    child_view_and_frame->server_frame()->LoadingStateChanged(true, .5); | 
| - | 
| -    run_loop.Run(); | 
| - | 
| -    uint32_t frame_id = 0; | 
| -    bool loading = false; | 
| -    root_window_and_frame() | 
| -        ->test_frame_client() | 
| -        ->last_loading_state_changed_notification(&frame_id, &loading); | 
| -    EXPECT_EQ(child_frame_id, frame_id); | 
| -    EXPECT_TRUE(loading); | 
| -  } | 
| -  { | 
| -    base::RunLoop run_loop; | 
| -    root_window_and_frame() | 
| -        ->test_frame_client() | 
| -        ->set_on_loading_state_changed_callback(run_loop.QuitClosure()); | 
| - | 
| -    ASSERT_TRUE(child_view_and_frame); | 
| -    ASSERT_TRUE(child_view_and_frame->server_frame()); | 
| - | 
| -    child_view_and_frame->server_frame()->LoadingStateChanged(false, 1); | 
| - | 
| -    run_loop.Run(); | 
| - | 
| -    uint32_t frame_id = 0; | 
| -    bool loading = false; | 
| -    root_window_and_frame() | 
| -        ->test_frame_client() | 
| -        ->last_loading_state_changed_notification(&frame_id, &loading); | 
| -    EXPECT_EQ(child_frame_id, frame_id); | 
| -    EXPECT_FALSE(loading); | 
| -  } | 
| -} | 
| - | 
| -TEST_F(FrameTest, NotifyRemoteParentWithLoadEvent) { | 
| -  scoped_ptr<WindowAndFrame> child_view_and_frame( | 
| -      CreateChildWindowAndFrame(root_window_and_frame())); | 
| -  uint32_t child_frame_id = child_view_and_frame->window()->id(); | 
| - | 
| -  base::RunLoop run_loop; | 
| -  root_window_and_frame() | 
| -      ->test_frame_client() | 
| -      ->set_on_dispatch_load_event_callback(run_loop.QuitClosure()); | 
| - | 
| -  child_view_and_frame->server_frame()->DispatchLoadEventToParent(); | 
| - | 
| -  run_loop.Run(); | 
| - | 
| -  uint32_t frame_id = root_window_and_frame() | 
| -                          ->test_frame_client() | 
| -                          ->last_dispatch_load_event_frame_id(); | 
| -  EXPECT_EQ(child_frame_id, frame_id); | 
| -} | 
| - | 
| -TEST_F(FrameTest, PassAlongNavigationStartTime) { | 
| -  scoped_ptr<WindowAndFrame> child_view_and_frame( | 
| -      CreateChildWindowAndFrame(root_window_and_frame())); | 
| -  ASSERT_TRUE(child_view_and_frame); | 
| - | 
| -  base::TimeTicks navigation_start_time = base::TimeTicks::FromInternalValue(1); | 
| -  scoped_ptr<WindowAndFrame> navigated_child_view_and_frame = | 
| -      NavigateFrameWithStartTime(child_view_and_frame.get(), | 
| -                                 navigation_start_time); | 
| -  EXPECT_EQ(navigation_start_time, | 
| -            navigated_child_view_and_frame->test_frame_client() | 
| -                ->last_navigation_start_time()); | 
| -} | 
| - | 
| -}  // namespace web_view | 
|  |