[Celerity-users] page cacheing
jason franklin-stokes
jasoninclass at googlemail.com
Sun Sep 13 07:20:12 EDT 2009
Dear Jari,
I have a patch for celerity so that browser.page can be serialized and
deserialized.
I also added a simple test and all other tests are passing.
From ec70deb926e85b12c25a0db5866ed0f315a9e1fe Mon Sep 17 00:00:00 2001
From: jason franklin-stokes <jason.franklin.stokes at gmail.com>
Date: Sun, 13 Sep 2009 12:46:34 +0200
Subject: [PATCH] browser page serialize
---
.gitignore | 4 +++-
lib/celerity/browser.rb | 11 +++++++++++
lib/celerity/htmlunit.rb | 1 +
lib/celerity/listener.rb | 5 +++++
spec/browser_spec.rb | 9 +++++++++
5 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/.gitignore b/.gitignore
index 241a0c2..c09e42e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,6 @@ log/**
doc
classes
.yardoc
-pkg
\ No newline at end of file
+pkg
+.diff
+.DS_Store
diff --git a/lib/celerity/browser.rb b/lib/celerity/browser.rb
index d9be7e2..b00e4df 100644
--- a/lib/celerity/browser.rb
+++ b/lib/celerity/browser.rb
@@ -83,6 +83,17 @@ module Celerity
short_inspect :exclude => %w[@webclient @browser @object
@options @listener @event_listener]
end
+ def serialize_page
+ listener.remove_listener(:web_window_event, @event_listener)
+ SerializationUtils.serialize(@page).to_a.pack("C*")
+ end
+
+ def deserialize_page(_serialized_page)
+ @page = SerializationUtils.deserialize
(_serialized_page.to_java_bytes)
+ listener.add_listener(:web_window_event, &@event_listener)
+ @page
+ end
+
#
# Goto the given URL
#
diff --git a/lib/celerity/htmlunit.rb b/lib/celerity/htmlunit.rb
index 974289b..e94b387 100644
--- a/lib/celerity/htmlunit.rb
+++ b/lib/celerity/htmlunit.rb
@@ -3,6 +3,7 @@ module Celerity
Jars.each { |jar| require(jar) }
include_class org.apache.commons.httpclient.Cookie
+ include_class org.apache.commons.lang.SerializationUtils
module JsxHelper
def method_missing(meth, *args, &blk)
diff --git a/lib/celerity/listener.rb b/lib/celerity/listener.rb
index c5ce71f..a1c30fd 100644
--- a/lib/celerity/listener.rb
+++ b/lib/celerity/listener.rb
@@ -62,6 +62,11 @@ module Celerity
else
raise TypeError, "must give proc or index"
end
+
+ case type
+ when :web_window_event
+ @webclient.removeWebWindowListener(self) if @procs
[type].length == 0
+ end
end
#
diff --git a/spec/browser_spec.rb b/spec/browser_spec.rb
index 4dc45c9..fc7cb0b 100644
--- a/spec/browser_spec.rb
+++ b/spec/browser_spec.rb
@@ -297,4 +297,13 @@ describe "Browser" do
end
end
+ describe "#serialize" do
+ it "should serialize and deserialize page" do
+ b = Browser.new
+ b.goto(WatirSpec.files + "/forms_with_input_elements.html")
+ serialized = b.serialize_page
+ b.deserialize_page(serialized).should be_a_kind_of
Java::ComGargoylesoftwareHtmlunitHtml::HtmlPage
+ end
+ end
+
end
--
1.6.4.2
On Sep 9, 2009, at 11:03 AM, Jari Bakken wrote:
> On Wed, Sep 9, 2009 at 10:45 AM, jason
> franklin-stokes<jasoninclass at googlemail.com> wrote:
>> Hi Jari,
>>
>> Brilliant - thanks - that works!!.
>>
>> However - i tried to do this while using celerity, unfortunately
>> with not
>> much success - as soon as i try to serialize browser.page it bombs
>> out with:
>>
>> "org/apache/commons/lang/SerializationUtils.java:111:in `serialize':
>> org.apache.commons.lang.SerializationException:
>> java.io.NotSerializableException:
>> org.jruby.gen.InterfaceImpl1274989706
>> (NativeException)"
>>
>> I totally don't understand why. have you got any ideas?
>>
>
> It's because we implement the WebWindowListener interface (among
> others) and add it to the web client. JRuby's interface implementation
> is not Serializable. The WebWindowListener is used to update Celerity
> about page changes, so it's quite important.
> _______________________________________________
> Celerity-users mailing list
> Celerity-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/celerity-users
More information about the Celerity-users
mailing list