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