[gitg] Implemented simple protection of out-of-sync diff requests
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Implemented simple protection of out-of-sync diff requests
- Date: Fri, 1 Mar 2013 23:34:21 +0000 (UTC)
commit f30151d0d3d1985a53afb819d6807c216ff05f86
Author: Jesse van den Kieboom <jessevdk gnome org>
Date: Sat Mar 2 00:33:29 2013 +0100
Implemented simple protection of out-of-sync diff requests
libgitg-gtk/gitg-gtk-diff-view-request-diff.vala | 21 +++++++---
.../gitg-gtk-diff-view-request-resource.vala | 2 +
libgitg-gtk/gitg-gtk-diff-view-request.vala | 40 ++++++++++++++++++++
libgitg-gtk/gitg-gtk-diff-view.vala | 21 +++++++++-
libgitg-gtk/resources/diff-view.js | 6 +-
5 files changed, 78 insertions(+), 12 deletions(-)
---
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
b/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
index 32fcc51..4e14aa5 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
@@ -28,16 +28,23 @@ namespace GitgGtk
}
private DiffType d_diff_type;
+ private Ggit.Diff? d_diff;
+ private Ggit.Commit? d_commit;
public DiffViewRequestDiff(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
{
base(view, request, uri);
- d_mimetype = "application/json";
- var parsed = Soup.Form.decode(uri.query);
+ d_mimetype = "application/json";
d_diff_type = DiffType.DEFAULT;
- var format = parsed.lookup("format");
+ if (has_view)
+ {
+ d_commit = d_view.commit;
+ d_diff = d_view.diff;
+ }
+
+ var format = parameter("format");
switch (format)
{
@@ -281,7 +288,7 @@ namespace GitgGtk
private void build_commit(Ggit.Diff? diff, Json.Builder builder, Cancellable? cancellable)
{
builder.set_member_name("commit");
- commit_to_json(builder, d_view.commit);
+ commit_to_json(builder, d_commit);
}
private InputStream? run_diff(Ggit.Diff? diff, Cancellable? cancellable) throws GLib.Error
@@ -296,7 +303,7 @@ namespace GitgGtk
builder.begin_object();
- if (d_view.commit != null && d_diff_type != DiffType.DIFF_ONLY)
+ if (d_commit != null && d_diff_type != DiffType.DIFF_ONLY)
{
build_commit(diff, builder, cancellable);
}
@@ -331,12 +338,12 @@ namespace GitgGtk
public override InputStream? run_async(Cancellable? cancellable) throws GLib.Error
{
- if (d_view == null)
+ if (!has_view)
{
throw new IOError.NOT_FOUND("Could not find diff view with corresponding id");
}
- return run_diff(d_view.diff, cancellable);
+ return run_diff(d_diff, cancellable);
}
}
}
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
b/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
index f7a4df1..fbe3779 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
@@ -25,6 +25,8 @@ namespace GitgGtk
public DiffViewRequestResource(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
{
base(view, request, uri);
+ d_view = null;
+ d_hasView = false;
}
private File ensure_resource()
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request.vala b/libgitg-gtk/gitg-gtk-diff-view-request.vala
index e889098..acc11c7 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request.vala
@@ -25,6 +25,8 @@ namespace GitgGtk
protected string? d_mimetype;
protected int64 d_size;
protected WebKit.URISchemeRequest d_request;
+ private HashTable<string, string>? d_form;
+ protected bool d_hasView;
public DiffViewRequest(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
{
@@ -33,6 +35,44 @@ namespace GitgGtk
d_uri = uri;
d_size = -1;
d_mimetype = null;
+ d_form = null;
+ d_hasView = view != null;
+ }
+
+ public Soup.URI uri
+ {
+ get { return d_uri; }
+ }
+
+ public bool has_view
+ {
+ get { return d_hasView; }
+ }
+
+ public void finish_empty()
+ {
+ d_request.finish(new MemoryInputStream(),
+ get_content_length(),
+ get_content_type());
+ }
+
+ public string? parameter(string v)
+ {
+ if (d_form == null)
+ {
+ var q = d_uri.get_query();
+
+ if (q != null)
+ {
+ d_form = Soup.Form.decode(q);
+ }
+ else
+ {
+ d_form = new HashTable<string, string>(str_hash, str_equal);
+ }
+ }
+
+ return d_form.lookup(v);
}
public DiffView? view
diff --git a/libgitg-gtk/gitg-gtk-diff-view.vala b/libgitg-gtk/gitg-gtk-diff-view.vala
index fd553c4..b3fdcae 100644
--- a/libgitg-gtk/gitg-gtk-diff-view.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view.vala
@@ -34,6 +34,7 @@ namespace GitgGtk
private Cancellable d_cancellable;
private bool d_loaded;
+ private ulong d_diffid;
public Ggit.Diff? diff
{
@@ -150,7 +151,21 @@ namespace GitgGtk
public void request(DiffViewRequest request)
{
- request.run(d_cancellable);
+ var did = request.parameter("diffid");
+
+ if (did != null)
+ {
+ uint64 i = uint64.parse(did);
+
+ if (i == d_diffid)
+ {
+ request.run(d_cancellable);
+ return;
+ }
+ }
+
+ // Still finish request, but with something bogus
+ request.finish_empty();
}
private void update_font_settings()
@@ -256,6 +271,8 @@ namespace GitgGtk
d_cancellable.cancel();
d_cancellable = new Cancellable();
+ ++d_diffid;
+
if (d_commit != null)
{
d_diff = d_commit.get_diff(options);
@@ -263,7 +280,7 @@ namespace GitgGtk
if (d_diff != null)
{
- run_javascript.begin("update_diff();", d_cancellable, (obj, res) => {
+ run_javascript.begin("update_diff(%lu);".printf(d_diffid), d_cancellable,
(obj, res) => {
try
{
run_javascript.end(res);
diff --git a/libgitg-gtk/resources/diff-view.js b/libgitg-gtk/resources/diff-view.js
index 4822505..3624cfb 100644
--- a/libgitg-gtk/resources/diff-view.js
+++ b/libgitg-gtk/resources/diff-view.js
@@ -115,7 +115,7 @@ function write_commit(commit)
var html_builder_worker = 0;
var html_builder_tick = 0;
-function update_diff()
+function update_diff(id)
{
if (html_builder_worker)
{
@@ -169,7 +169,7 @@ function update_diff()
// Load the diff asynchronously
html_builder_worker.postMessage({
- url: "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&format=diff_only",
+ url: "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id +
"&format=diff_only",
settings: settings,
hunk_template: hunk_template,
});
@@ -187,7 +187,7 @@ function update_diff()
}
t = (new Date()).getTime();
- r.open("GET", "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&format=commit_only");
+ r.open("GET", "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id +
"&format=commit_only");
r.send();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]