Commit 05175f29 authored by Alan Screen's avatar Alan Screen Committed by Commit Bot

Add advanced capabilities to print backend mojom

Adding support for PrintBackend queries to happen out of the browser
process requires related data structures to be made available via a Mojo
interface.  These are moved into their own mojom file separate from the
common definition in printing/mojom since they are specific to a new
process being introduced and do not need to be encumbered by the
dependencies which exist for print.mojom.

Starting with the historically most prolific cause of browser crashes
from printing (GetPrinterSemanticCapsAndDefaults), work towards having
support definitions to enable that query to be moved out-of-process.

Add a mojo definition to go with the printing::AdvancedCapability which
is needed to support the larger query on ChromeOS.

Bug: 809738
Change-Id: I05bbc441873d6f3a88ae57a27c5abe6c7c4be47b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2387543
Commit-Queue: Alan Screen <awscreen@chromium.org>
Reviewed-by: default avatarWill Harris <wfh@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarDaniel Hosseinian <dhoss@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812993}
parent be3069fb
...@@ -21,4 +21,21 @@ mojom("mojom") { ...@@ -21,4 +21,21 @@ mojom("mojom") {
traits_headers = [ "print_backend_mojom_traits.h" ] traits_headers = [ "print_backend_mojom_traits.h" ]
}, },
] ]
if (is_chromeos) {
cpp_typemaps += [
{
types = [
{
mojom = "printing.mojom.AdvancedCapability"
cpp = "::printing::AdvancedCapability"
},
{
mojom = "printing.mojom.AdvancedCapabilityValue"
cpp = "::printing::AdvancedCapabilityValue"
},
]
},
]
}
} }
...@@ -13,3 +13,29 @@ struct Paper { ...@@ -13,3 +13,29 @@ struct Paper {
gfx.mojom.Size size_um; gfx.mojom.Size size_um;
}; };
// An advanced capability value for ChromeOS printing.
[EnableIf=is_chromeos]
struct AdvancedCapabilityValue {
string name;
string display_name;
};
// The type of the values for advanced capabilities.
[EnableIf=is_chromeos]
enum AdvancedCapabilityType {
kBoolean,
kFloat,
kInteger,
kString
};
// An advanced capability for ChromeOS printing.
[EnableIf=is_chromeos]
struct AdvancedCapability {
string name;
string display_name;
AdvancedCapabilityType type;
string default_value;
array<AdvancedCapabilityValue> values;
};
...@@ -17,4 +17,68 @@ bool StructTraits<printing::mojom::PaperDataView, ...@@ -17,4 +17,68 @@ bool StructTraits<printing::mojom::PaperDataView,
data.ReadVendorId(&out->vendor_id) && data.ReadSizeUm(&out->size_um); data.ReadVendorId(&out->vendor_id) && data.ReadSizeUm(&out->size_um);
} }
#if defined(OS_CHROMEOS)
// static
printing::mojom::AdvancedCapabilityType
EnumTraits<printing::mojom::AdvancedCapabilityType,
::printing::AdvancedCapability::Type>::
ToMojom(::printing::AdvancedCapability::Type input) {
switch (input) {
case ::printing::AdvancedCapability::Type::kBoolean:
return printing::mojom::AdvancedCapabilityType::kBoolean;
case ::printing::AdvancedCapability::Type::kFloat:
return printing::mojom::AdvancedCapabilityType::kFloat;
case ::printing::AdvancedCapability::Type::kInteger:
return printing::mojom::AdvancedCapabilityType::kInteger;
case ::printing::AdvancedCapability::Type::kString:
return printing::mojom::AdvancedCapabilityType::kString;
}
NOTREACHED();
return printing::mojom::AdvancedCapabilityType::kString;
}
// static
bool EnumTraits<printing::mojom::AdvancedCapabilityType,
::printing::AdvancedCapability::Type>::
FromMojom(printing::mojom::AdvancedCapabilityType input,
::printing::AdvancedCapability::Type* output) {
switch (input) {
case printing::mojom::AdvancedCapabilityType::kBoolean:
*output = ::printing::AdvancedCapability::Type::kBoolean;
return true;
case printing::mojom::AdvancedCapabilityType::kFloat:
*output = ::printing::AdvancedCapability::Type::kFloat;
return true;
case printing::mojom::AdvancedCapabilityType::kInteger:
*output = ::printing::AdvancedCapability::Type::kInteger;
return true;
case printing::mojom::AdvancedCapabilityType::kString:
*output = ::printing::AdvancedCapability::Type::kString;
return true;
}
NOTREACHED();
return false;
}
// static
bool StructTraits<printing::mojom::AdvancedCapabilityValueDataView,
::printing::AdvancedCapabilityValue>::
Read(printing::mojom::AdvancedCapabilityValueDataView data,
::printing::AdvancedCapabilityValue* out) {
return data.ReadName(&out->name) && data.ReadDisplayName(&out->display_name);
}
// static
bool StructTraits<printing::mojom::AdvancedCapabilityDataView,
::printing::AdvancedCapability>::
Read(printing::mojom::AdvancedCapabilityDataView data,
::printing::AdvancedCapability* out) {
return data.ReadName(&out->name) &&
data.ReadDisplayName(&out->display_name) &&
data.ReadType(&out->type) &&
data.ReadDefaultValue(&out->default_value) &&
data.ReadValues(&out->values);
}
#endif // defined(OS_CHROMEOS)
} // namespace mojo } // namespace mojo
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define PRINTING_BACKEND_MOJOM_PRINT_BACKEND_MOJOM_TRAITS_H_ #define PRINTING_BACKEND_MOJOM_PRINT_BACKEND_MOJOM_TRAITS_H_
#include <string> #include <string>
#include <vector>
#include "printing/backend/mojom/print_backend.mojom-shared.h" #include "printing/backend/mojom/print_backend.mojom-shared.h"
#include "printing/backend/print_backend.h" #include "printing/backend/print_backend.h"
...@@ -33,6 +34,59 @@ struct StructTraits<printing::mojom::PaperDataView, ...@@ -33,6 +34,59 @@ struct StructTraits<printing::mojom::PaperDataView,
printing::PrinterSemanticCapsAndDefaults::Paper* out); printing::PrinterSemanticCapsAndDefaults::Paper* out);
}; };
#if defined(OS_CHROMEOS)
template <>
struct EnumTraits<printing::mojom::AdvancedCapabilityType,
::printing::AdvancedCapability::Type> {
static printing::mojom::AdvancedCapabilityType ToMojom(
::printing::AdvancedCapability::Type input);
static bool FromMojom(printing::mojom::AdvancedCapabilityType input,
::printing::AdvancedCapability::Type* output);
};
template <>
struct StructTraits<printing::mojom::AdvancedCapabilityValueDataView,
::printing::AdvancedCapabilityValue> {
static const std::string& name(const ::printing::AdvancedCapabilityValue& v) {
return v.name;
}
static const std::string& display_name(
const ::printing::AdvancedCapabilityValue& v) {
return v.display_name;
}
static bool Read(printing::mojom::AdvancedCapabilityValueDataView data,
::printing::AdvancedCapabilityValue* out);
};
template <>
struct StructTraits<printing::mojom::AdvancedCapabilityDataView,
::printing::AdvancedCapability> {
static const std::string& name(const ::printing::AdvancedCapability& c) {
return c.name;
}
static const std::string& display_name(
const ::printing::AdvancedCapability& c) {
return c.display_name;
}
static ::printing::AdvancedCapability::Type type(
const ::printing::AdvancedCapability& c) {
return c.type;
}
static const std::string& default_value(
const ::printing::AdvancedCapability& c) {
return c.default_value;
}
static const std::vector<::printing::AdvancedCapabilityValue>& values(
const ::printing::AdvancedCapability& c) {
return c.values;
}
static bool Read(printing::mojom::AdvancedCapabilityDataView data,
::printing::AdvancedCapability* out);
};
#endif // defined(OS_CHROMEOS)
} // namespace mojo } // namespace mojo
#endif // PRINTING_BACKEND_MOJOM_PRINT_BACKEND_MOJOM_TRAITS_H_ #endif // PRINTING_BACKEND_MOJOM_PRINT_BACKEND_MOJOM_TRAITS_H_
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include <vector>
#include "mojo/public/cpp/test_support/test_utils.h" #include "mojo/public/cpp/test_support/test_utils.h"
#include "printing/backend/mojom/print_backend.mojom.h" #include "printing/backend/mojom/print_backend.mojom.h"
#include "printing/backend/print_backend.h" #include "printing/backend/print_backend.h"
...@@ -25,6 +27,42 @@ const printing::PrinterSemanticCapsAndDefaults::Paper kPaperLedger{ ...@@ -25,6 +27,42 @@ const printing::PrinterSemanticCapsAndDefaults::Paper kPaperLedger{
/*display_name=*/"Ledger", /*vendor_id=*/"89", /*display_name=*/"Ledger", /*vendor_id=*/"89",
/*size_um=*/gfx::Size(6600, 10200)}; /*size_um=*/gfx::Size(6600, 10200)};
#if defined(OS_CHROMEOS)
const printing::AdvancedCapability kAdvancedCapability1(
/*name=*/"advanced_cap_bool",
/*display_name=*/"Advanced Capability #1 (bool)",
/*type=*/printing::AdvancedCapability::Type::kBoolean,
/*default_value=*/"true",
/*values=*/std::vector<printing::AdvancedCapabilityValue>());
const printing::AdvancedCapability kAdvancedCapability2(
/*name=*/"advanced_cap_double",
/*display_name=*/"Advanced Capability #2 (double)",
/*type=*/printing::AdvancedCapability::Type::kFloat,
/*default_value=*/"3.14159",
/*values=*/
std::vector<printing::AdvancedCapabilityValue>{
printing::AdvancedCapabilityValue(
/*name=*/"adv_cap_val_1",
/*display_name=*/"Advanced Capability #1"),
printing::AdvancedCapabilityValue(
/*name=*/"adv_cap_val_2",
/*display_name=*/"Advanced Capability #2"),
printing::AdvancedCapabilityValue(
/*name=*/"adv_cap_val_3",
/*display_name=*/"Advanced Capability #3"),
});
const printing::AdvancedCapabilities kAdvancedCapabilities{
kAdvancedCapability1, kAdvancedCapability2};
// Returns true if the advanced capabilities have the equivalent members.
bool AdvancedCapabilitiesEqual(const AdvancedCapability& lhs,
const AdvancedCapability& rhs) {
return lhs.name == rhs.name && lhs.display_name == rhs.display_name &&
lhs.type == rhs.type && lhs.default_value == rhs.default_value &&
lhs.values == rhs.values;
}
#endif // defined(OS_CHROMEOS)
} // namespace } // namespace
TEST(PrintBackendMojomTraitsTest, TestSerializeAndDeserializePaper) { TEST(PrintBackendMojomTraitsTest, TestSerializeAndDeserializePaper) {
...@@ -40,4 +78,17 @@ TEST(PrintBackendMojomTraitsTest, TestSerializeAndDeserializePaper) { ...@@ -40,4 +78,17 @@ TEST(PrintBackendMojomTraitsTest, TestSerializeAndDeserializePaper) {
} }
} }
#if defined(OS_CHROMEOS)
TEST(PrintBackendMojomTraitsTest,
TestSerializeAndDeserializeAdvancedCapability) {
for (const auto& advanced_capability : kAdvancedCapabilities) {
printing::AdvancedCapability input = advanced_capability;
printing::AdvancedCapability output;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
printing::mojom::AdvancedCapability>(&input, &output));
EXPECT_TRUE(AdvancedCapabilitiesEqual(advanced_capability, output));
}
}
#endif // defined(OS_CHROMEOS)
} // namespace printing } // namespace printing
...@@ -23,13 +23,35 @@ PrinterBasicInfo::~PrinterBasicInfo() = default; ...@@ -23,13 +23,35 @@ PrinterBasicInfo::~PrinterBasicInfo() = default;
AdvancedCapabilityValue::AdvancedCapabilityValue() = default; AdvancedCapabilityValue::AdvancedCapabilityValue() = default;
AdvancedCapabilityValue::AdvancedCapabilityValue(
const std::string& name,
const std::string& display_name)
: name(name), display_name(display_name) {}
AdvancedCapabilityValue::AdvancedCapabilityValue( AdvancedCapabilityValue::AdvancedCapabilityValue(
const AdvancedCapabilityValue& other) = default; const AdvancedCapabilityValue& other) = default;
AdvancedCapabilityValue::~AdvancedCapabilityValue() = default; AdvancedCapabilityValue::~AdvancedCapabilityValue() = default;
bool AdvancedCapabilityValue::operator==(
const AdvancedCapabilityValue& other) const {
return name == other.name && display_name == other.display_name;
}
AdvancedCapability::AdvancedCapability() = default; AdvancedCapability::AdvancedCapability() = default;
AdvancedCapability::AdvancedCapability(
const std::string& name,
const std::string& display_name,
AdvancedCapability::Type type,
const std::string& default_value,
const std::vector<AdvancedCapabilityValue>& values)
: name(name),
display_name(display_name),
type(type),
default_value(default_value),
values(values) {}
AdvancedCapability::AdvancedCapability(const AdvancedCapability& other) = AdvancedCapability::AdvancedCapability(const AdvancedCapability& other) =
default; default;
......
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
#include "printing/printing_export.h" #include "printing/printing_export.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#if defined(OS_CHROMEOS)
#include <stdint.h>
#endif
namespace base { namespace base {
class DictionaryValue; class DictionaryValue;
} }
...@@ -47,9 +51,13 @@ using PrinterList = std::vector<PrinterBasicInfo>; ...@@ -47,9 +51,13 @@ using PrinterList = std::vector<PrinterBasicInfo>;
struct PRINTING_EXPORT AdvancedCapabilityValue { struct PRINTING_EXPORT AdvancedCapabilityValue {
AdvancedCapabilityValue(); AdvancedCapabilityValue();
AdvancedCapabilityValue(const std::string& name,
const std::string& display_name);
AdvancedCapabilityValue(const AdvancedCapabilityValue& other); AdvancedCapabilityValue(const AdvancedCapabilityValue& other);
~AdvancedCapabilityValue(); ~AdvancedCapabilityValue();
bool operator==(const AdvancedCapabilityValue& other) const;
// IPP identifier of the value. // IPP identifier of the value.
std::string name; std::string name;
...@@ -58,12 +66,17 @@ struct PRINTING_EXPORT AdvancedCapabilityValue { ...@@ -58,12 +66,17 @@ struct PRINTING_EXPORT AdvancedCapabilityValue {
}; };
struct PRINTING_EXPORT AdvancedCapability { struct PRINTING_EXPORT AdvancedCapability {
enum class Type : uint8_t { kBoolean, kFloat, kInteger, kString };
AdvancedCapability(); AdvancedCapability();
AdvancedCapability(const std::string& name,
const std::string& display_name,
AdvancedCapability::Type type,
const std::string& default_value,
const std::vector<AdvancedCapabilityValue>& values);
AdvancedCapability(const AdvancedCapability& other); AdvancedCapability(const AdvancedCapability& other);
~AdvancedCapability(); ~AdvancedCapability();
enum class Type : uint8_t { kBoolean, kFloat, kInteger, kString };
// IPP identifier of the attribute. // IPP identifier of the attribute.
std::string name; std::string name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment