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; | |
53 | 58 |
54 /////////////////////////////////////////////////////////////////////////////// | 59 /////////////////////////////////////////////////////////////////////////////// |
55 // BrowserFrameWin, public: | 60 // BrowserFrameWin, public: |
56 | 61 |
57 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, | 62 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, |
58 BrowserView* browser_view) | 63 BrowserView* browser_view) |
59 : views::NativeWidgetWin(browser_frame), | 64 : views::NativeWidgetWin(browser_frame), |
60 browser_view_(browser_view), | 65 browser_view_(browser_view), |
61 browser_frame_(browser_frame), | 66 browser_frame_(browser_frame), |
62 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, | 67 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
201 | 206 |
202 void BrowserFrameWin::TabStripDisplayModeChanged() { | 207 void BrowserFrameWin::TabStripDisplayModeChanged() { |
203 UpdateDWMFrame(); | 208 UpdateDWMFrame(); |
204 } | 209 } |
205 | 210 |
206 LRESULT BrowserFrameWin::OnWndProc(UINT message, | 211 LRESULT BrowserFrameWin::OnWndProc(UINT message, |
207 WPARAM w_param, | 212 WPARAM w_param, |
208 LPARAM l_param) { | 213 LPARAM l_param) { |
209 static const UINT metro_navigation_search_message = | 214 static const UINT metro_navigation_search_message = |
210 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); | 215 RegisterWindowMessage(chrome::kMetroNavigationAndSearchMessage); |
211 if (message == metro_navigation_search_message) | |
212 HandleMetroRequest(w_param, l_param); | |
213 | 216 |
217 static const UINT metro_get_current_tab_info_message = | |
218 RegisterWindowMessage(chrome::kMetroGetCurrentTabInfoMessage); | |
219 | |
220 if (message == metro_navigation_search_message) { | |
sky
2012/05/01 23:48:53
nit: no {}
ananta
2012/05/01 23:57:48
Leaving this as is as this is a compound if statem
| |
221 HandleMetroNavSearchRequest(w_param, l_param); | |
222 } else if (message == metro_get_current_tab_info_message) { | |
223 GetMetroCurrentTabInfo(w_param); | |
224 } | |
214 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); | 225 return views::NativeWidgetWin::OnWndProc(message, w_param, l_param); |
215 } | 226 } |
216 | 227 |
217 /////////////////////////////////////////////////////////////////////////////// | 228 /////////////////////////////////////////////////////////////////////////////// |
218 // BrowserFrameWin, private: | 229 // BrowserFrameWin, private: |
219 | 230 |
220 void BrowserFrameWin::UpdateDWMFrame() { | 231 void BrowserFrameWin::UpdateDWMFrame() { |
221 // Nothing to do yet, or we're not showing a DWM frame. | 232 // Nothing to do yet, or we're not showing a DWM frame. |
222 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) | 233 if (!GetWidget()->client_view() || !browser_frame_->ShouldUseNativeFrame()) |
223 return; | 234 return; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
300 | 311 |
301 void BrowserFrameWin::AddFrameToggleItems() { | 312 void BrowserFrameWin::AddFrameToggleItems() { |
302 if (CommandLine::ForCurrentProcess()->HasSwitch( | 313 if (CommandLine::ForCurrentProcess()->HasSwitch( |
303 switches::kDebugEnableFrameToggle)) { | 314 switches::kDebugEnableFrameToggle)) { |
304 system_menu_contents_->AddSeparator(); | 315 system_menu_contents_->AddSeparator(); |
305 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, | 316 system_menu_contents_->AddItem(IDC_DEBUG_FRAME_TOGGLE, |
306 L"Toggle Frame Type"); | 317 L"Toggle Frame Type"); |
307 } | 318 } |
308 } | 319 } |
309 | 320 |
310 void BrowserFrameWin::HandleMetroRequest(WPARAM w_param, LPARAM l_param) { | 321 void BrowserFrameWin::HandleMetroNavSearchRequest(WPARAM w_param, |
322 LPARAM l_param) { | |
311 if (!base::win::GetMetroModule()) { | 323 if (!base::win::GetMetroModule()) { |
312 NOTREACHED() << "Received unexpected metro navigation request"; | 324 NOTREACHED() << "Received unexpected metro navigation request"; |
313 return; | 325 return; |
314 } | 326 } |
315 | 327 |
316 if (!w_param && !l_param) { | 328 if (!w_param && !l_param) { |
317 NOTREACHED() << "Invalid metro request parameters"; | 329 NOTREACHED() << "Invalid metro request parameters"; |
318 return; | 330 return; |
319 } | 331 } |
320 | 332 |
(...skipping 18 matching lines...) Expand all Loading... | |
339 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, | 351 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, |
340 string16())); | 352 string16())); |
341 } | 353 } |
342 } | 354 } |
343 if (request_url.is_valid()) { | 355 if (request_url.is_valid()) { |
344 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, | 356 browser->OpenURL(OpenURLParams(request_url, Referrer(), NEW_FOREGROUND_TAB, |
345 content::PAGE_TRANSITION_TYPED, false)); | 357 content::PAGE_TRANSITION_TYPED, false)); |
346 } | 358 } |
347 } | 359 } |
348 | 360 |
361 void BrowserFrameWin::GetMetroCurrentTabInfo(WPARAM w_param) { | |
362 if (!base::win::GetMetroModule()) { | |
363 NOTREACHED() << "Received unexpected metro request"; | |
364 return; | |
365 } | |
366 | |
367 if (!w_param) { | |
368 NOTREACHED() << "Invalid metro request parameter"; | |
369 return; | |
370 } | |
371 | |
372 base::win::CurrentTabInfo* current_tab_info = | |
373 reinterpret_cast<base::win::CurrentTabInfo*>(w_param); | |
374 | |
375 Browser* browser = browser_view()->browser(); | |
376 DCHECK(browser); | |
377 | |
378 // We allocate memory for the title and url via LocalAlloc. The caller has to | |
379 // free the memory via LocalFree. | |
380 | |
381 size_t title_size = | |
382 (browser->GetWindowTitleForCurrentTab().length() + 1) * sizeof(wchar_t); | |
383 | |
384 current_tab_info->title = reinterpret_cast<wchar_t*>(LocalAlloc(LPTR, | |
385 title_size)); | |
386 | |
387 base::wcslcpy(current_tab_info->title, | |
388 browser->GetWindowTitleForCurrentTab().c_str(), | |
389 title_size); | |
390 | |
391 WebContents* current_tab = browser->GetSelectedWebContents(); | |
392 DCHECK(current_tab); | |
393 | |
394 string16 current_url(UTF8ToWide(current_tab->GetURL().spec())); | |
sky
2012/05/01 23:48:53
381-387 is the same as this. How about a helper fu
ananta
2012/05/01 23:57:48
Done. Added a function LocalAllocAndCopyString in
| |
395 | |
396 size_t url_size = (current_url.length() + 1) * sizeof(wchar_t); | |
397 | |
398 current_tab_info->url = reinterpret_cast<wchar_t*>(LocalAlloc(LPTR, | |
399 url_size)); | |
400 | |
401 base::wcslcpy(current_tab_info->url, | |
402 current_url.c_str(), | |
403 url_size); | |
404 } | |
405 | |
349 | 406 |
350 //////////////////////////////////////////////////////////////////////////////// | 407 //////////////////////////////////////////////////////////////////////////////// |
351 // BrowserFrame, public: | 408 // BrowserFrame, public: |
352 | 409 |
353 // static | 410 // static |
354 const gfx::Font& BrowserFrame::GetTitleFont() { | 411 const gfx::Font& BrowserFrame::GetTitleFont() { |
355 static gfx::Font* title_font = | 412 static gfx::Font* title_font = |
356 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); | 413 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); |
357 return *title_font; | 414 return *title_font; |
358 } | 415 } |
359 | 416 |
360 //////////////////////////////////////////////////////////////////////////////// | 417 //////////////////////////////////////////////////////////////////////////////// |
361 // NativeBrowserFrame, public: | 418 // NativeBrowserFrame, public: |
362 | 419 |
363 // static | 420 // static |
364 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( | 421 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( |
365 BrowserFrame* browser_frame, | 422 BrowserFrame* browser_frame, |
366 BrowserView* browser_view) { | 423 BrowserView* browser_view) { |
367 return new BrowserFrameWin(browser_frame, browser_view); | 424 return new BrowserFrameWin(browser_frame, browser_view); |
368 } | 425 } |
OLD | NEW |