Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ erl_crash.dump
.DS_Store
doc/
screenshot-*.png
.elixir_ls
8 changes: 3 additions & 5 deletions lib/hound/helpers/session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ defmodule Hound.Helpers.Session do
change_session_to(session_name)
result = apply(func, [])
change_session_to(previous_session_name)
result
result
end


Expand Down Expand Up @@ -117,9 +117,7 @@ defmodule Hound.Helpers.Session do

@doc false
def current_session_name do
Hound.SessionServer.current_session_name(self()) ||
raise "could not find a session for process #{inspect self()}"


Hound.SessionServer.current_session_name(self()) ||
raise "could not find a session for process #{inspect self()}"
end
end
66 changes: 39 additions & 27 deletions lib/hound/session_server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ defmodule Hound.SessionServer do


def session_for_pid(pid, opts) do
current_session_id(pid) ||
{:ok, current_session_id(pid)} ||
change_current_session_for_pid(pid, :default, opts)
end

Expand Down Expand Up @@ -58,34 +58,49 @@ defmodule Hound.SessionServer do
{:ok, state}
end

def handle_call({:destroy_sessions, pid}, _from, state) do
destroy_sessions(pid)
{:reply, :ok, state}
end

def handle_call({:change_session, pid, session_name, opts}, _from, state) do
{:ok, driver_info} = Hound.driver_info

{ref, sessions} =
case :ets.lookup(@name, pid) do
[{^pid, ref, _session_id, sessions}] ->
{ref, sessions}
[] ->
{Process.monitor(pid), %{}}
end

{session_id, sessions} =
case Map.fetch(sessions, session_name) do
{:ok, session_id} ->
{session_id, sessions}
:error ->
session_id = create_session(driver_info, opts)
{session_id, Map.put(sessions, session_name, session_id)}
end
{ref, sessions} = case :ets.lookup(@name, pid) do
[{^pid, ref, _session_id, sessions}] ->
{ref, sessions}
[] ->
{Process.monitor(pid), %{}}
end


case find_existing_session(sessions, session_name) do
{:ok, {session_id, sessions}} ->
add_session_to_table(pid, ref, session_id, sessions)

{:reply, {:ok, session_id}, Map.put(state, ref, pid)}

:error ->
{:ok, driver_info} = Hound.driver_info()

case create_session(driver_info, opts) do
{:error, _} = e -> {:reply, e, state}

{:ok, session_id} ->
sessions = Map.put(sessions, session_name, session_id)
add_session_to_table(pid, ref, session_id, sessions)

{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
end
end
end

defp add_session_to_table(pid, ref, session_id, sessions) do
:ets.insert(@name, {pid, ref, session_id, sessions})
{:reply, session_id, Map.put(state, ref, pid)}
end

def handle_call({:destroy_sessions, pid}, _from, state) do
destroy_sessions(pid)
{:reply, :ok, state}
defp find_existing_session(sessions, session_name) do
with {:ok, session_id} <- Map.fetch(sessions, session_name) do
{:ok, {session_id, sessions}}
end
end

def handle_info({:DOWN, ref, _, _, _}, state) do
Expand All @@ -96,10 +111,7 @@ defmodule Hound.SessionServer do
end

defp create_session(driver_info, opts) do
case Hound.Session.create_session(driver_info[:browser], opts) do
{:ok, session_id} -> session_id
{:error, reason} -> raise "could not create a new session: #{reason}, check webdriver is running"
end
Hound.Session.create_session(driver_info[:browser], opts)
end

defp destroy_sessions(pid) do
Expand Down