OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/extensions/extension_popup_api.h" | 5 #include "chrome/browser/extensions/extension_popup_api.h" |
6 | 6 |
7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "chrome/browser/extensions/extension_dom_ui.h" | 9 #include "chrome/browser/extensions/extension_dom_ui.h" |
10 #include "chrome/browser/extensions/extension_host.h" | 10 #include "chrome/browser/extensions/extension_host.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 } // namespace extension_popup_module_events | 39 } // namespace extension_popup_module_events |
40 | 40 |
41 namespace { | 41 namespace { |
42 | 42 |
43 // Errors. | 43 // Errors. |
44 const char kBadAnchorArgument[] = "Invalid anchor argument."; | 44 const char kBadAnchorArgument[] = "Invalid anchor argument."; |
45 const char kInvalidURLError[] = "Invalid URL."; | 45 const char kInvalidURLError[] = "Invalid URL."; |
46 const char kNotAnExtension[] = "Not an extension view."; | 46 const char kNotAnExtension[] = "Not an extension view."; |
47 const char kPopupsDisallowed[] = | 47 const char kPopupsDisallowed[] = |
48 "Popups are only supported from toolstrip or tab-contents views."; | 48 "Popups are only supported from tab-contents views."; |
49 | 49 |
50 // Keys. | 50 // Keys. |
51 const wchar_t kUrlKey[] = L"url"; | 51 const wchar_t kUrlKey[] = L"url"; |
52 const wchar_t kWidthKey[] = L"width"; | 52 const wchar_t kWidthKey[] = L"width"; |
53 const wchar_t kHeightKey[] = L"height"; | 53 const wchar_t kHeightKey[] = L"height"; |
54 const wchar_t kTopKey[] = L"top"; | 54 const wchar_t kTopKey[] = L"top"; |
55 const wchar_t kLeftKey[] = L"left"; | 55 const wchar_t kLeftKey[] = L"left"; |
56 const wchar_t kGiveFocusKey[] = L"giveFocus"; | 56 const wchar_t kGiveFocusKey[] = L"giveFocus"; |
57 const wchar_t kDomAnchorKey[] = L"domAnchor"; | 57 const wchar_t kDomAnchorKey[] = L"domAnchor"; |
58 const wchar_t kBorderStyleKey[] = L"borderStyle"; | 58 const wchar_t kBorderStyleKey[] = L"borderStyle"; |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, | 349 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, |
350 NotificationService::AllSources()); | 350 NotificationService::AllSources()); |
351 } | 351 } |
352 } | 352 } |
353 #else | 353 #else |
354 SendResponse(false); | 354 SendResponse(false); |
355 #endif | 355 #endif |
356 } | 356 } |
357 | 357 |
358 bool PopupShowFunction::RunImpl() { | 358 bool PopupShowFunction::RunImpl() { |
359 // Popups may only be displayed from TAB_CONTENTS and EXTENSION_TOOLSTRIP | 359 // Popups may only be displayed from TAB_CONTENTS. |
360 // views. | |
361 ViewType::Type view_type = | 360 ViewType::Type view_type = |
362 dispatcher()->render_view_host()->delegate()->GetRenderViewType(); | 361 dispatcher()->render_view_host()->delegate()->GetRenderViewType(); |
363 if (ViewType::EXTENSION_TOOLSTRIP != view_type && | 362 if (ViewType::TAB_CONTENTS != view_type) { |
364 ViewType::TAB_CONTENTS != view_type) { | |
365 error_ = kPopupsDisallowed; | 363 error_ = kPopupsDisallowed; |
366 return false; | 364 return false; |
367 } | 365 } |
368 | 366 |
369 std::string url_string; | 367 std::string url_string; |
370 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); | 368 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); |
371 | 369 |
372 DictionaryValue* show_details = NULL; | 370 DictionaryValue* show_details = NULL; |
373 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &show_details)); | 371 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &show_details)); |
374 | 372 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 | 435 |
438 // Get the correct native window to pass to ExtensionPopup. | 436 // Get the correct native window to pass to ExtensionPopup. |
439 // ExtensionFunctionDispatcher::Delegate may provide a custom implementation | 437 // ExtensionFunctionDispatcher::Delegate may provide a custom implementation |
440 // of this. | 438 // of this. |
441 gfx::NativeWindow window = | 439 gfx::NativeWindow window = |
442 dispatcher()->delegate()->GetCustomFrameNativeWindow(); | 440 dispatcher()->delegate()->GetCustomFrameNativeWindow(); |
443 if (!window) | 441 if (!window) |
444 window = GetCurrentBrowser()->window()->GetNativeHandle(); | 442 window = GetCurrentBrowser()->window()->GetNativeHandle(); |
445 | 443 |
446 #if defined(TOOLKIT_VIEWS) | 444 #if defined(TOOLKIT_VIEWS) |
447 // Pop-up from extension views (ExtensionShelf, etc.), and drop-down when | 445 BubbleBorder::ArrowLocation arrow_location = BubbleBorder::TOP_LEFT; |
448 // in a TabContents view. | |
449 BubbleBorder::ArrowLocation arrow_location = | |
450 view_type == ViewType::TAB_CONTENTS ? | |
451 BubbleBorder::TOP_LEFT : BubbleBorder::BOTTOM_LEFT; | |
452 | 446 |
453 // ExtensionPopupHost manages it's own lifetime. | 447 // ExtensionPopupHost manages it's own lifetime. |
454 ExtensionPopupHost* popup_host = new ExtensionPopupHost(dispatcher()); | 448 ExtensionPopupHost* popup_host = new ExtensionPopupHost(dispatcher()); |
455 popup_ = ExtensionPopup::Show(url, | 449 popup_ = ExtensionPopup::Show(url, |
456 GetCurrentBrowser(), | 450 GetCurrentBrowser(), |
457 dispatcher()->profile(), | 451 dispatcher()->profile(), |
458 window, | 452 window, |
459 rect, | 453 rect, |
460 arrow_location, | 454 arrow_location, |
461 give_focus, | 455 give_focus, |
462 false, // inspect_with_devtools | 456 false, // inspect_with_devtools |
463 chrome, | 457 chrome, |
464 popup_host); // ExtensionPopup::Observer | 458 popup_host); // ExtensionPopup::Observer |
465 | 459 |
466 // popup_host will handle focus change listening and close the popup when | 460 // popup_host will handle focus change listening and close the popup when |
467 // focus leaves the containing views hierarchy. | 461 // focus leaves the containing views hierarchy. |
468 popup_->set_close_on_lost_focus(false); | 462 popup_->set_close_on_lost_focus(false); |
469 popup_host->set_popup(popup_); | 463 popup_host->set_popup(popup_); |
470 #endif // defined(TOOLKIT_VIEWS) | 464 #endif // defined(TOOLKIT_VIEWS) |
| 465 |
471 return true; | 466 return true; |
472 } | 467 } |
473 | 468 |
474 void PopupShowFunction::Observe(NotificationType type, | 469 void PopupShowFunction::Observe(NotificationType type, |
475 const NotificationSource& source, | 470 const NotificationSource& source, |
476 const NotificationDetails& details) { | 471 const NotificationDetails& details) { |
477 #if defined(TOOLKIT_VIEWS) | 472 #if defined(TOOLKIT_VIEWS) |
478 DCHECK(type == NotificationType::EXTENSION_POPUP_VIEW_READY || | 473 DCHECK(type == NotificationType::EXTENSION_POPUP_VIEW_READY || |
479 type == NotificationType::EXTENSION_HOST_DESTROYED); | 474 type == NotificationType::EXTENSION_HOST_DESTROYED); |
480 DCHECK(popup_ != NULL); | 475 DCHECK(popup_ != NULL); |
(...skipping 20 matching lines...) Expand all Loading... |
501 std::string full_event_name = StringPrintf( | 496 std::string full_event_name = StringPrintf( |
502 extension_popup_module_events::kOnPopupClosed, | 497 extension_popup_module_events::kOnPopupClosed, |
503 routing_id); | 498 routing_id); |
504 | 499 |
505 profile->GetExtensionMessageService()->DispatchEventToRenderers( | 500 profile->GetExtensionMessageService()->DispatchEventToRenderers( |
506 full_event_name, | 501 full_event_name, |
507 base::JSONWriter::kEmptyArray, | 502 base::JSONWriter::kEmptyArray, |
508 profile->IsOffTheRecord(), | 503 profile->IsOffTheRecord(), |
509 GURL()); | 504 GURL()); |
510 } | 505 } |
OLD | NEW |