summaryrefslogtreecommitdiffstats
path: root/content/shell/shell.cc
blob: 71baa6629016efe3c47ad10eff379796a190884d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright (c) 2011 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 "content/shell/shell.h"

#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/string_util.h"
#include "content/browser/tab_contents/navigation_controller.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "ui/gfx/size.h"

#if defined(OS_WIN)
#include "content/browser/tab_contents/tab_contents_view_win.h"
#endif

// Content area size for newly created windows.
static const int kTestWindowWidth = 800;
static const int kTestWindowHeight = 600;

namespace content {

std::vector<Shell*> Shell::windows_;

Shell::Shell()
    : window_(NULL),
      url_edit_view_(NULL)
#if defined(OS_WIN)
      , default_edit_wnd_proc_(0)
#endif
  {
    windows_.push_back(this);
}

Shell::~Shell() {
  PlatformCleanUp();

  for (size_t i = 0; i < windows_.size(); ++i) {
    if (windows_[i] == this) {
      windows_.erase(windows_.begin() + i);
      break;
    }
  }
}

Shell* Shell::CreateNewWindow(content::BrowserContext* browser_context,
                              const GURL& url,
                              SiteInstance* site_instance,
                              int routing_id,
                              TabContents* base_tab_contents) {
  Shell* shell = new Shell();
  shell->PlatformCreateWindow(kTestWindowWidth, kTestWindowHeight);

  shell->tab_contents_.reset(new TabContents(
      browser_context,
      site_instance,
      routing_id,
      base_tab_contents,
      NULL));
  shell->tab_contents_->SetDelegate(shell);

#if defined(OS_WIN)
  TabContentsViewWin* view =
      static_cast<TabContentsViewWin*>(shell->tab_contents_->GetView());
  view->SetParent(shell->window_);
#endif

  shell->PlatformResizeSubViews();

  if (!url.is_empty())
    shell->LoadURL(url);
  return shell;
}

void Shell::LoadURL(const GURL& url) {
  tab_contents_->GetController().LoadURL(
      url,
      content::Referrer(),
      content::PAGE_TRANSITION_TYPED,
      std::string());
  tab_contents_->Focus();
}

void Shell::GoBackOrForward(int offset) {
  tab_contents_->GetController().GoToOffset(offset);
  tab_contents_->Focus();
}

void Shell::Reload() {
  tab_contents_->GetController().Reload(false);
  tab_contents_->Focus();
}

void Shell::Stop() {
  tab_contents_->Stop();
  tab_contents_->Focus();
}

void Shell::UpdateNavigationControls() {
  int current_index = tab_contents_->GetController().GetCurrentEntryIndex();
  int max_index = tab_contents_->GetController().GetEntryCount() - 1;

  PlatformEnableUIControl(BACK_BUTTON, current_index > 0);
  PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index);
  PlatformEnableUIControl(STOP_BUTTON, tab_contents_->IsLoading());
}

gfx::NativeView Shell::GetContentView() {
  if (!tab_contents_.get())
    return NULL;
  return tab_contents_->GetNativeView();
}

void Shell::LoadingStateChanged(WebContents* source) {
  UpdateNavigationControls();
}

void Shell::DidNavigateMainFramePostCommit(WebContents* tab) {
  PlatformSetAddressBarURL(tab->GetURL());
}

void Shell::UpdatePreferredSize(WebContents* source,
                                const gfx::Size& pref_size) {
  PlatformSizeTo(pref_size.width(), pref_size.height());
}

}  // namespace content