Web Inspector: CodeGeneratorInspector.py: do not expose raw methods from generated...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Apr 2012 22:39:39 +0000 (22:39 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Apr 2012 22:39:39 +0000 (22:39 +0000)
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

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/inspector/CodeGeneratorInspector.py
Source/WebCore/inspector/InspectorDOMAgent.cpp
Source/WebCore/inspector/InspectorDOMAgent.h
Source/WebCore/inspector/InspectorDOMDebuggerAgent.cpp
Source/WebCore/inspector/InspectorDebuggerAgent.cpp
Source/WebCore/inspector/InspectorPageAgent.cpp
Source/WebCore/inspector/InspectorResourceAgent.cpp
Source/WebCore/inspector/InspectorStyleSheet.cpp
Source/WebCore/inspector/InspectorValues.cpp
Source/WebCore/inspector/InspectorValues.h
Source/WebCore/inspector/TimelineRecordFactory.cpp

index db56b81..3b3e9de 100644 (file)
@@ -1,3 +1,94 @@
+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()
index 6301ec1..5a5affd 100755 (executable)
@@ -61,7 +61,11 @@ TYPES_WITH_RUNTIME_CAST_SET = frozenset(["Runtime.RemoteObject", "Runtime.Proper
                                          # 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")
@@ -422,7 +426,9 @@ class RawTypes(object):
         def get_getter_name():
             return "Object"
 
-        get_setter_name = get_getter_name
+        @staticmethod
+        def get_setter_name():
+            return "Value"
 
         @staticmethod
         def get_c_initializer():
@@ -506,7 +512,9 @@ class RawTypes(object):
         def get_getter_name():
             return "Array"
 
-        get_setter_name = get_getter_name
+        @staticmethod
+        def get_setter_name():
+            return "Value"
 
         @staticmethod
         def get_c_initializer():
@@ -1141,10 +1149,18 @@ class TypeBindings:
                                 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("    ")
 
@@ -1184,7 +1200,7 @@ class TypeBindings:
             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;
@@ -1222,6 +1238,7 @@ class TypeBindings:
         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);
         }
 
@@ -1232,7 +1249,7 @@ class TypeBindings:
     };
 
 """
-                                % (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")
@@ -1244,9 +1261,9 @@ class TypeBindings:
                                 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")
 
@@ -1265,7 +1282,7 @@ class TypeBindings:
 
 
                                     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)
@@ -1276,8 +1293,8 @@ class TypeBindings:
                                     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")
 
@@ -1322,6 +1339,17 @@ class TypeBindings:
                                         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
@@ -2204,19 +2232,24 @@ struct ArrayItemHelper {
 };
 
 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()
@@ -2233,7 +2266,7 @@ public:
         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 + """
@@ -2250,9 +2283,9 @@ public:
 };
 
 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>
@@ -2294,9 +2327,9 @@ struct ArrayItemHelper<InspectorValue> {
 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);
         }
     };
 };
@@ -2306,7 +2339,7 @@ struct ArrayItemHelper<TypeBuilder::Array<T> > {
     struct Traits {
         static void pushRefPtr(InspectorArray* array, PassRefPtr<TypeBuilder::Array<T> > value)
         {
-            array->pushArray(value);
+            array->pushValue(value);
         }
     };
 };
@@ -2348,6 +2381,8 @@ String getEnumConstantValue(int code) {
 
 } // namespace TypeBuilder
 
+$implCode
+
 #if """ + VALIDATOR_IFDEF_NAME + """
 
 $validatorCode
@@ -2467,6 +2502,7 @@ class Generator:
     type_builder_forwards = []
     validator_impl_list = []
     validator_impl_raw_types_list = []
+    type_builder_impl_list = []
 
 
     @staticmethod
@@ -2777,6 +2813,7 @@ class Generator:
 
         class InterfaceGenerateContext:
             validator_writer = "not supported in InterfaceGenerateContext"
+            cpp_writer = validator_writer
 
         for type in ad_hoc_type_list:
             generator = type.get_code_generator()
@@ -2791,6 +2828,7 @@ class 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, "")
@@ -2905,6 +2943,7 @@ typebuilder_h_file.write(Templates.typebuilder_h.substitute(None,
 
 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,
index 3879f63..348c662 100644 (file)
@@ -505,7 +505,7 @@ void InspectorDOMAgent::querySelectorAll(ErrorString* errorString, int nodeId, c
     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)
@@ -746,7 +746,7 @@ void InspectorDOMAgent::getEventListenersForNode(ErrorString* errorString, int n
         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));
         }
     }
 
@@ -757,7 +757,7 @@ void InspectorDOMAgent::getEventListenersForNode(ErrorString* errorString, int n
         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));
         }
     }
 }
@@ -1287,7 +1287,7 @@ PassRefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > InspectorDOMAgent::build
     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()
index 34b41e6..6b96c2b 100644 (file)
@@ -227,7 +227,7 @@ private:
     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);
 
index ce753cb..231aee5 100644 (file)
@@ -307,8 +307,8 @@ void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node* target, int breakpo
     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)
index 924be38..25fa3fb 100644 (file)
@@ -242,9 +242,9 @@ void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int li
     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;
 }
@@ -568,7 +568,7 @@ void InspectorDebuggerAgent::didPause(ScriptState* scriptState, const ScriptValu
         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.
         }
     }
index e4d6e1d..446da03 100644 (file)
@@ -589,14 +589,12 @@ void InspectorPageAgent::searchInResource(ErrorString*, const String& frameId, c
     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)
@@ -615,13 +613,13 @@ void InspectorPageAgent::searchInResources(ErrorString*, const String& text, con
             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));
         }
     }
 
@@ -903,13 +901,13 @@ PassRefPtr<TypeBuilder::Page::FrameResourceTree> InspectorPageAgent::buildObject
         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;
 }
index 1700211..0d0c793 100644 (file)
@@ -253,7 +253,7 @@ void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, Docume
             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);
         }
index ec5b77e..ab89667 100644 (file)
@@ -229,7 +229,7 @@ static void fillMediaListChain(CSSRule* rule, Array<TypeBuilder::CSS::CSSMedia>*
                         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)
@@ -510,7 +510,7 @@ PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyle::styleWithProperties() con
                         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;
                     }
@@ -519,7 +519,7 @@ PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyle::styleWithProperties() con
 
                 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 {
@@ -546,7 +546,7 @@ PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyle::styleWithProperties() con
                     RefPtr<InspectorObject> shorthandEntry = InspectorObject::create();
                     shorthandEntry->setString("name", shorthand);
                     shorthandEntry->setString("value", shorthandValue(shorthand));
-                    shorthandEntries->pushObject(shorthandEntry.release());
+                    shorthandEntries->addItem(shorthandEntry.release());
                 }
             }
         }
index b895937..e8861c0 100644 (file)
@@ -58,7 +58,7 @@ enum Token {
     OBJECT_PAIR_SEPARATOR,
     INVALID_TOKEN,
 };
-    
+
 const char* const nullString = "null";
 const char* const trueString = "true";
 const char* const falseString = "false";
@@ -241,11 +241,11 @@ Token parseToken(const UChar* start, const UChar* end, const UChar** tokenStart,
     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;
     }
@@ -661,22 +661,29 @@ void InspectorString::writeJSON(StringBuilder* output) const
     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)
@@ -684,7 +691,7 @@ bool InspectorObject::getBoolean(const String& name, bool* output) const
     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)
@@ -692,7 +699,7 @@ bool InspectorObject::getString(const String& name, String* output) const
     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)
@@ -700,7 +707,7 @@ PassRefPtr<InspectorObject> InspectorObject::getObject(const String& name) const
     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)
@@ -708,7 +715,7 @@ PassRefPtr<InspectorArray> InspectorObject::getArray(const String& name) const
     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())
@@ -716,7 +723,7 @@ PassRefPtr<InspectorValue> InspectorObject::get(const String& name) const
     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) {
@@ -727,7 +734,7 @@ void InspectorObject::remove(const String& name)
     }
 }
 
-void InspectorObject::writeJSON(StringBuilder* output) const
+void InspectorObjectBase::writeJSON(StringBuilder* output) const
 {
     output->append('{');
     for (size_t i = 0; i < m_order.size(); ++i) {
@@ -742,29 +749,31 @@ void InspectorObject::writeJSON(StringBuilder* output) const
     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) {
@@ -775,13 +784,13 @@ void InspectorArray::writeJSON(StringBuilder* output) const
     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];
index c91ad82..de7a463 100644 (file)
@@ -157,7 +157,7 @@ private:
     String m_stringValue;
 };
 
-class InspectorObject : public InspectorValue {
+class InspectorObjectBase : public InspectorValue {
 private:
     typedef HashMap<String, RefPtr<InspectorValue> > Dictionary;
 
@@ -165,14 +165,13 @@ public:
     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);
@@ -208,26 +207,59 @@ public:
     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);
@@ -236,7 +268,6 @@ public:
     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);
 
@@ -248,91 +279,115 @@ public:
     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);
index 6fbaea2..152be3a 100644 (file)
@@ -53,7 +53,7 @@ PassRefPtr<InspectorObject> TimelineRecordFactory::createGenericRecord(double st
     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();
 }