diff options
| author | Marc Jeanmougin <marc@jeanmougin.fr> | 2015-07-14 11:04:32 +0000 |
|---|---|---|
| committer | Marc Jeanmougin <marcjeanmougin@free.fr> | 2015-07-14 11:04:32 +0000 |
| commit | 676707120d5527ff8c8c8c89ea33d1eadf9cf1b4 (patch) | |
| tree | c2d91ac1c2c2453f8db7a5bed7b9f52b67320178 /src/sp-object.cpp | |
| parent | fix "arrange" tool (typo) (diff) | |
| download | inkscape-676707120d5527ff8c8c8c89ea33d1eadf9cf1b4.tar.gz inkscape-676707120d5527ff8c8c8c89ea33d1eadf9cf1b4.zip | |
Fix for circular references detection in almost all cases, fixing https://bugs.launchpad.net/inkscape/+bug/167247 and a few of its duplicates.
This fix is aimed at preventing any sort of circular references with the URIReference::_acceptObject method, checking the absence of loops in the reference+child tree.
There can be some performance improvements done if we add a pointer from cloned sub-objects to their origin sub-object.
The remaining cases that are not fixed can involve non-trivial loops using one or more "url()" stylesheet references. Being able to take them into account would require a non-obvious style.cpp refactoring making use of URIReference for this kind of reference (and not handling manually the signals in the styling code, which would probably be a good thing to do anyway)
(bzr r14245)
Diffstat (limited to 'src/sp-object.cpp')
| -rw-r--r-- | src/sp-object.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 0bb8c240f..db66eb3e6 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -721,6 +721,9 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns } this->cloned = cloned; + /* Invoke derived methods, if any */ + this->build(document, repr); + if ( !cloned ) { this->document->bindObjectToRepr(this->repr, this); @@ -754,8 +757,6 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns g_assert(this->getId() == NULL); } - /* Invoke derived methods, if any */ - this->build(document, repr); /* Signalling (should be connected AFTER processing derived methods */ sp_repr_add_listener(repr, &object_event_vector, this); |
