15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/shell/shell.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <commctrl.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <io.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/wrapped_window_proc.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/app/resource.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/hwnd_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWindowTitle[] = L"Content Shell";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWindowClass[] = L"CONTENT_SHELL";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kButtonWidth = 72;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kURLBarHeight = 24;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxURLLength = 1024;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HINSTANCE Shell::instance_handle_;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::PlatformInitialize(const gfx::Size& default_window_size) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _setmode(_fileno(stdout), _O_BINARY);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _setmode(_fileno(stderr), _O_BINARY);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INITCOMMONCONTROLSEX InitCtrlEx;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCtrlEx.dwICC  = ICC_STANDARD_CLASSES;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCommonControlsEx(&InitCtrlEx);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterWindowClass();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformExit() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Shell*> windows = windows_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<Shell*>::iterator it = windows.begin();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != windows.end(); ++it)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DestroyWindow((*it)->window_);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformCleanUp() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the window is destroyed, tell the Edit field to forget about us,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise we will crash.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SetWindowProc(url_edit_view_, default_edit_wnd_proc_);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SetWindowUserData(url_edit_view_, NULL);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformEnableUIControl(UIControl control, bool is_enabled) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (control) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BACK_BUTTON:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDC_NAV_BACK;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FORWARD_BUTTON:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDC_NAV_FORWARD;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STOP_BUTTON:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id = IDC_NAV_STOP;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown UI control";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableWindow(GetDlgItem(window_, id), is_enabled);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformSetAddressBarURL(const GURL& url) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring url_string = UTF8ToWide(url.spec());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendMessage(url_edit_view_, WM_SETTEXT, 0,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              reinterpret_cast<LPARAM>(url_string.c_str()));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformSetIsLoading(bool loading) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformCreateWindow(int width, int height) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_ = CreateWindow(kWindowClass, kWindowTitle,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         NULL, NULL, instance_handle_, NULL);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SetWindowUserData(window_, this);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND hwnd;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hwnd = CreateWindow(L"BUTTON", L"Back",
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      x, 0, kButtonWidth, kURLBarHeight,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      window_, (HMENU) IDC_NAV_BACK, instance_handle_, 0);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x += kButtonWidth;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hwnd = CreateWindow(L"BUTTON", L"Forward",
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      x, 0, kButtonWidth, kURLBarHeight,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      window_, (HMENU) IDC_NAV_FORWARD, instance_handle_, 0);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x += kButtonWidth;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hwnd = CreateWindow(L"BUTTON", L"Reload",
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      x, 0, kButtonWidth, kURLBarHeight,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      window_, (HMENU) IDC_NAV_RELOAD, instance_handle_, 0);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x += kButtonWidth;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hwnd = CreateWindow(L"BUTTON", L"Stop",
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      x, 0, kButtonWidth, kURLBarHeight,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      window_, (HMENU) IDC_NAV_STOP, instance_handle_, 0);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x += kButtonWidth;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This control is positioned by PlatformResizeSubViews.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_edit_view_ = CreateWindow(L"EDIT", 0,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT |
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ES_AUTOVSCROLL | ES_AUTOHSCROLL,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                x, 0, 0, 0, window_, 0, instance_handle_, 0);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_edit_wnd_proc_ = ui::SetWindowProc(url_edit_view_,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             Shell::EditWndProc);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SetWindowUserData(url_edit_view_, this);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowWindow(window_, SW_SHOW);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SizeTo(width, height);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformSetContents() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetParent(web_contents_->GetView()->GetNativeView(), window_);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SizeTo(int width, int height) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rc, rw;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClientRect(window_, &rc);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWindowRect(window_, &rw);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int client_width = rc.right - rc.left;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_width = rw.right - rw.left;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_width = (window_width - client_width) + width;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int client_height = rc.bottom - rc.top;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int window_height = rw.bottom - rw.top;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_height = (window_height - client_height) + height;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add space for the url bar.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_height += kURLBarHeight;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetWindowPos(window_, NULL, 0, 0, window_width, window_height,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SWP_NOMOVE | SWP_NOZORDER);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformResizeSubViews() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rc;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClientRect(window_, &rc);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x = kButtonWidth * 4;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MoveWindow(url_edit_view_, x, 0, rc.right - x, kURLBarHeight, TRUE);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MoveWindow(GetContentView(), 0, kURLBarHeight, rc.right,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             rc.bottom - kURLBarHeight, TRUE);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Close() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DestroyWindow(window_);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ATOM Shell::RegisterWindowClass() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WNDCLASSEX window_class;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::InitializeWindowClass(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWindowClass,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Shell::WndProc,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CS_HREDRAW | CS_VREDRAW,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadCursor(NULL, IDC_ARROW),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MAKEINTRESOURCE(IDC_CONTENTSHELL),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &window_class);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_handle_ = window_class.hInstance;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterClassEx(&window_class);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LRESULT CALLBACK Shell::WndProc(HWND hwnd, UINT message, WPARAM wParam,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                LPARAM lParam) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* shell = static_cast<Shell*>(ui::GetWindowUserData(hwnd));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (message) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_COMMAND: {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int id = LOWORD(wParam);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (id) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDM_NEW_WINDOW:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateNewWindow(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              shell->web_contents()->GetBrowserContext(),
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GURL(), NULL, MSG_ROUTING_NONE, gfx::Size());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDM_CLOSE_WINDOW:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DestroyWindow(hwnd);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDM_EXIT:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PlatformExit();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDM_SHOW_DEVELOPER_TOOLS:
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->ShowDevTools();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDC_NAV_BACK:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->GoBackOrForward(-1);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDC_NAV_FORWARD:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->GoBackOrForward(1);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDC_NAV_RELOAD:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->Reload();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case IDC_NAV_STOP:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->Stop();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_DESTROY: {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete shell;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_SIZE: {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (shell->GetContentView())
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        shell->PlatformResizeSubViews();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_WINDOWPOSCHANGED: {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Notify the content view that the window position of its parent window
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // has been changed by sending window message
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeView native_view = shell->GetContentView();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (native_view) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SendMessage(native_view, message, wParam, lParam);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DefWindowProc(hwnd, message, wParam, lParam);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LRESULT CALLBACK Shell::EditWndProc(HWND hwnd, UINT message,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    WPARAM wParam, LPARAM lParam) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* shell = static_cast<Shell*>(ui::GetWindowUserData(hwnd));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (message) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_CHAR:
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (wParam == VK_RETURN) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wchar_t str[kMaxURLLength + 1];  // Leave room for adding a NULL;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *(str) = kMaxURLLength;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LRESULT str_len = SendMessage(hwnd, EM_GETLINE, 0, (LPARAM)str);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (str_len > 0) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          str[str_len] = 0;  // EM_GETLINE doesn't NULL terminate.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL url(str);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!url.has_scheme())
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            url = GURL(std::wstring(L"http://") + std::wstring(str));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shell->LoadURL(url);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CallWindowProc(shell->default_edit_wnd_proc_, hwnd, message, wParam,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        lParam);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::PlatformSetTitle(const string16& text) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::SetWindowText(window_, text.c_str());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
286