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" | |
15 #include "base/win/metro.h" | 13 #include "base/win/metro.h" |
16 #include "chrome/app/chrome_command_ids.h" | 14 #include "chrome/app/chrome_command_ids.h" |
17 #include "chrome/browser/search_engines/template_url.h" | 15 #include "chrome/browser/search_engines/template_url.h" |
18 #include "chrome/browser/search_engines/template_url_service.h" | 16 #include "chrome/browser/search_engines/template_url_service.h" |
19 #include "chrome/browser/search_engines/template_url_service_factory.h" | 17 #include "chrome/browser/search_engines/template_url_service_factory.h" |
20 #include "chrome/browser/ui/browser_list.h" | 18 #include "chrome/browser/ui/browser_list.h" |
21 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" | 19 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" |
22 #include "chrome/browser/ui/views/frame/browser_view.h" | 20 #include "chrome/browser/ui/views/frame/browser_view.h" |
23 #include "chrome/browser/ui/views/frame/system_menu_model.h" | 21 #include "chrome/browser/ui/views/frame/system_menu_model.h" |
24 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" | 22 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" |
25 #include "chrome/common/chrome_constants.h" | 23 #include "chrome/common/chrome_constants.h" |
26 #include "chrome/common/chrome_switches.h" | 24 #include "chrome/common/chrome_switches.h" |
27 #include "content/public/browser/browser_accessibility_state.h" | 25 #include "content/public/browser/browser_accessibility_state.h" |
28 #include "content/public/browser/page_navigator.h" | 26 #include "content/public/browser/page_navigator.h" |
29 #include "content/public/browser/web_contents.h" | |
30 #include "content/public/common/page_transition_types.h" | 27 #include "content/public/common/page_transition_types.h" |
31 #include "googleurl/src/gurl.h" | |
32 #include "grit/generated_resources.h" | 28 #include "grit/generated_resources.h" |
33 #include "grit/theme_resources.h" | 29 #include "grit/theme_resources.h" |
34 #include "ui/base/models/simple_menu_model.h" | 30 #include "ui/base/models/simple_menu_model.h" |
35 #include "ui/base/theme_provider.h" | 31 #include "ui/base/theme_provider.h" |
36 #include "ui/gfx/font.h" | 32 #include "ui/gfx/font.h" |
37 #include "ui/views/controls/menu/native_menu_win.h" | 33 #include "ui/views/controls/menu/native_menu_win.h" |
38 #include "ui/views/views_delegate.h" | 34 #include "ui/views/views_delegate.h" |
39 #include "ui/views/widget/native_widget_win.h" | 35 #include "ui/views/widget/native_widget_win.h" |
40 #include "ui/views/widget/widget.h" | 36 #include "ui/views/widget/widget.h" |
41 #include "ui/views/window/non_client_view.h" | 37 #include "ui/views/window/non_client_view.h" |
42 #include "webkit/glue/window_open_disposition.h" | 38 #include "webkit/glue/window_open_disposition.h" |
43 | 39 |
44 #pragma comment(lib, "dwmapi.lib") | 40 #pragma comment(lib, "dwmapi.lib") |
45 | 41 |
46 // static | 42 // static |
47 static const int kClientEdgeThickness = 3; | 43 static const int kClientEdgeThickness = 3; |
48 static const int kTabDragWindowAlpha = 200; | 44 static const int kTabDragWindowAlpha = 200; |
49 // We need to offset the DWMFrame into the toolbar so that the blackness | 45 // We need to offset the DWMFrame into the toolbar so that the blackness |
50 // doesn't show up on our rounded corners. | 46 // doesn't show up on our rounded corners. |
51 static const int kDWMFrameTopOffset = 3; | 47 static const int kDWMFrameTopOffset = 3; |
52 // If not -1, windows are shown with this state. | 48 // If not -1, windows are shown with this state. |
53 static int explicit_show_state = -1; | 49 static int explicit_show_state = -1; |
54 | 50 |
55 using content::OpenURLParams; | 51 using content::OpenURLParams; |
56 using content::Referrer; | 52 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 | |
71 | 53 |
72 /////////////////////////////////////////////////////////////////////////////// | 54 /////////////////////////////////////////////////////////////////////////////// |
73 // BrowserFrameWin, public: | 55 // BrowserFrameWin, public: |
74 | 56 |
75 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, | 57 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, |
76 BrowserView* browser_view) | 58 BrowserView* browser_view) |
77 : views::NativeWidgetWin(browser_frame), | 59 : views::NativeWidgetWin(browser_frame), |
78 browser_view_(browser_view), | 60 browser_view_(browser_view), |
79 browser_frame_(browser_frame), | 61 browser_frame_(browser_frame), |
80 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, | 62 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 201 |
220 void BrowserFrameWin::TabStripDisplayModeChanged() { | 202 void BrowserFrameWin::TabStripDisplayModeChanged() { |
221 UpdateDWMFrame(); | 203 UpdateDWMFrame(); |
222 } | 204 } |
223 | 205 |
224 LRESULT BrowserFrameWin::OnWndProc(UINT message, | 206 LRESULT BrowserFrameWin::OnWndProc(UINT message, |
225 WPARAM w_param, | 207 WPARAM w_param, |
226 LPARAM l_param) { | 208 LPARAM l_param) { |
227 static const UINT metro_navigation_search_message = | 209 static const UINT metro_navigation_search_message = |
228 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); | 210 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); |
| 211 if (message == metro_navigation_search_message) |
| 212 HandleMetroRequest(w_param, l_param); |
229 | 213 |
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 } | |
238 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); | 214 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); |
239 } | 215 } |
240 | 216 |
241 /////////////////////////////////////////////////////////////////////////////// | 217 /////////////////////////////////////////////////////////////////////////////// |
242 // BrowserFrameWin, private: | 218 // BrowserFrameWin, private: |
243 | 219 |
244 void BrowserFrameWin::UpdateDWMFrame() { | 220 void BrowserFrameWin::UpdateDWMFrame() { |
245 // Nothing to do yet, or we're not showing a DWM frame. | 221 // Nothing to do yet, or we're not showing a DWM frame. |
246 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) | 222 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) |
247 return; | 223 return; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 | 300 |
325 void BrowserFrameWin::AddFrameToggleItems() { | 301 void BrowserFrameWin::AddFrameToggleItems() { |
326 if (CommandLine::ForCurrentProcess()->HasSwitch( | 302 if (CommandLine::ForCurrentProcess()->HasSwitch( |
327 switches::kDebugEnableFrameToggle)) { | 303 switches::kDebugEnableFrameToggle)) { |
328 system_menu_contents_->AddSeparator(); | 304 system_menu_contents_->AddSeparator(); |
329 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, | 305 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, |
330 L"Toggle Frame Type"); | 306 L"Toggle Frame Type"); |
331 } | 307 } |
332 } | 308 } |
333 | 309 |
334 void BrowserFrameWin::HandleMetroNavSearchRequest(WPARAM w_param, | 310 void BrowserFrameWin::HandleMetroRequest(WPARAM w_param, LPARAM l_param) { |
335 LPARAM l_param) { | |
336 if (!base::win::GetMetroModule()) { | 311 if (!base::win::GetMetroModule()) { |
337 NOTREACHED() << "Received unexpected metro navigation request"; | 312 NOTREACHED() << "Received unexpected metro navigation request"; |
338 return; | 313 return; |
339 } | 314 } |
340 | 315 |
341 if (!w_param && !l_param) { | 316 if (!w_param && !l_param) { |
342 NOTREACHED() << "Invalid metro request parameters"; | 317 NOTREACHED() << "Invalid metro request parameters"; |
343 return; | 318 return; |
344 } | 319 } |
345 | 320 |
(...skipping 18 matching lines...) Expand all Loading... |
364 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, | 339 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, |
365 string16())); | 340 string16())); |
366 } | 341 } |
367 } | 342 } |
368 if (request_url.is_valid()) { | 343 if (request_url.is_valid()) { |
369 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, | 344 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, |
370 content::PAGE_TRANSITION_TYPED, false)); | 345 content::PAGE_TRANSITION_TYPED, false)); |
371 } | 346 } |
372 } | 347 } |
373 | 348 |
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 | |
403 | 349 |
404 //////////////////////////////////////////////////////////////////////////////// | 350 //////////////////////////////////////////////////////////////////////////////// |
405 // BrowserFrame, public: | 351 // BrowserFrame, public: |
406 | 352 |
407 // static | 353 // static |
408 const gfx::Font& BrowserFrame::GetTitleFont() { | 354 const gfx::Font& BrowserFrame::GetTitleFont() { |
409 static gfx::Font* title_font = | 355 static gfx::Font* title_font = |
410 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); | 356 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); |
411 return *title_font; | 357 return *title_font; |
412 } | 358 } |
413 | 359 |
414 //////////////////////////////////////////////////////////////////////////////// | 360 //////////////////////////////////////////////////////////////////////////////// |
415 // NativeBrowserFrame, public: | 361 // NativeBrowserFrame, public: |
416 | 362 |
417 // static | 363 // static |
418 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( | 364 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( |
419 BrowserFrame* browser_frame, | 365 BrowserFrame* browser_frame, |
420 BrowserView* browser_view) { | 366 BrowserView* browser_view) { |
421 return new BrowserFrameWin(browser_frame, browser_view); | 367 return new BrowserFrameWin(browser_frame, browser_view); |
422 } | 368 } |
OLD | NEW |