in shell/browser/ui/win/jump_list.cc [225:314]
JumpListResult JumpList::AppendCategory(const JumpListCategory& category) {
DCHECK(destinations_);
if (!destinations_)
return JumpListResult::kGenericError;
if (category.items.empty())
return JumpListResult::kSuccess;
CComPtr<IObjectCollection> collection;
if (FAILED(collection.CoCreateInstance(CLSID_EnumerableObjectCollection))) {
return JumpListResult::kGenericError;
}
auto result = JumpListResult::kSuccess;
// Keep track of how many items were actually appended to the category.
int appended_count = 0;
for (const auto& item : category.items) {
switch (item.type) {
case JumpListItem::Type::kTask:
if (AppendTask(item, collection))
++appended_count;
else
LOG(ERROR) << "Failed to append task '" << item.title
<< "' "
"to Jump List.";
break;
case JumpListItem::Type::kSeparator:
if (category.type == JumpListCategory::Type::kTasks) {
if (AppendSeparator(collection))
++appended_count;
} else {
LOG(ERROR) << "Can't append separator to Jump List category "
<< "'" << category.name << "'. "
<< "Separators are only allowed in the standard 'Tasks' "
"Jump List category.";
result = JumpListResult::kCustomCategorySeparatorError;
}
break;
case JumpListItem::Type::kFile:
if (AppendFile(item, collection))
++appended_count;
else
LOG(ERROR) << "Failed to append '" << item.path.value()
<< "' "
"to Jump List.";
break;
}
}
if (appended_count == 0)
return result;
if ((static_cast<size_t>(appended_count) < category.items.size()) &&
(result == JumpListResult::kSuccess)) {
result = JumpListResult::kGenericError;
}
CComQIPtr<IObjectArray> items(collection);
if (category.type == JumpListCategory::Type::kTasks) {
if (FAILED(destinations_->AddUserTasks(items))) {
LOG(ERROR) << "Failed to append items to the standard Tasks category.";
if (result == JumpListResult::kSuccess)
result = JumpListResult::kGenericError;
}
} else {
HRESULT hr = destinations_->AppendCategory(category.name.c_str(), items);
if (FAILED(hr)) {
if (hr == static_cast<HRESULT>(0x80040F03)) {
LOG(ERROR) << "Failed to append custom category "
<< "'" << category.name << "' "
<< "to Jump List due to missing file type registration.";
result = JumpListResult::kMissingFileTypeRegistrationError;
} else if (hr == E_ACCESSDENIED) {
LOG(ERROR) << "Failed to append custom category "
<< "'" << category.name << "' "
<< "to Jump List due to system privacy settings.";
result = JumpListResult::kCustomCategoryAccessDeniedError;
} else {
LOG(ERROR) << "Failed to append custom category "
<< "'" << category.name << "' to Jump List.";
if (result == JumpListResult::kSuccess)
result = JumpListResult::kGenericError;
}
}
}
return result;
}