[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