Chromium Code Reviews| 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/extensions/menu_manager.h" | 5 #include "chrome/browser/extensions/menu_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <tuple> | 9 #include <tuple> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 658 properties->SetBoolean("editable", params.is_editable); | 658 properties->SetBoolean("editable", params.is_editable); |
| 659 | 659 |
| 660 WebViewGuest* webview_guest = WebViewGuest::FromWebContents(web_contents); | 660 WebViewGuest* webview_guest = WebViewGuest::FromWebContents(web_contents); |
| 661 if (webview_guest) { | 661 if (webview_guest) { |
| 662 // This is used in web_view_internalcustom_bindings.js. | 662 // This is used in web_view_internalcustom_bindings.js. |
| 663 // The property is not exposed to developer API. | 663 // The property is not exposed to developer API. |
| 664 properties->SetInteger("webviewInstanceId", | 664 properties->SetInteger("webviewInstanceId", |
| 665 webview_guest->view_instance_id()); | 665 webview_guest->view_instance_id()); |
| 666 } | 666 } |
| 667 | 667 |
| 668 base::DictionaryValue* raw_properties = properties.get(); | 668 size_t properties_idx = args->GetSize(); |
| 669 args->Append(std::move(properties)); | 669 args->Append(std::move(properties)); |
| 670 // |properties| is invalidated at this time, which is why |args| needs to be | |
| 671 // queried for the pointer. | |
| 672 base::DictionaryValue* raw_properties; | |
|
Devlin
2017/03/15 15:25:04
nit: initialize to nullptr
jdoerrie
2017/03/23 18:11:17
Done.
| |
| 673 args->GetDictionary(properties_idx, &raw_properties); | |
| 670 | 674 |
| 671 // Add the tab info to the argument list. | 675 // Add the tab info to the argument list. |
| 672 // No tab info in a platform app. | 676 // No tab info in a platform app. |
| 673 if (!extension || !extension->is_platform_app()) { | 677 if (!extension || !extension->is_platform_app()) { |
| 674 // Note: web_contents are null in unit tests :( | 678 // Note: web_contents are null in unit tests :( |
| 675 if (web_contents) { | 679 if (web_contents) { |
| 676 int frame_id = ExtensionApiFrameIdMap::GetFrameId(render_frame_host); | 680 int frame_id = ExtensionApiFrameIdMap::GetFrameId(render_frame_host); |
| 677 if (frame_id != ExtensionApiFrameIdMap::kInvalidFrameId) | 681 if (frame_id != ExtensionApiFrameIdMap::kInvalidFrameId) |
| 678 raw_properties->SetInteger("frameId", frame_id); | 682 raw_properties->SetInteger("frameId", frame_id); |
|
Devlin
2017/03/15 15:25:03
Given raw_properties is only safe to use before th
| |
| 679 | 683 |
| 680 args->Append(ExtensionTabUtil::CreateTabObject(web_contents)->ToValue()); | 684 args->Append(ExtensionTabUtil::CreateTabObject(web_contents)->ToValue()); |
| 681 } else { | 685 } else { |
| 682 args->Append(base::MakeUnique<base::DictionaryValue>()); | 686 args->Append(base::MakeUnique<base::DictionaryValue>()); |
| 683 } | 687 } |
| 684 } | 688 } |
| 685 | 689 |
| 690 // |args->Append| might have invalidated pointers, which is why |args| needs | |
|
Devlin
2017/03/15 15:25:03
Oof, that's subtle. Do we have any way of checkin
brettw
2017/03/15 22:14:14
Yes, there should be no pointers in the API when w
jdoerrie
2017/03/23 18:11:17
To answer your first question, yes, we can determi
| |
| 691 // to be queried again for the pointer. | |
| 692 args->GetDictionary(properties_idx, &raw_properties); | |
| 693 | |
| 686 if (item->type() == MenuItem::CHECKBOX || | 694 if (item->type() == MenuItem::CHECKBOX || |
| 687 item->type() == MenuItem::RADIO) { | 695 item->type() == MenuItem::RADIO) { |
| 688 bool was_checked = item->checked(); | 696 bool was_checked = item->checked(); |
| 689 raw_properties->SetBoolean("wasChecked", was_checked); | 697 raw_properties->SetBoolean("wasChecked", was_checked); |
|
Devlin
2017/03/15 15:25:03
Similarly here, let's only grab the dictionary if
| |
| 690 | 698 |
| 691 // RADIO items always get set to true when you click on them, but CHECKBOX | 699 // RADIO items always get set to true when you click on them, but CHECKBOX |
| 692 // items get their state toggled. | 700 // items get their state toggled. |
| 693 bool checked = | 701 bool checked = |
| 694 (item->type() == MenuItem::RADIO) ? true : !was_checked; | 702 (item->type() == MenuItem::RADIO) ? true : !was_checked; |
| 695 | 703 |
| 696 item->SetChecked(checked); | 704 item->SetChecked(checked); |
| 697 raw_properties->SetBoolean("checked", item->checked()); | 705 raw_properties->SetBoolean("checked", item->checked()); |
| 698 | 706 |
| 699 if (extension) | 707 if (extension) |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 bool MenuItem::Id::operator!=(const Id& other) const { | 972 bool MenuItem::Id::operator!=(const Id& other) const { |
| 965 return !(*this == other); | 973 return !(*this == other); |
| 966 } | 974 } |
| 967 | 975 |
| 968 bool MenuItem::Id::operator<(const Id& other) const { | 976 bool MenuItem::Id::operator<(const Id& other) const { |
| 969 return std::tie(incognito, extension_key, uid, string_uid) < | 977 return std::tie(incognito, extension_key, uid, string_uid) < |
| 970 std::tie(other.incognito, other.extension_key, other.uid, other.string_uid); | 978 std::tie(other.incognito, other.extension_key, other.uid, other.string_uid); |
| 971 } | 979 } |
| 972 | 980 |
| 973 } // namespace extensions | 981 } // namespace extensions |
| OLD | NEW |