https://bugs.webkit.org/show_bug.cgi?id=83390
Patch by Peter Rybin <peter.rybin@gmail.com> on 2012-04-10
Reviewed by Yury Semikhatsky.
Intermediate classes InspectorObjectBase and InspectorArrayBase are created. They have all raw methos
protected. InspectorObject and InspectorArray now inherit the corresponding base classes with exposing
all their protected methods.
"Open types" are left inheriting from InspectorObject, plus field name constants are generated for
an easy random access to all properties.
All the client code is fixed to use type-safe API rather than raw access methods in function parameter
and return types and bodies.
* inspector/CodeGeneratorInspector.py:
(RawTypes.Object):
(RawTypes.Object.get_setter_name):
(RawTypes.Array):
(RawTypes.Array.get_setter_name):
(TypeBindings.create_type_declaration_.ClassBinding.get_code_generator.CodeGenerator.generate_type_builder):
(Array):
(Generator):
(Generator.resolve_type_and_generate_ad_hoc.InterfaceGenerateContext):
(Generator.process_types.GenerateContext):
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::querySelectorAll):
(WebCore::InspectorDOMAgent::getEventListenersForNode):
(WebCore::InspectorDOMAgent::buildObjectForEventListener):
* inspector/InspectorDOMAgent.h:
(InspectorDOMAgent):
* inspector/InspectorDOMDebuggerAgent.cpp:
(WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent):
* inspector/InspectorDebuggerAgent.cpp:
(WebCore::InspectorDebuggerAgent::setBreakpointByUrl):
(WebCore::InspectorDebuggerAgent::didPause):
* inspector/InspectorPageAgent.cpp:
(WebCore::buildObjectForSearchResult):
(WebCore::InspectorPageAgent::searchInResources):
(WebCore::InspectorPageAgent::buildObjectForFrameTree):
* inspector/InspectorResourceAgent.cpp:
(WebCore::InspectorResourceAgent::didReceiveResponse):
* inspector/InspectorStyleSheet.cpp:
(WebCore::fillMediaListChain):
(WebCore::InspectorStyle::styleWithProperties):
* inspector/InspectorValues.cpp:
(WebCore::InspectorObjectBase::~InspectorObjectBase):
(WebCore::InspectorObjectBase::asObject):
(WebCore::InspectorObjectBase::openAccessors):
(WebCore):
(WebCore::InspectorObjectBase::getBoolean):
(WebCore::InspectorObjectBase::getString):
(WebCore::InspectorObjectBase::getObject):
(WebCore::InspectorObjectBase::getArray):
(WebCore::InspectorObjectBase::get):
(WebCore::InspectorObjectBase::remove):
(WebCore::InspectorObjectBase::writeJSON):
(WebCore::InspectorObjectBase::InspectorObjectBase):
(WebCore::InspectorArrayBase::~InspectorArrayBase):
(WebCore::InspectorArrayBase::asArray):
(WebCore::InspectorArrayBase::writeJSON):
(WebCore::InspectorArrayBase::InspectorArrayBase):
(WebCore::InspectorArrayBase::get):
* inspector/InspectorValues.h:
(InspectorObjectBase):
(InspectorObject):
(WebCore::InspectorObject::create):
(WebCore):
(InspectorArrayBase):
(WebCore::InspectorArrayBase::length):
(InspectorArray):
(WebCore::InspectorArray::create):
(WebCore::InspectorObjectBase::find):
(WebCore::InspectorObjectBase::setBoolean):
(WebCore::InspectorObjectBase::setNumber):
(WebCore::InspectorObjectBase::setString):
(WebCore::InspectorObjectBase::setValue):
(WebCore::InspectorObjectBase::setObject):
(WebCore::InspectorObjectBase::setArray):
(WebCore::InspectorArrayBase::pushBoolean):
(WebCore::InspectorArrayBase::pushInt):
(WebCore::InspectorArrayBase::pushNumber):
(WebCore::InspectorArrayBase::pushString):
(WebCore::InspectorArrayBase::pushValue):
(WebCore::InspectorArrayBase::pushObject):
(WebCore::InspectorArrayBase::pushArray):
* inspector/TimelineRecordFactory.cpp:
(WebCore::TimelineRecordFactory::createGenericRecord):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@113783
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-04-10 Peter Rybin <peter.rybin@gmail.com>
+
+ Web Inspector: CodeGeneratorInspector.py: do not expose raw methods from generated types
+ https://bugs.webkit.org/show_bug.cgi?id=83390
+
+ Reviewed by Yury Semikhatsky.
+
+ Intermediate classes InspectorObjectBase and InspectorArrayBase are created. They have all raw methos
+ protected. InspectorObject and InspectorArray now inherit the corresponding base classes with exposing
+ all their protected methods.
+
+ "Open types" are left inheriting from InspectorObject, plus field name constants are generated for
+ an easy random access to all properties.
+
+ All the client code is fixed to use type-safe API rather than raw access methods in function parameter
+ and return types and bodies.
+
+ * inspector/CodeGeneratorInspector.py:
+ (RawTypes.Object):
+ (RawTypes.Object.get_setter_name):
+ (RawTypes.Array):
+ (RawTypes.Array.get_setter_name):
+ (TypeBindings.create_type_declaration_.ClassBinding.get_code_generator.CodeGenerator.generate_type_builder):
+ (Array):
+ (Generator):
+ (Generator.resolve_type_and_generate_ad_hoc.InterfaceGenerateContext):
+ (Generator.process_types.GenerateContext):
+ * inspector/InspectorDOMAgent.cpp:
+ (WebCore::InspectorDOMAgent::querySelectorAll):
+ (WebCore::InspectorDOMAgent::getEventListenersForNode):
+ (WebCore::InspectorDOMAgent::buildObjectForEventListener):
+ * inspector/InspectorDOMAgent.h:
+ (InspectorDOMAgent):
+ * inspector/InspectorDOMDebuggerAgent.cpp:
+ (WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent):
+ * inspector/InspectorDebuggerAgent.cpp:
+ (WebCore::InspectorDebuggerAgent::setBreakpointByUrl):
+ (WebCore::InspectorDebuggerAgent::didPause):
+ * inspector/InspectorPageAgent.cpp:
+ (WebCore::buildObjectForSearchResult):
+ (WebCore::InspectorPageAgent::searchInResources):
+ (WebCore::InspectorPageAgent::buildObjectForFrameTree):
+ * inspector/InspectorResourceAgent.cpp:
+ (WebCore::InspectorResourceAgent::didReceiveResponse):
+ * inspector/InspectorStyleSheet.cpp:
+ (WebCore::fillMediaListChain):
+ (WebCore::InspectorStyle::styleWithProperties):
+ * inspector/InspectorValues.cpp:
+ (WebCore::InspectorObjectBase::~InspectorObjectBase):
+ (WebCore::InspectorObjectBase::asObject):
+ (WebCore::InspectorObjectBase::openAccessors):
+ (WebCore):
+ (WebCore::InspectorObjectBase::getBoolean):
+ (WebCore::InspectorObjectBase::getString):
+ (WebCore::InspectorObjectBase::getObject):
+ (WebCore::InspectorObjectBase::getArray):
+ (WebCore::InspectorObjectBase::get):
+ (WebCore::InspectorObjectBase::remove):
+ (WebCore::InspectorObjectBase::writeJSON):
+ (WebCore::InspectorObjectBase::InspectorObjectBase):
+ (WebCore::InspectorArrayBase::~InspectorArrayBase):
+ (WebCore::InspectorArrayBase::asArray):
+ (WebCore::InspectorArrayBase::writeJSON):
+ (WebCore::InspectorArrayBase::InspectorArrayBase):
+ (WebCore::InspectorArrayBase::get):
+ * inspector/InspectorValues.h:
+ (InspectorObjectBase):
+ (InspectorObject):
+ (WebCore::InspectorObject::create):
+ (WebCore):
+ (InspectorArrayBase):
+ (WebCore::InspectorArrayBase::length):
+ (InspectorArray):
+ (WebCore::InspectorArray::create):
+ (WebCore::InspectorObjectBase::find):
+ (WebCore::InspectorObjectBase::setBoolean):
+ (WebCore::InspectorObjectBase::setNumber):
+ (WebCore::InspectorObjectBase::setString):
+ (WebCore::InspectorObjectBase::setValue):
+ (WebCore::InspectorObjectBase::setObject):
+ (WebCore::InspectorObjectBase::setArray):
+ (WebCore::InspectorArrayBase::pushBoolean):
+ (WebCore::InspectorArrayBase::pushInt):
+ (WebCore::InspectorArrayBase::pushNumber):
+ (WebCore::InspectorArrayBase::pushString):
+ (WebCore::InspectorArrayBase::pushValue):
+ (WebCore::InspectorArrayBase::pushObject):
+ (WebCore::InspectorArrayBase::pushArray):
+ * inspector/TimelineRecordFactory.cpp:
+ (WebCore::TimelineRecordFactory::createGenericRecord):
+
2012-04-10 Philip Rogers <pdr@google.com>
Remove unnecessary calls to RenderSVGShape::createShape()
# This should be a temporary hack. TimelineEvent should be created via generated C++ API.
"Timeline.TimelineEvent"])
-TYPES_WITH_OPEN_FIELD_LIST_SET = frozenset(["Timeline.TimelineEvent"])
+TYPES_WITH_OPEN_FIELD_LIST_SET = frozenset(["Timeline.TimelineEvent",
+ # InspectorStyleSheet not only creates this property but wants to read it and modify it.
+ "CSS.CSSProperty",
+ # InspectorResourceAgent needs to update mime-type.
+ "Network.Response"])
cmdline_parser = optparse.OptionParser()
cmdline_parser.add_option("--output_h_dir")
def get_getter_name():
return "Object"
- get_setter_name = get_getter_name
+ @staticmethod
+ def get_setter_name():
+ return "Value"
@staticmethod
def get_c_initializer():
def get_getter_name():
return "Array"
- get_setter_name = get_getter_name
+ @staticmethod
+ def get_setter_name():
+ return "Value"
@staticmethod
def get_c_initializer():
resolve_data = class_binding_cls.resolve_data_
helper.write_doc(writer)
class_name = fixed_type_name.class_name
+
+ is_open_type = (context_domain_name + "." + class_name) in TYPES_WITH_OPEN_FIELD_LIST_SET
+
fixed_type_name.output_comment(writer)
writer.newline("class ")
writer.append(class_name)
- writer.append(" : public InspectorObject {\n")
+ writer.append(" : public ")
+ if is_open_type:
+ writer.append("InspectorObject")
+ else:
+ writer.append("InspectorObjectBase")
+ writer.append(" {\n")
writer.newline("public:\n")
ad_hoc_type_writer = writer.insert_writer(" ")
return *reinterpret_cast<Builder<STATE | STEP>*>(this);
}
- Builder(PassRefPtr<%s> ptr)
+ Builder(PassRefPtr</*%s*/InspectorObject> ptr)
{
COMPILE_ASSERT(STATE == NoFieldsSet, builder_created_in_non_init_state);
m_result = ptr;
operator RefPtr<%s>& ()
{
COMPILE_ASSERT(STATE == AllFieldsSet, result_is_not_ready);
+ COMPILE_ASSERT(sizeof(%s) == sizeof(InspectorObject), cannot_cast);
return *reinterpret_cast<RefPtr<%s>*>(&m_result);
}
};
"""
- % (class_name, class_name, class_name, class_name))
+ % (class_name, class_name, class_name, class_name, class_name))
writer.newline(" /*\n")
writer.newline(" * Synthetic constructor:\n")
writer.newline_multiline(
""" static Builder<NoFieldsSet> create()
{
- return Builder<NoFieldsSet>(adoptRef(new %s()));
+ return Builder<NoFieldsSet>(InspectorObject::create());
}
-""" % class_name)
+""")
writer.newline(" typedef TypeBuilder::StructItemTraits ItemTraits;\n")
if setter_name in INSPECTOR_OBJECT_SETTER_NAMES:
- writer.newline(" using InspectorObject::%s;\n\n" % setter_name)
+ writer.newline(" using InspectorObjectBase::%s;\n\n" % setter_name)
if class_binding_cls.need_user_runtime_cast_:
writer.newline(" static PassRefPtr<%s> runtimeCast(PassRefPtr<InspectorValue> value)\n" % class_name)
writer.append("#if %s\n" % VALIDATOR_IFDEF_NAME)
writer.newline(" assertCorrectValue(object.get());\n")
writer.append("#endif // %s\n" % VALIDATOR_IFDEF_NAME)
- writer.newline(" COMPILE_ASSERT(sizeof(%s) == sizeof(InspectorObject), type_cast_problem);\n" % class_name)
- writer.newline(" return static_cast<%s*>(object.get());\n" % class_name)
+ writer.newline(" COMPILE_ASSERT(sizeof(%s) == sizeof(InspectorObjectBase), type_cast_problem);\n" % class_name)
+ writer.newline(" return static_cast<%s*>(static_cast<InspectorObjectBase*>(object.get()));\n" % class_name)
writer.newline(" }\n")
writer.append("\n")
validator_writer.newline(" ASSERT(foundPropertiesCount == object->size());\n")
validator_writer.newline("}\n\n\n")
+ if is_open_type:
+ cpp_writer = generate_context.cpp_writer
+ writer.append("\n")
+ writer.newline(" // Property names for type generated as open.\n")
+ for prop_data in resolve_data.main_properties + resolve_data.optional_properties:
+ prop_name = prop_data.p["name"]
+ prop_field_name = Capitalizer.lower_camel_case_to_upper(prop_name)
+ writer.newline(" static const char* %s;\n" % (prop_field_name))
+ cpp_writer.newline("const char* %s%s::%s = \"%s\";\n" % (helper.full_name_prefix_for_impl, class_name, prop_field_name, prop_name))
+
+
writer.newline("};\n\n")
@staticmethod
};
template<typename T>
-class Array : public InspectorArray {
+class Array : public InspectorArrayBase {
private:
Array() { }
+ InspectorArray* openAccessors() {
+ COMPILE_ASSERT(sizeof(InspectorArray) == sizeof(Array<T>), cannot_cast);
+ return static_cast<InspectorArray*>(static_cast<InspectorArrayBase*>(this));
+ }
+
public:
void addItem(PassRefPtr<T> value)
{
- ArrayItemHelper<T>::Traits::pushRefPtr(this, value);
+ ArrayItemHelper<T>::Traits::pushRefPtr(this->openAccessors(), value);
}
void addItem(T value)
{
- ArrayItemHelper<T>::Traits::pushRaw(this, value);
+ ArrayItemHelper<T>::Traits::pushRaw(this->openAccessors(), value);
}
static PassRefPtr<Array<T> > create()
assertCorrectValue(array.get());
#endif // !ASSERT_DISABLED
COMPILE_ASSERT(sizeof(Array<T>) == sizeof(InspectorArray), type_cast_problem);
- return static_cast<Array<T>*>(array.get());
+ return static_cast<Array<T>*>(static_cast<InspectorArrayBase*>(array.get()));
}
#if """ + VALIDATOR_IFDEF_NAME + """
};
struct StructItemTraits {
- static void pushRefPtr(InspectorArray* array, PassRefPtr<InspectorObject> value)
+ static void pushRefPtr(InspectorArray* array, PassRefPtr<InspectorValue> value)
{
- array->pushObject(value);
+ array->pushValue(value);
}
template<typename T>
template<>
struct ArrayItemHelper<InspectorObject> {
struct Traits {
- static void pushRefPtr(InspectorArray* array, PassRefPtr<InspectorObject> value)
+ static void pushRefPtr(InspectorArray* array, PassRefPtr<InspectorValue> value)
{
- array->pushObject(value);
+ array->pushValue(value);
}
};
};
struct Traits {
static void pushRefPtr(InspectorArray* array, PassRefPtr<TypeBuilder::Array<T> > value)
{
- array->pushArray(value);
+ array->pushValue(value);
}
};
};
} // namespace TypeBuilder
+$implCode
+
#if """ + VALIDATOR_IFDEF_NAME + """
$validatorCode
type_builder_forwards = []
validator_impl_list = []
validator_impl_raw_types_list = []
+ type_builder_impl_list = []
@staticmethod
class InterfaceGenerateContext:
validator_writer = "not supported in InterfaceGenerateContext"
+ cpp_writer = validator_writer
for type in ad_hoc_type_list:
generator = type.get_code_generator()
class GenerateContext:
validator_writer = Writer(Generator.validator_impl_list, "")
+ cpp_writer = Writer(Generator.type_builder_impl_list, "")
def generate_all_domains_code(out, type_data_callback):
writer = Writer(out, "")
typebuilder_cpp_file.write(Templates.typebuilder_cpp.substitute(None,
enumConstantValues=EnumConstants.get_enum_constant_code(),
+ implCode=join(flatten_list(Generator.type_builder_impl_list), ""),
validatorCode=join(flatten_list(Generator.validator_impl_list), "")))
backend_js_file.write(Templates.backend_js.substitute(None,
result = TypeBuilder::Array<int>::create();
for (unsigned i = 0; i < nodes->length(); ++i)
- result->pushNumber(pushNodePathToFrontend(nodes->item(i)));
+ result->addItem(pushNodePathToFrontend(nodes->item(i)));
}
int InspectorDOMAgent::pushNodePathToFrontend(Node* nodeToPush)
for (size_t j = 0; j < vector.size(); ++j) {
const RegisteredEventListener& listener = vector[j];
if (listener.useCapture)
- listenersArray->pushObject(buildObjectForEventListener(listener, info.eventType, info.node));
+ listenersArray->addItem(buildObjectForEventListener(listener, info.eventType, info.node));
}
}
for (size_t j = 0; j < vector.size(); ++j) {
const RegisteredEventListener& listener = vector[j];
if (!listener.useCapture)
- listenersArray->pushObject(buildObjectForEventListener(listener, info.eventType, info.node));
+ listenersArray->addItem(buildObjectForEventListener(listener, info.eventType, info.node));
}
}
}
return children.release();
}
-PassRefPtr<InspectorObject> InspectorDOMAgent::buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, Node* node)
+PassRefPtr<TypeBuilder::DOM::EventListener> InspectorDOMAgent::buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, Node* node)
{
RefPtr<EventListener> eventListener = registeredEventListener.listener;
RefPtr<TypeBuilder::DOM::EventListener> value = TypeBuilder::DOM::EventListener::create()
PassRefPtr<TypeBuilder::DOM::Node> buildObjectForNode(Node*, int depth, NodeToIdMap*);
PassRefPtr<TypeBuilder::Array<String> > buildArrayForElementAttributes(Element*);
PassRefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > buildArrayForContainerChildren(Node* container, int depth, NodeToIdMap* nodesMap);
- PassRefPtr<InspectorObject> buildObjectForEventListener(const RegisteredEventListener&, const AtomicString& eventType, Node*);
+ PassRefPtr<TypeBuilder::DOM::EventListener> buildObjectForEventListener(const RegisteredEventListener&, const AtomicString& eventType, Node*);
Node* nodeForPath(const String& path);
if ((1 << breakpointType) & inheritableDOMBreakpointTypesMask) {
// For inheritable breakpoint types, target node isn't always the same as the node that owns a breakpoint.
// Target node may be unknown to frontend, so we need to push it first.
- RefPtr<InspectorObject> targetNodeObject = m_domAgent->resolveNode(target, InspectorDebuggerAgent::backtraceObjectGroup);
- description->setObject("targetNode", targetNodeObject);
+ RefPtr<TypeBuilder::Runtime::RemoteObject> targetNodeObject = m_domAgent->resolveNode(target, InspectorDebuggerAgent::backtraceObjectGroup);
+ description->setValue("targetNode", targetNodeObject);
// Find breakpoint owner node.
if (!insertion)
for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) {
if (!matches(it->second.url, url, isRegex))
continue;
- RefPtr<InspectorObject> location = resolveBreakpoint(breakpointId, it->first, breakpoint);
+ RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(breakpointId, it->first, breakpoint);
if (location)
- locations->pushObject(location);
+ locations->addItem(location);
}
*outBreakpointId = breakpointId;
}
InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState);
if (!injectedScript.hasNoValue()) {
m_breakReason = InspectorFrontend::Debugger::Reason::Exception;
- m_breakAuxData = injectedScript.wrapObject(exception, "backtrace");
+ m_breakAuxData = injectedScript.wrapObject(exception, "backtrace")->openAccessors();
// m_breakAuxData might be null after this.
}
}
results = ContentSearchUtils::searchInTextByLines(content, query, caseSensitive, isRegex);
}
-static PassRefPtr<InspectorObject> buildObjectForSearchResult(const String& frameId, const String& url, int matchesCount)
+static PassRefPtr<TypeBuilder::Page::SearchResult> buildObjectForSearchResult(const String& frameId, const String& url, int matchesCount)
{
- RefPtr<InspectorObject> result = InspectorObject::create();
- result->setString("frameId", frameId);
- result->setString("url", url);
- result->setNumber("matchesCount", matchesCount);
-
- return result;
+ return TypeBuilder::Page::SearchResult::create()
+ .setUrl(url)
+ .setFrameId(frameId)
+ .setMatchesCount(matchesCount);
}
void InspectorPageAgent::searchInResources(ErrorString*, const String& text, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr<TypeBuilder::Array<TypeBuilder::Page::SearchResult> >& results)
if (textContentForCachedResource(cachedResource, &content)) {
int matchesCount = ContentSearchUtils::countRegularExpressionMatches(regex, content);
if (matchesCount)
- searchResults->pushValue(buildObjectForSearchResult(frameId(frame), cachedResource->url(), matchesCount));
+ searchResults->addItem(buildObjectForSearchResult(frameId(frame), cachedResource->url(), matchesCount));
}
}
if (mainResourceContent(frame, false, &content)) {
int matchesCount = ContentSearchUtils::countRegularExpressionMatches(regex, content);
if (matchesCount)
- searchResults->pushValue(buildObjectForSearchResult(frameId(frame), frame->document()->url(), matchesCount));
+ searchResults->addItem(buildObjectForSearchResult(frameId(frame), frame->document()->url(), matchesCount));
}
}
subresources->addItem(resourceObject);
}
- RefPtr<InspectorArray> childrenArray;
+ RefPtr<TypeBuilder::Array<TypeBuilder::Page::FrameResourceTree> > childrenArray;
for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) {
if (!childrenArray) {
- childrenArray = InspectorArray::create();
- result->setArray("childFrames", childrenArray);
+ childrenArray = TypeBuilder::Array<TypeBuilder::Page::FrameResourceTree>::create();
+ result->setChildFrames(childrenArray);
}
- childrenArray->pushObject(buildObjectForFrameTree(child));
+ childrenArray->addItem(buildObjectForFrameTree(child));
}
return result;
}
cachedResourceSize = cachedResource->encodedSize();
// Use mime type from cached resource in case the one in response is empty.
if (resourceResponse && response.mimeType().isEmpty())
- resourceResponse->setString("mimeType", cachedResource->response().mimeType());
+ resourceResponse->setString(TypeBuilder::Network::Response::MimeType, cachedResource->response().mimeType());
m_resourcesData->addCachedResource(requestId, cachedResource);
}
sourceURL = styleSheet->finalURL();
else
sourceURL = "";
- mediaArray->pushObject(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL));
+ mediaArray->addItem(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL));
}
parentRule = styleSheet->ownerRule();
if (parentRule)
shouldInactivate = true;
else {
bool previousParsedOk;
- bool success = activeIt->second->getBoolean("parsedOk", &previousParsedOk);
+ bool success = activeIt->second->getBoolean(TypeBuilder::CSS::CSSProperty::ParsedOk, &previousParsedOk);
if (success && !previousParsedOk)
shouldInactivate = true;
}
if (shouldInactivate) {
activeIt->second->setStatus(TypeBuilder::CSS::CSSProperty::Status::Inactive);
- activeIt->second->remove("shorthandName");
+ activeIt->second->remove(TypeBuilder::CSS::CSSProperty::ShorthandName);
propertyNameToPreviousActiveProperty.set(canonicalPropertyName, property);
}
} else {
RefPtr<InspectorObject> shorthandEntry = InspectorObject::create();
shorthandEntry->setString("name", shorthand);
shorthandEntry->setString("value", shorthandValue(shorthand));
- shorthandEntries->pushObject(shorthandEntry.release());
+ shorthandEntries->addItem(shorthandEntry.release());
}
}
}
OBJECT_PAIR_SEPARATOR,
INVALID_TOKEN,
};
-
+
const char* const nullString = "null";
const char* const trueString = "true";
const char* const falseString = "false";
case '8':
case '9':
case '-':
- if (parseNumberToken(start, end, tokenEnd))
+ if (parseNumberToken(start, end, tokenEnd))
return NUMBER;
- break;
+ break;
case '"':
- if (parseStringToken(start + 1, end, tokenEnd))
+ if (parseStringToken(start + 1, end, tokenEnd))
return STRING;
break;
}
doubleQuoteString(m_stringValue, output);
}
-InspectorObject::~InspectorObject()
+InspectorObjectBase::~InspectorObjectBase()
{
}
-bool InspectorObject::asObject(RefPtr<InspectorObject>* output)
+bool InspectorObjectBase::asObject(RefPtr<InspectorObject>* output)
{
- *output = this;
+ COMPILE_ASSERT(sizeof(InspectorObject) == sizeof(InspectorObjectBase), cannot_cast);
+ *output = static_cast<InspectorObject*>(this);
return true;
}
-PassRefPtr<InspectorObject> InspectorObject::asObject()
+PassRefPtr<InspectorObject> InspectorObjectBase::asObject()
{
- return this;
+ return openAccessors();
}
-bool InspectorObject::getBoolean(const String& name, bool* output) const
+InspectorObject* InspectorObjectBase::openAccessors()
+{
+ COMPILE_ASSERT(sizeof(InspectorObject) == sizeof(InspectorObjectBase), cannot_cast);
+ return static_cast<InspectorObject*>(this);
+}
+
+bool InspectorObjectBase::getBoolean(const String& name, bool* output) const
{
RefPtr<InspectorValue> value = get(name);
if (!value)
return value->asBoolean(output);
}
-bool InspectorObject::getString(const String& name, String* output) const
+bool InspectorObjectBase::getString(const String& name, String* output) const
{
RefPtr<InspectorValue> value = get(name);
if (!value)
return value->asString(output);
}
-PassRefPtr<InspectorObject> InspectorObject::getObject(const String& name) const
+PassRefPtr<InspectorObject> InspectorObjectBase::getObject(const String& name) const
{
PassRefPtr<InspectorValue> value = get(name);
if (!value)
return value->asObject();
}
-PassRefPtr<InspectorArray> InspectorObject::getArray(const String& name) const
+PassRefPtr<InspectorArray> InspectorObjectBase::getArray(const String& name) const
{
PassRefPtr<InspectorValue> value = get(name);
if (!value)
return value->asArray();
}
-PassRefPtr<InspectorValue> InspectorObject::get(const String& name) const
+PassRefPtr<InspectorValue> InspectorObjectBase::get(const String& name) const
{
Dictionary::const_iterator it = m_data.find(name);
if (it == m_data.end())
return it->second;
}
-void InspectorObject::remove(const String& name)
+void InspectorObjectBase::remove(const String& name)
{
m_data.remove(name);
for (size_t i = 0; i < m_order.size(); ++i) {
}
}
-void InspectorObject::writeJSON(StringBuilder* output) const
+void InspectorObjectBase::writeJSON(StringBuilder* output) const
{
output->append('{');
for (size_t i = 0; i < m_order.size(); ++i) {
output->append('}');
}
-InspectorObject::InspectorObject()
+InspectorObjectBase::InspectorObjectBase()
: InspectorValue(TypeObject)
, m_data()
, m_order()
{
}
-InspectorArray::~InspectorArray()
+InspectorArrayBase::~InspectorArrayBase()
{
}
-bool InspectorArray::asArray(RefPtr<InspectorArray>* output)
+bool InspectorArrayBase::asArray(RefPtr<InspectorArray>* output)
{
- *output = this;
+ COMPILE_ASSERT(sizeof(InspectorArrayBase) == sizeof(InspectorArray), cannot_cast);
+ *output = static_cast<InspectorArray*>(this);
return true;
}
-PassRefPtr<InspectorArray> InspectorArray::asArray()
+PassRefPtr<InspectorArray> InspectorArrayBase::asArray()
{
- return this;
+ COMPILE_ASSERT(sizeof(InspectorArrayBase) == sizeof(InspectorArray), cannot_cast);
+ return static_cast<InspectorArray*>(this);
}
-void InspectorArray::writeJSON(StringBuilder* output) const
+void InspectorArrayBase::writeJSON(StringBuilder* output) const
{
output->append('[');
for (Vector<RefPtr<InspectorValue> >::const_iterator it = m_data.begin(); it != m_data.end(); ++it) {
output->append(']');
}
-InspectorArray::InspectorArray()
+InspectorArrayBase::InspectorArrayBase()
: InspectorValue(TypeArray)
, m_data()
{
}
-PassRefPtr<InspectorValue> InspectorArray::get(size_t index)
+PassRefPtr<InspectorValue> InspectorArrayBase::get(size_t index)
{
ASSERT(index < m_data.size());
return m_data[index];
String m_stringValue;
};
-class InspectorObject : public InspectorValue {
+class InspectorObjectBase : public InspectorValue {
private:
typedef HashMap<String, RefPtr<InspectorValue> > Dictionary;
typedef Dictionary::iterator iterator;
typedef Dictionary::const_iterator const_iterator;
- static PassRefPtr<InspectorObject> create()
- {
- return adoptRef(new InspectorObject());
- }
- ~InspectorObject();
+ virtual PassRefPtr<InspectorObject> asObject();
+ InspectorObject* openAccessors();
+
+protected:
+ ~InspectorObjectBase();
virtual bool asObject(RefPtr<InspectorObject>* output);
- virtual PassRefPtr<InspectorObject> asObject();
void setBoolean(const String& name, bool);
void setNumber(const String& name, double);
int size() const { return m_data.size(); }
protected:
- InspectorObject();
+ InspectorObjectBase();
private:
Dictionary m_data;
Vector<String> m_order;
};
-class InspectorArray : public InspectorValue {
+class InspectorObject : public InspectorObjectBase {
+public:
+ static PassRefPtr<InspectorObject> create()
+ {
+ return adoptRef(new InspectorObject());
+ }
+
+ using InspectorObjectBase::asObject;
+
+ using InspectorObjectBase::setBoolean;
+ using InspectorObjectBase::setNumber;
+ using InspectorObjectBase::setString;
+ using InspectorObjectBase::setValue;
+ using InspectorObjectBase::setObject;
+ using InspectorObjectBase::setArray;
+
+ using InspectorObjectBase::find;
+ using InspectorObjectBase::getBoolean;
+ using InspectorObjectBase::getNumber;
+ using InspectorObjectBase::getString;
+ using InspectorObjectBase::getObject;
+ using InspectorObjectBase::getArray;
+ using InspectorObjectBase::get;
+
+ using InspectorObjectBase::remove;
+
+ using InspectorObjectBase::begin;
+ using InspectorObjectBase::end;
+
+ using InspectorObjectBase::size;
+};
+
+
+class InspectorArrayBase : public InspectorValue {
public:
typedef Vector<RefPtr<InspectorValue> >::iterator iterator;
typedef Vector<RefPtr<InspectorValue> >::const_iterator const_iterator;
- static PassRefPtr<InspectorArray> create()
- {
- return adoptRef(new InspectorArray());
- }
- ~InspectorArray();
+ virtual PassRefPtr<InspectorArray> asArray();
+
+ unsigned length() const { return m_data.size(); }
+
+protected:
+ ~InspectorArrayBase();
virtual bool asArray(RefPtr<InspectorArray>* output);
- virtual PassRefPtr<InspectorArray> asArray();
void pushBoolean(bool);
void pushInt(int);
void pushValue(PassRefPtr<InspectorValue>);
void pushObject(PassRefPtr<InspectorObject>);
void pushArray(PassRefPtr<InspectorArray>);
- unsigned length() const { return m_data.size(); }
PassRefPtr<InspectorValue> get(size_t index);
const_iterator end() const { return m_data.end(); }
protected:
- InspectorArray();
+ InspectorArrayBase();
private:
Vector<RefPtr<InspectorValue> > m_data;
};
-inline InspectorObject::iterator InspectorObject::find(const String& name)
+class InspectorArray : public InspectorArrayBase {
+public:
+ static PassRefPtr<InspectorArray> create()
+ {
+ return adoptRef(new InspectorArray());
+ }
+
+ using InspectorArrayBase::asArray;
+
+ using InspectorArrayBase::pushBoolean;
+ using InspectorArrayBase::pushInt;
+ using InspectorArrayBase::pushNumber;
+ using InspectorArrayBase::pushString;
+ using InspectorArrayBase::pushValue;
+ using InspectorArrayBase::pushObject;
+ using InspectorArrayBase::pushArray;
+
+ using InspectorArrayBase::get;
+
+ using InspectorArrayBase::begin;
+ using InspectorArrayBase::end;
+};
+
+
+inline InspectorObjectBase::iterator InspectorObjectBase::find(const String& name)
{
return m_data.find(name);
}
-inline InspectorObject::const_iterator InspectorObject::find(const String& name) const
+inline InspectorObjectBase::const_iterator InspectorObjectBase::find(const String& name) const
{
return m_data.find(name);
}
-inline void InspectorObject::setBoolean(const String& name, bool value)
+inline void InspectorObjectBase::setBoolean(const String& name, bool value)
{
setValue(name, InspectorBasicValue::create(value));
}
-inline void InspectorObject::setNumber(const String& name, double value)
+inline void InspectorObjectBase::setNumber(const String& name, double value)
{
setValue(name, InspectorBasicValue::create(value));
}
-inline void InspectorObject::setString(const String& name, const String& value)
+inline void InspectorObjectBase::setString(const String& name, const String& value)
{
setValue(name, InspectorString::create(value));
}
-inline void InspectorObject::setValue(const String& name, PassRefPtr<InspectorValue> value)
+inline void InspectorObjectBase::setValue(const String& name, PassRefPtr<InspectorValue> value)
{
ASSERT(value);
if (m_data.set(name, value).isNewEntry)
m_order.append(name);
}
-inline void InspectorObject::setObject(const String& name, PassRefPtr<InspectorObject> value)
+inline void InspectorObjectBase::setObject(const String& name, PassRefPtr<InspectorObject> value)
{
ASSERT(value);
if (m_data.set(name, value).isNewEntry)
m_order.append(name);
}
-inline void InspectorObject::setArray(const String& name, PassRefPtr<InspectorArray> value)
+inline void InspectorObjectBase::setArray(const String& name, PassRefPtr<InspectorArray> value)
{
ASSERT(value);
if (m_data.set(name, value).isNewEntry)
m_order.append(name);
}
-inline void InspectorArray::pushBoolean(bool value)
+inline void InspectorArrayBase::pushBoolean(bool value)
{
m_data.append(InspectorBasicValue::create(value));
}
-inline void InspectorArray::pushInt(int value)
+inline void InspectorArrayBase::pushInt(int value)
{
m_data.append(InspectorBasicValue::create(value));
}
-inline void InspectorArray::pushNumber(double value)
+inline void InspectorArrayBase::pushNumber(double value)
{
m_data.append(InspectorBasicValue::create(value));
}
-inline void InspectorArray::pushString(const String& value)
+inline void InspectorArrayBase::pushString(const String& value)
{
m_data.append(InspectorString::create(value));
}
-inline void InspectorArray::pushValue(PassRefPtr<InspectorValue> value)
+inline void InspectorArrayBase::pushValue(PassRefPtr<InspectorValue> value)
{
ASSERT(value);
m_data.append(value);
}
-inline void InspectorArray::pushObject(PassRefPtr<InspectorObject> value)
+inline void InspectorArrayBase::pushObject(PassRefPtr<InspectorObject> value)
{
ASSERT(value);
m_data.append(value);
}
-inline void InspectorArray::pushArray(PassRefPtr<InspectorArray> value)
+inline void InspectorArrayBase::pushArray(PassRefPtr<InspectorArray> value)
{
ASSERT(value);
m_data.append(value);
if (maxCallStackDepth) {
RefPtr<ScriptCallStack> stackTrace = createScriptCallStack(maxCallStackDepth, true);
if (stackTrace && stackTrace->size())
- record->setArray("stackTrace", stackTrace->buildInspectorArray());
+ record->setValue("stackTrace", stackTrace->buildInspectorArray());
}
return record.release();
}