OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/frame/browser_frame_win.h" | 5 #include "chrome/browser/ui/views/frame/browser_frame_win.h" |
6 | 6 |
7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
8 #include <shellapi.h> | 8 #include <shellapi.h> |
9 | 9 |
10 #include <set> | 10 #include <set> |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/string_util.h" |
| 14 #include "base/utf_string_conversions.h" |
13 #include "base/win/metro.h" | 15 #include "base/win/metro.h" |
14 #include "chrome/app/chrome_command_ids.h" | 16 #include "chrome/app/chrome_command_ids.h" |
15 #include "chrome/browser/search_engines/template_url.h" | 17 #include "chrome/browser/search_engines/template_url.h" |
16 #include "chrome/browser/search_engines/template_url_service.h" | 18 #include "chrome/browser/search_engines/template_url_service.h" |
17 #include "chrome/browser/search_engines/template_url_service_factory.h" | 19 #include "chrome/browser/search_engines/template_url_service_factory.h" |
18 #include "chrome/browser/ui/browser_list.h" | 20 #include "chrome/browser/ui/browser_list.h" |
19 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" | 21 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" |
20 #include "chrome/browser/ui/views/frame/browser_view.h" | 22 #include "chrome/browser/ui/views/frame/browser_view.h" |
21 #include "chrome/browser/ui/views/frame/system_menu_model.h" | 23 #include "chrome/browser/ui/views/frame/system_menu_model.h" |
22 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" | 24 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" |
23 #include "chrome/common/chrome_constants.h" | 25 #include "chrome/common/chrome_constants.h" |
24 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
25 #include "content/public/browser/browser_accessibility_state.h" | 27 #include "content/public/browser/browser_accessibility_state.h" |
26 #include "content/public/browser/page_navigator.h" | 28 #include "content/public/browser/page_navigator.h" |
| 29 #include "content/public/browser/web_contents.h" |
27 #include "content/public/common/page_transition_types.h" | 30 #include "content/public/common/page_transition_types.h" |
| 31 #include "googleurl/src/gurl.h" |
28 #include "grit/generated_resources.h" | 32 #include "grit/generated_resources.h" |
29 #include "grit/theme_resources.h" | 33 #include "grit/theme_resources.h" |
30 #include "ui/base/models/simple_menu_model.h" | 34 #include "ui/base/models/simple_menu_model.h" |
31 #include "ui/base/theme_provider.h" | 35 #include "ui/base/theme_provider.h" |
32 #include "ui/gfx/font.h" | 36 #include "ui/gfx/font.h" |
33 #include "ui/views/controls/menu/native_menu_win.h" | 37 #include "ui/views/controls/menu/native_menu_win.h" |
34 #include "ui/views/views_delegate.h" | 38 #include "ui/views/views_delegate.h" |
35 #include "ui/views/widget/native_widget_win.h" | 39 #include "ui/views/widget/native_widget_win.h" |
36 #include "ui/views/widget/widget.h" | 40 #include "ui/views/widget/widget.h" |
37 #include "ui/views/window/non_client_view.h" | 41 #include "ui/views/window/non_client_view.h" |
38 #include "webkit/glue/window_open_disposition.h" | 42 #include "webkit/glue/window_open_disposition.h" |
39 | 43 |
40 #pragma comment(lib, "dwmapi.lib") | 44 #pragma comment(lib, "dwmapi.lib") |
41 | 45 |
42 // static | 46 // static |
43 static const int kClientEdgeThickness = 3; | 47 static const int kClientEdgeThickness = 3; |
44 static const int kTabDragWindowAlpha = 200; | 48 static const int kTabDragWindowAlpha = 200; |
45 // We need to offset the DWMFrame into the toolbar so that the blackness | 49 // We need to offset the DWMFrame into the toolbar so that the blackness |
46 // doesn't show up on our rounded corners. | 50 // doesn't show up on our rounded corners. |
47 static const int kDWMFrameTopOffset = 3; | 51 static const int kDWMFrameTopOffset = 3; |
48 // If not -1, windows are shown with this state. | 52 // If not -1, windows are shown with this state. |
49 static int explicit_show_state = -1; | 53 static int explicit_show_state = -1; |
50 | 54 |
51 using content::OpenURLParams; | 55 using content::OpenURLParams; |
52 using content::Referrer; | 56 using content::Referrer; |
| 57 using content::WebContents; |
| 58 |
| 59 namespace { |
| 60 |
| 61 void LocalAllocAndCopyString(const wchar_t* src, wchar_t** dest) { |
| 62 DCHECK(src); |
| 63 DCHECK(dest); |
| 64 |
| 65 size_t dest_size = (wcslen(src) + 1) * sizeof(wchar_t); |
| 66 *dest = reinterpret_cast<wchar_t*>(LocalAlloc(LPTR, dest_size)); |
| 67 base::wcslcpy(*dest, src, dest_size); |
| 68 } |
| 69 |
| 70 } // namespace |
53 | 71 |
54 /////////////////////////////////////////////////////////////////////////////// | 72 /////////////////////////////////////////////////////////////////////////////// |
55 // BrowserFrameWin, public: | 73 // BrowserFrameWin, public: |
56 | 74 |
57 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, | 75 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, |
58 BrowserView* browser_view) | 76 BrowserView* browser_view) |
59 : views::NativeWidgetWin(browser_frame), | 77 : views::NativeWidgetWin(browser_frame), |
60 browser_view_(browser_view), | 78 browser_view_(browser_view), |
61 browser_frame_(browser_frame), | 79 browser_frame_(browser_frame), |
62 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, | 80 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 | 219 |
202 void BrowserFrameWin::TabStripDisplayModeChanged() { | 220 void BrowserFrameWin::TabStripDisplayModeChanged() { |
203 UpdateDWMFrame(); | 221 UpdateDWMFrame(); |
204 } | 222 } |
205 | 223 |
206 LRESULT BrowserFrameWin::OnWndProc(UINT message, | 224 LRESULT BrowserFrameWin::OnWndProc(UINT message, |
207 WPARAM w_param, | 225 WPARAM w_param, |
208 LPARAM l_param) { | 226 LPARAM l_param) { |
209 static const UINT metro_navigation_search_message = | 227 static const UINT metro_navigation_search_message = |
210 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); | 228 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); |
211 if (message == metro_navigation_search_message) | |
212 HandleMetroRequest(w_param, l_param); | |
213 | 229 |
| 230 static const UINT metro_get_current_tab_info_message = |
| 231 RegisterWindowMessage(chrome::kMetroGetCurrentTabInfoMessage); |
| 232 |
| 233 if (message == metro_navigation_search_message) { |
| 234 HandleMetroNavSearchRequest(w_param, l_param); |
| 235 } else if (message == metro_get_current_tab_info_message) { |
| 236 GetMetroCurrentTabInfo(w_param); |
| 237 } |
214 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); | 238 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); |
215 } | 239 } |
216 | 240 |
217 /////////////////////////////////////////////////////////////////////////////// | 241 /////////////////////////////////////////////////////////////////////////////// |
218 // BrowserFrameWin, private: | 242 // BrowserFrameWin, private: |
219 | 243 |
220 void BrowserFrameWin::UpdateDWMFrame() { | 244 void BrowserFrameWin::UpdateDWMFrame() { |
221 // Nothing to do yet, or we're not showing a DWM frame. | 245 // Nothing to do yet, or we're not showing a DWM frame. |
222 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) | 246 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) |
223 return; | 247 return; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 | 324 |
301 void BrowserFrameWin::AddFrameToggleItems() { | 325 void BrowserFrameWin::AddFrameToggleItems() { |
302 if (CommandLine::ForCurrentProcess()->HasSwitch( | 326 if (CommandLine::ForCurrentProcess()->HasSwitch( |
303 switches::kDebugEnableFrameToggle)) { | 327 switches::kDebugEnableFrameToggle)) { |
304 system_menu_contents_->AddSeparator(); | 328 system_menu_contents_->AddSeparator(); |
305 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, | 329 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, |
306 L"Toggle Frame Type"); | 330 L"Toggle Frame Type"); |
307 } | 331 } |
308 } | 332 } |
309 | 333 |
310 void BrowserFrameWin::HandleMetroRequest(WPARAM w_param, LPARAM l_param) { | 334 void BrowserFrameWin::HandleMetroNavSearchRequest(WPARAM w_param, |
| 335 LPARAM l_param) { |
311 if (!base::win::GetMetroModule()) { | 336 if (!base::win::GetMetroModule()) { |
312 NOTREACHED() << "Received unexpected metro navigation request"; | 337 NOTREACHED() << "Received unexpected metro navigation request"; |
313 return; | 338 return; |
314 } | 339 } |
315 | 340 |
316 if (!w_param && !l_param) { | 341 if (!w_param && !l_param) { |
317 NOTREACHED() << "Invalid metro request parameters"; | 342 NOTREACHED() << "Invalid metro request parameters"; |
318 return; | 343 return; |
319 } | 344 } |
320 | 345 |
(...skipping 18 matching lines...) Expand all Loading... |
339 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, | 364 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, |
340 string16())); | 365 string16())); |
341 } | 366 } |
342 } | 367 } |
343 if (request_url.is_valid()) { | 368 if (request_url.is_valid()) { |
344 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, | 369 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, |
345 content::PAGE_TRANSITION_TYPED, false)); | 370 content::PAGE_TRANSITION_TYPED, false)); |
346 } | 371 } |
347 } | 372 } |
348 | 373 |
| 374 void BrowserFrameWin::GetMetroCurrentTabInfo(WPARAM w_param) { |
| 375 if (!base::win::GetMetroModule()) { |
| 376 NOTREACHED() << "Received unexpected metro request"; |
| 377 return; |
| 378 } |
| 379 |
| 380 if (!w_param) { |
| 381 NOTREACHED() << "Invalid metro request parameter"; |
| 382 return; |
| 383 } |
| 384 |
| 385 base::win::CurrentTabInfo* current_tab_info = |
| 386 reinterpret_cast<base::win::CurrentTabInfo*>(w_param); |
| 387 |
| 388 Browser* browser = browser_view()->browser(); |
| 389 DCHECK(browser); |
| 390 |
| 391 // We allocate memory for the title and url via LocalAlloc. The caller has to |
| 392 // free the memory via LocalFree. |
| 393 LocalAllocAndCopyString(browser->GetWindowTitleForCurrentTab().c_str(), |
| 394 ¤t_tab_info->title); |
| 395 |
| 396 WebContents* current_tab = browser->GetSelectedWebContents(); |
| 397 DCHECK(current_tab); |
| 398 |
| 399 LocalAllocAndCopyString(UTF8ToWide(current_tab->GetURL().spec()).c_str(), |
| 400 ¤t_tab_info->url); |
| 401 } |
| 402 |
349 | 403 |
350 //////////////////////////////////////////////////////////////////////////////// | 404 //////////////////////////////////////////////////////////////////////////////// |
351 // BrowserFrame, public: | 405 // BrowserFrame, public: |
352 | 406 |
353 // static | 407 // static |
354 const gfx::Font& BrowserFrame::GetTitleFont() { | 408 const gfx::Font& BrowserFrame::GetTitleFont() { |
355 static gfx::Font* title_font = | 409 static gfx::Font* title_font = |
356 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); | 410 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); |
357 return *title_font; | 411 return *title_font; |
358 } | 412 } |
359 | 413 |
360 //////////////////////////////////////////////////////////////////////////////// | 414 //////////////////////////////////////////////////////////////////////////////// |
361 // NativeBrowserFrame, public: | 415 // NativeBrowserFrame, public: |
362 | 416 |
363 // static | 417 // static |
364 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( | 418 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( |
365 BrowserFrame* browser_frame, | 419 BrowserFrame* browser_frame, |
366 BrowserView* browser_view) { | 420 BrowserView* browser_view) { |
367 return new BrowserFrameWin(browser_frame, browser_view); | 421 return new BrowserFrameWin(browser_frame, browser_view); |
368 } | 422 } |
OLD | NEW |